diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-03-28 17:27:45 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-03-28 17:27:45 -0400 |
commit | 3fab191002b184e4390aa07c7149c6cc7b638ec7 (patch) | |
tree | 821382d49e47c19531bfc3bb9e1f8922486374d4 /arch | |
parent | 93394a761d78503f11d05b1a7b23d5a9ccc8dad2 (diff) | |
parent | 7c730ccdc1188b97f5c8cb690906242c7ed75c22 (diff) |
Merge branch 'linus' into x86/core
Diffstat (limited to 'arch')
363 files changed, 19618 insertions, 4878 deletions
diff --git a/arch/alpha/include/asm/socket.h b/arch/alpha/include/asm/socket.h index a1057c2d95e7..3641ec1452f4 100644 --- a/arch/alpha/include/asm/socket.h +++ b/arch/alpha/include/asm/socket.h | |||
@@ -62,6 +62,9 @@ | |||
62 | 62 | ||
63 | #define SO_MARK 36 | 63 | #define SO_MARK 36 |
64 | 64 | ||
65 | #define SO_TIMESTAMPING 37 | ||
66 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
67 | |||
65 | /* O_NONBLOCK clashes with the bits used for socket types. Therefore we | 68 | /* O_NONBLOCK clashes with the bits used for socket types. Therefore we |
66 | * have to define SOCK_NONBLOCK to a different value here. | 69 | * have to define SOCK_NONBLOCK to a different value here. |
67 | */ | 70 | */ |
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index e4a54b615894..b45d913a51c3 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
@@ -903,8 +903,9 @@ sys_alpha_pipe: | |||
903 | stq $26, 0($sp) | 903 | stq $26, 0($sp) |
904 | .prologue 0 | 904 | .prologue 0 |
905 | 905 | ||
906 | mov $31, $17 | ||
906 | lda $16, 8($sp) | 907 | lda $16, 8($sp) |
907 | jsr $26, do_pipe | 908 | jsr $26, do_pipe_flags |
908 | 909 | ||
909 | ldq $26, 0($sp) | 910 | ldq $26, 0($sp) |
910 | bne $0, 1f | 911 | bne $0, 1f |
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 7bc7489223f3..cc7834661427 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
@@ -90,7 +90,7 @@ show_interrupts(struct seq_file *p, void *v) | |||
90 | seq_printf(p, "%10u ", kstat_irqs(irq)); | 90 | seq_printf(p, "%10u ", kstat_irqs(irq)); |
91 | #else | 91 | #else |
92 | for_each_online_cpu(j) | 92 | for_each_online_cpu(j) |
93 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]); | 93 | seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j)); |
94 | #endif | 94 | #endif |
95 | seq_printf(p, " %14s", irq_desc[irq].chip->typename); | 95 | seq_printf(p, " %14s", irq_desc[irq].chip->typename); |
96 | seq_printf(p, " %c%s", | 96 | seq_printf(p, " %c%s", |
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index e16aeb6e79ef..67c19f8a9944 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
@@ -64,7 +64,7 @@ do_entInt(unsigned long type, unsigned long vector, | |||
64 | smp_percpu_timer_interrupt(regs); | 64 | smp_percpu_timer_interrupt(regs); |
65 | cpu = smp_processor_id(); | 65 | cpu = smp_processor_id(); |
66 | if (cpu != boot_cpuid) { | 66 | if (cpu != boot_cpuid) { |
67 | kstat_cpu(cpu).irqs[RTC_IRQ]++; | 67 | kstat_incr_irqs_this_cpu(RTC_IRQ, irq_to_desc(RTC_IRQ)); |
68 | } else { | 68 | } else { |
69 | handle_irq(RTC_IRQ); | 69 | handle_irq(RTC_IRQ); |
70 | } | 70 | } |
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index ae41f097864b..42ee05981e71 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
@@ -46,8 +46,6 @@ | |||
46 | #include <asm/hwrpb.h> | 46 | #include <asm/hwrpb.h> |
47 | #include <asm/processor.h> | 47 | #include <asm/processor.h> |
48 | 48 | ||
49 | extern int do_pipe(int *); | ||
50 | |||
51 | /* | 49 | /* |
52 | * Brk needs to return an error. Still support Linux's brk(0) query idiom, | 50 | * Brk needs to return an error. Still support Linux's brk(0) query idiom, |
53 | * which OSF programs just shouldn't be doing. We're still not quite | 51 | * which OSF programs just shouldn't be doing. We're still not quite |
diff --git a/arch/arm/include/asm/socket.h b/arch/arm/include/asm/socket.h index 6817be9573a6..537de4e0ef50 100644 --- a/arch/arm/include/asm/socket.h +++ b/arch/arm/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* _ASM_SOCKET_H */ | 60 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 45eacb5a2ecd..6874c7dca75a 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
@@ -76,7 +76,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
76 | 76 | ||
77 | seq_printf(p, "%3d: ", i); | 77 | seq_printf(p, "%3d: ", i); |
78 | for_each_present_cpu(cpu) | 78 | for_each_present_cpu(cpu) |
79 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); | 79 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu)); |
80 | seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-"); | 80 | seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-"); |
81 | seq_printf(p, " %s", action->name); | 81 | seq_printf(p, " %s", action->name); |
82 | for (action = action->next; action; action = action->next) | 82 | for (action = action->next; action; action = action->next) |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index b3404b7775b3..0d2074f51a59 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -231,14 +231,17 @@ static struct platform_device kirkwood_switch_device = { | |||
231 | 231 | ||
232 | void __init kirkwood_ge00_switch_init(struct dsa_platform_data *d, int irq) | 232 | void __init kirkwood_ge00_switch_init(struct dsa_platform_data *d, int irq) |
233 | { | 233 | { |
234 | int i; | ||
235 | |||
234 | if (irq != NO_IRQ) { | 236 | if (irq != NO_IRQ) { |
235 | kirkwood_switch_resources[0].start = irq; | 237 | kirkwood_switch_resources[0].start = irq; |
236 | kirkwood_switch_resources[0].end = irq; | 238 | kirkwood_switch_resources[0].end = irq; |
237 | kirkwood_switch_device.num_resources = 1; | 239 | kirkwood_switch_device.num_resources = 1; |
238 | } | 240 | } |
239 | 241 | ||
240 | d->mii_bus = &kirkwood_ge00_shared.dev; | ||
241 | d->netdev = &kirkwood_ge00.dev; | 242 | d->netdev = &kirkwood_ge00.dev; |
243 | for (i = 0; i < d->nr_chips; i++) | ||
244 | d->chip[i].mii_bus = &kirkwood_ge00_shared.dev; | ||
242 | kirkwood_switch_device.dev.platform_data = d; | 245 | kirkwood_switch_device.dev.platform_data = d; |
243 | 246 | ||
244 | platform_device_register(&kirkwood_switch_device); | 247 | platform_device_register(&kirkwood_switch_device); |
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index 9a0e905d10cd..e1c0516c4df3 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c | |||
@@ -75,7 +75,7 @@ static struct mv643xx_eth_platform_data rd88f6281_ge00_data = { | |||
75 | .duplex = DUPLEX_FULL, | 75 | .duplex = DUPLEX_FULL, |
76 | }; | 76 | }; |
77 | 77 | ||
78 | static struct dsa_platform_data rd88f6281_switch_data = { | 78 | static struct dsa_chip_data rd88f6281_switch_chip_data = { |
79 | .port_names[0] = "lan1", | 79 | .port_names[0] = "lan1", |
80 | .port_names[1] = "lan2", | 80 | .port_names[1] = "lan2", |
81 | .port_names[2] = "lan3", | 81 | .port_names[2] = "lan3", |
@@ -83,6 +83,11 @@ static struct dsa_platform_data rd88f6281_switch_data = { | |||
83 | .port_names[5] = "cpu", | 83 | .port_names[5] = "cpu", |
84 | }; | 84 | }; |
85 | 85 | ||
86 | static struct dsa_platform_data rd88f6281_switch_plat_data = { | ||
87 | .nr_chips = 1, | ||
88 | .chip = &rd88f6281_switch_chip_data, | ||
89 | }; | ||
90 | |||
86 | static struct mv643xx_eth_platform_data rd88f6281_ge01_data = { | 91 | static struct mv643xx_eth_platform_data rd88f6281_ge01_data = { |
87 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), | 92 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), |
88 | }; | 93 | }; |
@@ -105,12 +110,12 @@ static void __init rd88f6281_init(void) | |||
105 | kirkwood_ge00_init(&rd88f6281_ge00_data); | 110 | kirkwood_ge00_init(&rd88f6281_ge00_data); |
106 | kirkwood_pcie_id(&dev, &rev); | 111 | kirkwood_pcie_id(&dev, &rev); |
107 | if (rev == MV88F6281_REV_A0) { | 112 | if (rev == MV88F6281_REV_A0) { |
108 | rd88f6281_switch_data.sw_addr = 10; | 113 | rd88f6281_switch_chip_data.sw_addr = 10; |
109 | kirkwood_ge01_init(&rd88f6281_ge01_data); | 114 | kirkwood_ge01_init(&rd88f6281_ge01_data); |
110 | } else { | 115 | } else { |
111 | rd88f6281_switch_data.port_names[4] = "wan"; | 116 | rd88f6281_switch_chip_data.port_names[4] = "wan"; |
112 | } | 117 | } |
113 | kirkwood_ge00_switch_init(&rd88f6281_switch_data, NO_IRQ); | 118 | kirkwood_ge00_switch_init(&rd88f6281_switch_plat_data, NO_IRQ); |
114 | 119 | ||
115 | kirkwood_rtc_init(); | 120 | kirkwood_rtc_init(); |
116 | kirkwood_sata_init(&rd88f6281_sata_data); | 121 | kirkwood_sata_init(&rd88f6281_sata_data); |
diff --git a/arch/arm/mach-ns9xxx/irq.c b/arch/arm/mach-ns9xxx/irq.c index 22e0eb6e9ec4..feb0e54a91de 100644 --- a/arch/arm/mach-ns9xxx/irq.c +++ b/arch/arm/mach-ns9xxx/irq.c | |||
@@ -63,7 +63,6 @@ static struct irq_chip ns9xxx_chip = { | |||
63 | #else | 63 | #else |
64 | static void handle_prio_irq(unsigned int irq, struct irq_desc *desc) | 64 | static void handle_prio_irq(unsigned int irq, struct irq_desc *desc) |
65 | { | 65 | { |
66 | unsigned int cpu = smp_processor_id(); | ||
67 | struct irqaction *action; | 66 | struct irqaction *action; |
68 | irqreturn_t action_ret; | 67 | irqreturn_t action_ret; |
69 | 68 | ||
@@ -72,7 +71,7 @@ static void handle_prio_irq(unsigned int irq, struct irq_desc *desc) | |||
72 | BUG_ON(desc->status & IRQ_INPROGRESS); | 71 | BUG_ON(desc->status & IRQ_INPROGRESS); |
73 | 72 | ||
74 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | 73 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); |
75 | kstat_cpu(cpu).irqs[irq]++; | 74 | kstat_incr_irqs_this_cpu(irq, desc); |
76 | 75 | ||
77 | action = desc->action; | 76 | action = desc->action; |
78 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) | 77 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 8a0e49d84256..68cc3efae567 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <plat/ehci-orion.h> | 31 | #include <plat/ehci-orion.h> |
32 | #include <plat/mv_xor.h> | 32 | #include <plat/mv_xor.h> |
33 | #include <plat/orion_nand.h> | 33 | #include <plat/orion_nand.h> |
34 | #include <plat/orion5x_wdt.h> | ||
34 | #include <plat/time.h> | 35 | #include <plat/time.h> |
35 | #include "common.h" | 36 | #include "common.h" |
36 | 37 | ||
@@ -219,14 +220,17 @@ static struct platform_device orion5x_switch_device = { | |||
219 | 220 | ||
220 | void __init orion5x_eth_switch_init(struct dsa_platform_data *d, int irq) | 221 | void __init orion5x_eth_switch_init(struct dsa_platform_data *d, int irq) |
221 | { | 222 | { |
223 | int i; | ||
224 | |||
222 | if (irq != NO_IRQ) { | 225 | if (irq != NO_IRQ) { |
223 | orion5x_switch_resources[0].start = irq; | 226 | orion5x_switch_resources[0].start = irq; |
224 | orion5x_switch_resources[0].end = irq; | 227 | orion5x_switch_resources[0].end = irq; |
225 | orion5x_switch_device.num_resources = 1; | 228 | orion5x_switch_device.num_resources = 1; |
226 | } | 229 | } |
227 | 230 | ||
228 | d->mii_bus = &orion5x_eth_shared.dev; | ||
229 | d->netdev = &orion5x_eth.dev; | 231 | d->netdev = &orion5x_eth.dev; |
232 | for (i = 0; i < d->nr_chips; i++) | ||
233 | d->chip[i].mii_bus = &orion5x_eth_shared.dev; | ||
230 | orion5x_switch_device.dev.platform_data = d; | 234 | orion5x_switch_device.dev.platform_data = d; |
231 | 235 | ||
232 | platform_device_register(&orion5x_switch_device); | 236 | platform_device_register(&orion5x_switch_device); |
@@ -533,6 +537,29 @@ void __init orion5x_xor_init(void) | |||
533 | 537 | ||
534 | 538 | ||
535 | /***************************************************************************** | 539 | /***************************************************************************** |
540 | * Watchdog | ||
541 | ****************************************************************************/ | ||
542 | static struct orion5x_wdt_platform_data orion5x_wdt_data = { | ||
543 | .tclk = 0, | ||
544 | }; | ||
545 | |||
546 | static struct platform_device orion5x_wdt_device = { | ||
547 | .name = "orion5x_wdt", | ||
548 | .id = -1, | ||
549 | .dev = { | ||
550 | .platform_data = &orion5x_wdt_data, | ||
551 | }, | ||
552 | .num_resources = 0, | ||
553 | }; | ||
554 | |||
555 | void __init orion5x_wdt_init(void) | ||
556 | { | ||
557 | orion5x_wdt_data.tclk = orion5x_tclk; | ||
558 | platform_device_register(&orion5x_wdt_device); | ||
559 | } | ||
560 | |||
561 | |||
562 | /***************************************************************************** | ||
536 | * Time handling | 563 | * Time handling |
537 | ****************************************************************************/ | 564 | ****************************************************************************/ |
538 | int orion5x_tclk; | 565 | int orion5x_tclk; |
@@ -631,6 +658,11 @@ void __init orion5x_init(void) | |||
631 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | 658 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); |
632 | disable_hlt(); | 659 | disable_hlt(); |
633 | } | 660 | } |
661 | |||
662 | /* | ||
663 | * Register watchdog driver | ||
664 | */ | ||
665 | orion5x_wdt_init(); | ||
634 | } | 666 | } |
635 | 667 | ||
636 | /* | 668 | /* |
diff --git a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c index 15f53235ee30..9c1ca41730ba 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c | |||
@@ -94,7 +94,7 @@ static struct mv643xx_eth_platform_data rd88f5181l_fxo_eth_data = { | |||
94 | .duplex = DUPLEX_FULL, | 94 | .duplex = DUPLEX_FULL, |
95 | }; | 95 | }; |
96 | 96 | ||
97 | static struct dsa_platform_data rd88f5181l_fxo_switch_data = { | 97 | static struct dsa_chip_data rd88f5181l_fxo_switch_chip_data = { |
98 | .port_names[0] = "lan2", | 98 | .port_names[0] = "lan2", |
99 | .port_names[1] = "lan1", | 99 | .port_names[1] = "lan1", |
100 | .port_names[2] = "wan", | 100 | .port_names[2] = "wan", |
@@ -103,6 +103,11 @@ static struct dsa_platform_data rd88f5181l_fxo_switch_data = { | |||
103 | .port_names[7] = "lan3", | 103 | .port_names[7] = "lan3", |
104 | }; | 104 | }; |
105 | 105 | ||
106 | static struct dsa_platform_data rd88f5181l_fxo_switch_plat_data = { | ||
107 | .nr_chips = 1, | ||
108 | .chip = &rd88f5181l_fxo_switch_chip_data, | ||
109 | }; | ||
110 | |||
106 | static void __init rd88f5181l_fxo_init(void) | 111 | static void __init rd88f5181l_fxo_init(void) |
107 | { | 112 | { |
108 | /* | 113 | /* |
@@ -117,7 +122,7 @@ static void __init rd88f5181l_fxo_init(void) | |||
117 | */ | 122 | */ |
118 | orion5x_ehci0_init(); | 123 | orion5x_ehci0_init(); |
119 | orion5x_eth_init(&rd88f5181l_fxo_eth_data); | 124 | orion5x_eth_init(&rd88f5181l_fxo_eth_data); |
120 | orion5x_eth_switch_init(&rd88f5181l_fxo_switch_data, NO_IRQ); | 125 | orion5x_eth_switch_init(&rd88f5181l_fxo_switch_plat_data, NO_IRQ); |
121 | orion5x_uart0_init(); | 126 | orion5x_uart0_init(); |
122 | 127 | ||
123 | orion5x_setup_dev_boot_win(RD88F5181L_FXO_NOR_BOOT_BASE, | 128 | orion5x_setup_dev_boot_win(RD88F5181L_FXO_NOR_BOOT_BASE, |
diff --git a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c index 8ad3934399d4..ee1399ff0ced 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c | |||
@@ -95,7 +95,7 @@ static struct mv643xx_eth_platform_data rd88f5181l_ge_eth_data = { | |||
95 | .duplex = DUPLEX_FULL, | 95 | .duplex = DUPLEX_FULL, |
96 | }; | 96 | }; |
97 | 97 | ||
98 | static struct dsa_platform_data rd88f5181l_ge_switch_data = { | 98 | static struct dsa_chip_data rd88f5181l_ge_switch_chip_data = { |
99 | .port_names[0] = "lan2", | 99 | .port_names[0] = "lan2", |
100 | .port_names[1] = "lan1", | 100 | .port_names[1] = "lan1", |
101 | .port_names[2] = "wan", | 101 | .port_names[2] = "wan", |
@@ -104,6 +104,11 @@ static struct dsa_platform_data rd88f5181l_ge_switch_data = { | |||
104 | .port_names[7] = "lan3", | 104 | .port_names[7] = "lan3", |
105 | }; | 105 | }; |
106 | 106 | ||
107 | static struct dsa_platform_data rd88f5181l_ge_switch_plat_data = { | ||
108 | .nr_chips = 1, | ||
109 | .chip = &rd88f5181l_ge_switch_chip_data, | ||
110 | }; | ||
111 | |||
107 | static struct i2c_board_info __initdata rd88f5181l_ge_i2c_rtc = { | 112 | static struct i2c_board_info __initdata rd88f5181l_ge_i2c_rtc = { |
108 | I2C_BOARD_INFO("ds1338", 0x68), | 113 | I2C_BOARD_INFO("ds1338", 0x68), |
109 | }; | 114 | }; |
@@ -122,7 +127,8 @@ static void __init rd88f5181l_ge_init(void) | |||
122 | */ | 127 | */ |
123 | orion5x_ehci0_init(); | 128 | orion5x_ehci0_init(); |
124 | orion5x_eth_init(&rd88f5181l_ge_eth_data); | 129 | orion5x_eth_init(&rd88f5181l_ge_eth_data); |
125 | orion5x_eth_switch_init(&rd88f5181l_ge_switch_data, gpio_to_irq(8)); | 130 | orion5x_eth_switch_init(&rd88f5181l_ge_switch_plat_data, |
131 | gpio_to_irq(8)); | ||
126 | orion5x_i2c_init(); | 132 | orion5x_i2c_init(); |
127 | orion5x_uart0_init(); | 133 | orion5x_uart0_init(); |
128 | 134 | ||
diff --git a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c index 262e25e4dace..7737cf9a8f50 100644 --- a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c | |||
@@ -35,7 +35,7 @@ static struct mv643xx_eth_platform_data rd88f6183ap_ge_eth_data = { | |||
35 | .duplex = DUPLEX_FULL, | 35 | .duplex = DUPLEX_FULL, |
36 | }; | 36 | }; |
37 | 37 | ||
38 | static struct dsa_platform_data rd88f6183ap_ge_switch_data = { | 38 | static struct dsa_chip_data rd88f6183ap_ge_switch_chip_data = { |
39 | .port_names[0] = "lan1", | 39 | .port_names[0] = "lan1", |
40 | .port_names[1] = "lan2", | 40 | .port_names[1] = "lan2", |
41 | .port_names[2] = "lan3", | 41 | .port_names[2] = "lan3", |
@@ -44,6 +44,11 @@ static struct dsa_platform_data rd88f6183ap_ge_switch_data = { | |||
44 | .port_names[5] = "cpu", | 44 | .port_names[5] = "cpu", |
45 | }; | 45 | }; |
46 | 46 | ||
47 | static struct dsa_platform_data rd88f6183ap_ge_switch_plat_data = { | ||
48 | .nr_chips = 1, | ||
49 | .chip = &rd88f6183ap_ge_switch_chip_data, | ||
50 | }; | ||
51 | |||
47 | static struct mtd_partition rd88f6183ap_ge_partitions[] = { | 52 | static struct mtd_partition rd88f6183ap_ge_partitions[] = { |
48 | { | 53 | { |
49 | .name = "kernel", | 54 | .name = "kernel", |
@@ -89,7 +94,8 @@ static void __init rd88f6183ap_ge_init(void) | |||
89 | */ | 94 | */ |
90 | orion5x_ehci0_init(); | 95 | orion5x_ehci0_init(); |
91 | orion5x_eth_init(&rd88f6183ap_ge_eth_data); | 96 | orion5x_eth_init(&rd88f6183ap_ge_eth_data); |
92 | orion5x_eth_switch_init(&rd88f6183ap_ge_switch_data, gpio_to_irq(3)); | 97 | orion5x_eth_switch_init(&rd88f6183ap_ge_switch_plat_data, |
98 | gpio_to_irq(3)); | ||
93 | spi_register_board_info(rd88f6183ap_ge_spi_slave_info, | 99 | spi_register_board_info(rd88f6183ap_ge_spi_slave_info, |
94 | ARRAY_SIZE(rd88f6183ap_ge_spi_slave_info)); | 100 | ARRAY_SIZE(rd88f6183ap_ge_spi_slave_info)); |
95 | orion5x_spi_init(); | 101 | orion5x_spi_init(); |
diff --git a/arch/arm/mach-orion5x/wrt350n-v2-setup.c b/arch/arm/mach-orion5x/wrt350n-v2-setup.c index cc8f89200865..1b4ad9d5e2eb 100644 --- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c +++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c | |||
@@ -106,7 +106,7 @@ static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = { | |||
106 | .duplex = DUPLEX_FULL, | 106 | .duplex = DUPLEX_FULL, |
107 | }; | 107 | }; |
108 | 108 | ||
109 | static struct dsa_platform_data wrt350n_v2_switch_data = { | 109 | static struct dsa_chip_data wrt350n_v2_switch_chip_data = { |
110 | .port_names[0] = "lan2", | 110 | .port_names[0] = "lan2", |
111 | .port_names[1] = "lan1", | 111 | .port_names[1] = "lan1", |
112 | .port_names[2] = "wan", | 112 | .port_names[2] = "wan", |
@@ -115,6 +115,11 @@ static struct dsa_platform_data wrt350n_v2_switch_data = { | |||
115 | .port_names[7] = "lan4", | 115 | .port_names[7] = "lan4", |
116 | }; | 116 | }; |
117 | 117 | ||
118 | static struct dsa_platform_data wrt350n_v2_switch_plat_data = { | ||
119 | .nr_chips = 1, | ||
120 | .chip = &wrt350n_v2_switch_chip_data, | ||
121 | }; | ||
122 | |||
118 | static void __init wrt350n_v2_init(void) | 123 | static void __init wrt350n_v2_init(void) |
119 | { | 124 | { |
120 | /* | 125 | /* |
@@ -129,7 +134,7 @@ static void __init wrt350n_v2_init(void) | |||
129 | */ | 134 | */ |
130 | orion5x_ehci0_init(); | 135 | orion5x_ehci0_init(); |
131 | orion5x_eth_init(&wrt350n_v2_eth_data); | 136 | orion5x_eth_init(&wrt350n_v2_eth_data); |
132 | orion5x_eth_switch_init(&wrt350n_v2_switch_data, NO_IRQ); | 137 | orion5x_eth_switch_init(&wrt350n_v2_switch_plat_data, NO_IRQ); |
133 | orion5x_uart0_init(); | 138 | orion5x_uart0_init(); |
134 | 139 | ||
135 | orion5x_setup_dev_boot_win(WRT350N_V2_NOR_BOOT_BASE, | 140 | orion5x_setup_dev_boot_win(WRT350N_V2_NOR_BOOT_BASE, |
diff --git a/arch/arm/mach-pxa/e740.c b/arch/arm/mach-pxa/e740.c index 6d48e00f4f0b..a6fff782e7a8 100644 --- a/arch/arm/mach-pxa/e740.c +++ b/arch/arm/mach-pxa/e740.c | |||
@@ -135,6 +135,11 @@ static unsigned long e740_pin_config[] __initdata = { | |||
135 | /* IrDA */ | 135 | /* IrDA */ |
136 | GPIO38_GPIO | MFP_LPM_DRIVE_HIGH, | 136 | GPIO38_GPIO | MFP_LPM_DRIVE_HIGH, |
137 | 137 | ||
138 | /* Audio power control */ | ||
139 | GPIO16_GPIO, /* AC97 codec AVDD2 supply (analogue power) */ | ||
140 | GPIO40_GPIO, /* Mic amp power */ | ||
141 | GPIO41_GPIO, /* Headphone amp power */ | ||
142 | |||
138 | /* PC Card */ | 143 | /* PC Card */ |
139 | GPIO8_GPIO, /* CD0 */ | 144 | GPIO8_GPIO, /* CD0 */ |
140 | GPIO44_GPIO, /* CD1 */ | 145 | GPIO44_GPIO, /* CD1 */ |
diff --git a/arch/arm/mach-pxa/e750.c b/arch/arm/mach-pxa/e750.c index be1ab8edb973..665066fd280e 100644 --- a/arch/arm/mach-pxa/e750.c +++ b/arch/arm/mach-pxa/e750.c | |||
@@ -133,6 +133,11 @@ static unsigned long e750_pin_config[] __initdata = { | |||
133 | /* IrDA */ | 133 | /* IrDA */ |
134 | GPIO38_GPIO | MFP_LPM_DRIVE_HIGH, | 134 | GPIO38_GPIO | MFP_LPM_DRIVE_HIGH, |
135 | 135 | ||
136 | /* Audio power control */ | ||
137 | GPIO4_GPIO, /* Headphone amp power */ | ||
138 | GPIO7_GPIO, /* Speaker amp power */ | ||
139 | GPIO37_GPIO, /* Headphone detect */ | ||
140 | |||
136 | /* PC Card */ | 141 | /* PC Card */ |
137 | GPIO8_GPIO, /* CD0 */ | 142 | GPIO8_GPIO, /* CD0 */ |
138 | GPIO44_GPIO, /* CD1 */ | 143 | GPIO44_GPIO, /* CD1 */ |
diff --git a/arch/arm/mach-pxa/h5000.c b/arch/arm/mach-pxa/h5000.c index da6e4422c0f3..295ec413d804 100644 --- a/arch/arm/mach-pxa/h5000.c +++ b/arch/arm/mach-pxa/h5000.c | |||
@@ -153,6 +153,13 @@ static unsigned long h5000_pin_config[] __initdata = { | |||
153 | GPIO23_SSP1_SCLK, | 153 | GPIO23_SSP1_SCLK, |
154 | GPIO25_SSP1_TXD, | 154 | GPIO25_SSP1_TXD, |
155 | GPIO26_SSP1_RXD, | 155 | GPIO26_SSP1_RXD, |
156 | |||
157 | /* I2S */ | ||
158 | GPIO28_I2S_BITCLK_OUT, | ||
159 | GPIO29_I2S_SDATA_IN, | ||
160 | GPIO30_I2S_SDATA_OUT, | ||
161 | GPIO31_I2S_SYNC, | ||
162 | GPIO32_I2S_SYSCLK, | ||
156 | }; | 163 | }; |
157 | 164 | ||
158 | /* | 165 | /* |
diff --git a/arch/arm/mach-pxa/include/mach/eseries-gpio.h b/arch/arm/mach-pxa/include/mach/eseries-gpio.h index efbd2aa9ecec..f3e5509820d7 100644 --- a/arch/arm/mach-pxa/include/mach/eseries-gpio.h +++ b/arch/arm/mach-pxa/include/mach/eseries-gpio.h | |||
@@ -45,6 +45,21 @@ | |||
45 | /* e7xx IrDA power control */ | 45 | /* e7xx IrDA power control */ |
46 | #define GPIO_E7XX_IR_OFF 38 | 46 | #define GPIO_E7XX_IR_OFF 38 |
47 | 47 | ||
48 | /* e740 audio control GPIOs */ | ||
49 | #define GPIO_E740_WM9705_nAVDD2 16 | ||
50 | #define GPIO_E740_MIC_ON 40 | ||
51 | #define GPIO_E740_AMP_ON 41 | ||
52 | |||
53 | /* e750 audio control GPIOs */ | ||
54 | #define GPIO_E750_HP_AMP_OFF 4 | ||
55 | #define GPIO_E750_SPK_AMP_OFF 7 | ||
56 | #define GPIO_E750_HP_DETECT 37 | ||
57 | |||
58 | /* e800 audio control GPIOs */ | ||
59 | #define GPIO_E800_HP_DETECT 81 | ||
60 | #define GPIO_E800_HP_AMP_OFF 82 | ||
61 | #define GPIO_E800_SPK_AMP_ON 83 | ||
62 | |||
48 | /* ASIC related GPIOs */ | 63 | /* ASIC related GPIOs */ |
49 | #define GPIO_ESERIES_TMIO_IRQ 5 | 64 | #define GPIO_ESERIES_TMIO_IRQ 5 |
50 | #define GPIO_ESERIES_TMIO_PCLR 19 | 65 | #define GPIO_ESERIES_TMIO_PCLR 19 |
diff --git a/arch/arm/mach-pxa/include/mach/regs-ssp.h b/arch/arm/mach-pxa/include/mach/regs-ssp.h index cf31986f6f05..018f6d65b57b 100644 --- a/arch/arm/mach-pxa/include/mach/regs-ssp.h +++ b/arch/arm/mach-pxa/include/mach/regs-ssp.h | |||
@@ -50,7 +50,7 @@ | |||
50 | #define SSCR0_TUM (1 << 23) /* Transmit FIFO underrun interrupt mask */ | 50 | #define SSCR0_TUM (1 << 23) /* Transmit FIFO underrun interrupt mask */ |
51 | #define SSCR0_FRDC (0x07000000) /* Frame rate divider control (mask) */ | 51 | #define SSCR0_FRDC (0x07000000) /* Frame rate divider control (mask) */ |
52 | #define SSCR0_SlotsPerFrm(x) (((x) - 1) << 24) /* Time slots per frame [1..8] */ | 52 | #define SSCR0_SlotsPerFrm(x) (((x) - 1) << 24) /* Time slots per frame [1..8] */ |
53 | #define SSCR0_ADC (1 << 30) /* Audio clock select */ | 53 | #define SSCR0_ACS (1 << 30) /* Audio clock select */ |
54 | #define SSCR0_MOD (1 << 31) /* Mode (normal or network) */ | 54 | #define SSCR0_MOD (1 << 31) /* Mode (normal or network) */ |
55 | #endif | 55 | #endif |
56 | 56 | ||
@@ -109,6 +109,11 @@ | |||
109 | #define SSSR_TINT (1 << 19) /* Receiver Time-out Interrupt */ | 109 | #define SSSR_TINT (1 << 19) /* Receiver Time-out Interrupt */ |
110 | #define SSSR_PINT (1 << 18) /* Peripheral Trailing Byte Interrupt */ | 110 | #define SSSR_PINT (1 << 18) /* Peripheral Trailing Byte Interrupt */ |
111 | 111 | ||
112 | #if defined(CONFIG_PXA3xx) | ||
113 | #define SSPSP_EDMYSTOP(x) ((x) << 28) /* Extended Dummy Stop */ | ||
114 | #define SSPSP_EDMYSTRT(x) ((x) << 26) /* Extended Dummy Start */ | ||
115 | #endif | ||
116 | |||
112 | #define SSPSP_FSRT (1 << 25) /* Frame Sync Relative Timing */ | 117 | #define SSPSP_FSRT (1 << 25) /* Frame Sync Relative Timing */ |
113 | #define SSPSP_DMYSTOP(x) ((x) << 23) /* Dummy Stop */ | 118 | #define SSPSP_DMYSTOP(x) ((x) << 23) /* Dummy Stop */ |
114 | #define SSPSP_SFRMWDTH(x) ((x) << 16) /* Serial Frame Width */ | 119 | #define SSPSP_SFRMWDTH(x) ((x) << 16) /* Serial Frame Width */ |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 6d447c9ce8ab..0d62d311d41a 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -105,6 +105,12 @@ static unsigned long spitz_pin_config[] __initdata = { | |||
105 | GPIO57_nIOIS16, | 105 | GPIO57_nIOIS16, |
106 | GPIO104_PSKTSEL, | 106 | GPIO104_PSKTSEL, |
107 | 107 | ||
108 | /* I2S */ | ||
109 | GPIO28_I2S_BITCLK_OUT, | ||
110 | GPIO29_I2S_SDATA_IN, | ||
111 | GPIO30_I2S_SDATA_OUT, | ||
112 | GPIO31_I2S_SYNC, | ||
113 | |||
108 | /* MMC */ | 114 | /* MMC */ |
109 | GPIO32_MMC_CLK, | 115 | GPIO32_MMC_CLK, |
110 | GPIO112_MMC_CMD, | 116 | GPIO112_MMC_CMD, |
diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index 552b4c778fdc..440c014e24b3 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <mach/regs-mem.h> | 28 | #include <mach/regs-mem.h> |
29 | #include <mach/regs-lcd.h> | 29 | #include <mach/regs-lcd.h> |
30 | #include <mach/regs-sdi.h> | 30 | #include <mach/regs-sdi.h> |
31 | #include <asm/plat-s3c24xx/regs-iis.h> | 31 | #include <plat/regs-iis.h> |
32 | #include <plat/regs-spi.h> | 32 | #include <plat/regs-spi.h> |
33 | 33 | ||
34 | static struct s3c24xx_dma_map __initdata s3c2410_dma_mappings[] = { | 34 | static struct s3c24xx_dma_map __initdata s3c2410_dma_mappings[] = { |
diff --git a/arch/arm/mach-s3c2410/usb-simtec.c b/arch/arm/mach-s3c2410/usb-simtec.c index 6078f09b7df5..8331e8d97e20 100644 --- a/arch/arm/mach-s3c2410/usb-simtec.c +++ b/arch/arm/mach-s3c2410/usb-simtec.c | |||
@@ -29,13 +29,14 @@ | |||
29 | 29 | ||
30 | #include <mach/bast-map.h> | 30 | #include <mach/bast-map.h> |
31 | #include <mach/bast-irq.h> | 31 | #include <mach/bast-irq.h> |
32 | #include <mach/usb-control.h> | ||
33 | #include <mach/regs-gpio.h> | 32 | #include <mach/regs-gpio.h> |
34 | 33 | ||
35 | #include <mach/hardware.h> | 34 | #include <mach/hardware.h> |
36 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
37 | 36 | ||
37 | #include <plat/usb-control.h> | ||
38 | #include <plat/devs.h> | 38 | #include <plat/devs.h> |
39 | |||
39 | #include "usb-simtec.h" | 40 | #include "usb-simtec.h" |
40 | 41 | ||
41 | /* control power and monitor over-current events on various Simtec | 42 | /* control power and monitor over-current events on various Simtec |
diff --git a/arch/arm/mach-s3c2412/dma.c b/arch/arm/mach-s3c2412/dma.c index 919856c9433f..9e3478506c6f 100644 --- a/arch/arm/mach-s3c2412/dma.c +++ b/arch/arm/mach-s3c2412/dma.c | |||
@@ -29,8 +29,8 @@ | |||
29 | #include <mach/regs-mem.h> | 29 | #include <mach/regs-mem.h> |
30 | #include <mach/regs-lcd.h> | 30 | #include <mach/regs-lcd.h> |
31 | #include <mach/regs-sdi.h> | 31 | #include <mach/regs-sdi.h> |
32 | #include <asm/plat-s3c24xx/regs-s3c2412-iis.h> | 32 | #include <plat/regs-s3c2412-iis.h> |
33 | #include <asm/plat-s3c24xx/regs-iis.h> | 33 | #include <plat/regs-iis.h> |
34 | #include <plat/regs-spi.h> | 34 | #include <plat/regs-spi.h> |
35 | 35 | ||
36 | #define MAP(x) { (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID } | 36 | #define MAP(x) { (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID } |
diff --git a/arch/arm/mach-s3c2440/dma.c b/arch/arm/mach-s3c2440/dma.c index 5b5ee0b8f4e0..69b6cf34df47 100644 --- a/arch/arm/mach-s3c2440/dma.c +++ b/arch/arm/mach-s3c2440/dma.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <mach/regs-mem.h> | 28 | #include <mach/regs-mem.h> |
29 | #include <mach/regs-lcd.h> | 29 | #include <mach/regs-lcd.h> |
30 | #include <mach/regs-sdi.h> | 30 | #include <mach/regs-sdi.h> |
31 | #include <asm/plat-s3c24xx/regs-iis.h> | 31 | #include <plat/regs-iis.h> |
32 | #include <plat/regs-spi.h> | 32 | #include <plat/regs-spi.h> |
33 | 33 | ||
34 | static struct s3c24xx_dma_map __initdata s3c2440_dma_mappings[] = { | 34 | static struct s3c24xx_dma_map __initdata s3c2440_dma_mappings[] = { |
diff --git a/arch/arm/mach-s3c2443/dma.c b/arch/arm/mach-s3c2443/dma.c index 2a58a4d5aa5a..8430e5829186 100644 --- a/arch/arm/mach-s3c2443/dma.c +++ b/arch/arm/mach-s3c2443/dma.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <mach/regs-mem.h> | 29 | #include <mach/regs-mem.h> |
30 | #include <mach/regs-lcd.h> | 30 | #include <mach/regs-lcd.h> |
31 | #include <mach/regs-sdi.h> | 31 | #include <mach/regs-sdi.h> |
32 | #include <asm/plat-s3c24xx/regs-iis.h> | 32 | #include <plat/regs-iis.h> |
33 | #include <plat/regs-spi.h> | 33 | #include <plat/regs-spi.h> |
34 | 34 | ||
35 | #define MAP(x) { \ | 35 | #define MAP(x) { \ |
diff --git a/arch/arm/plat-orion/include/plat/orion5x_wdt.h b/arch/arm/plat-orion/include/plat/orion5x_wdt.h new file mode 100644 index 000000000000..3c9cf6a305ef --- /dev/null +++ b/arch/arm/plat-orion/include/plat/orion5x_wdt.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-orion/include/plat/orion5x_wdt.h | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | #ifndef __PLAT_ORION5X_WDT_H | ||
10 | #define __PLAT_ORION5X_WDT_H | ||
11 | |||
12 | struct orion5x_wdt_platform_data { | ||
13 | u32 tclk; /* no <linux/clk.h> support yet */ | ||
14 | }; | ||
15 | |||
16 | |||
17 | #endif | ||
18 | |||
diff --git a/arch/arm/mach-s3c2410/include/mach/audio.h b/arch/arm/plat-s3c/include/plat/audio.h index de0e8da48bc3..de0e8da48bc3 100644 --- a/arch/arm/mach-s3c2410/include/mach/audio.h +++ b/arch/arm/plat-s3c/include/plat/audio.h | |||
diff --git a/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h b/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h new file mode 100644 index 000000000000..0fad7571030e --- /dev/null +++ b/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h | |||
@@ -0,0 +1,75 @@ | |||
1 | /* linux/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h | ||
2 | * | ||
3 | * Copyright 2007 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://armlinux.simtec.co.uk/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2412 IIS register definition | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_S3C2412_IIS_H | ||
14 | #define __ASM_ARCH_REGS_S3C2412_IIS_H | ||
15 | |||
16 | #define S3C2412_IISCON (0x00) | ||
17 | #define S3C2412_IISMOD (0x04) | ||
18 | #define S3C2412_IISFIC (0x08) | ||
19 | #define S3C2412_IISPSR (0x0C) | ||
20 | #define S3C2412_IISTXD (0x10) | ||
21 | #define S3C2412_IISRXD (0x14) | ||
22 | |||
23 | #define S3C2412_IISCON_LRINDEX (1 << 11) | ||
24 | #define S3C2412_IISCON_TXFIFO_EMPTY (1 << 10) | ||
25 | #define S3C2412_IISCON_RXFIFO_EMPTY (1 << 9) | ||
26 | #define S3C2412_IISCON_TXFIFO_FULL (1 << 8) | ||
27 | #define S3C2412_IISCON_RXFIFO_FULL (1 << 7) | ||
28 | #define S3C2412_IISCON_TXDMA_PAUSE (1 << 6) | ||
29 | #define S3C2412_IISCON_RXDMA_PAUSE (1 << 5) | ||
30 | #define S3C2412_IISCON_TXCH_PAUSE (1 << 4) | ||
31 | #define S3C2412_IISCON_RXCH_PAUSE (1 << 3) | ||
32 | #define S3C2412_IISCON_TXDMA_ACTIVE (1 << 2) | ||
33 | #define S3C2412_IISCON_RXDMA_ACTIVE (1 << 1) | ||
34 | #define S3C2412_IISCON_IIS_ACTIVE (1 << 0) | ||
35 | |||
36 | #define S3C64XX_IISMOD_IMS_PCLK (0 << 10) | ||
37 | #define S3C64XX_IISMOD_IMS_SYSMUX (1 << 10) | ||
38 | |||
39 | #define S3C2412_IISMOD_MASTER_INTERNAL (0 << 10) | ||
40 | #define S3C2412_IISMOD_MASTER_EXTERNAL (1 << 10) | ||
41 | #define S3C2412_IISMOD_SLAVE (2 << 10) | ||
42 | #define S3C2412_IISMOD_MASTER_MASK (3 << 10) | ||
43 | #define S3C2412_IISMOD_MODE_TXONLY (0 << 8) | ||
44 | #define S3C2412_IISMOD_MODE_RXONLY (1 << 8) | ||
45 | #define S3C2412_IISMOD_MODE_TXRX (2 << 8) | ||
46 | #define S3C2412_IISMOD_MODE_MASK (3 << 8) | ||
47 | #define S3C2412_IISMOD_LR_LLOW (0 << 7) | ||
48 | #define S3C2412_IISMOD_LR_RLOW (1 << 7) | ||
49 | #define S3C2412_IISMOD_SDF_IIS (0 << 5) | ||
50 | #define S3C2412_IISMOD_SDF_MSB (1 << 5) | ||
51 | #define S3C2412_IISMOD_SDF_LSB (2 << 5) | ||
52 | #define S3C2412_IISMOD_SDF_MASK (3 << 5) | ||
53 | #define S3C2412_IISMOD_RCLK_256FS (0 << 3) | ||
54 | #define S3C2412_IISMOD_RCLK_512FS (1 << 3) | ||
55 | #define S3C2412_IISMOD_RCLK_384FS (2 << 3) | ||
56 | #define S3C2412_IISMOD_RCLK_768FS (3 << 3) | ||
57 | #define S3C2412_IISMOD_RCLK_MASK (3 << 3) | ||
58 | #define S3C2412_IISMOD_BCLK_32FS (0 << 1) | ||
59 | #define S3C2412_IISMOD_BCLK_48FS (1 << 1) | ||
60 | #define S3C2412_IISMOD_BCLK_16FS (2 << 1) | ||
61 | #define S3C2412_IISMOD_BCLK_24FS (3 << 1) | ||
62 | #define S3C2412_IISMOD_BCLK_MASK (3 << 1) | ||
63 | #define S3C2412_IISMOD_8BIT (1 << 0) | ||
64 | |||
65 | #define S3C2412_IISPSR_PSREN (1 << 15) | ||
66 | |||
67 | #define S3C2412_IISFIC_TXFLUSH (1 << 15) | ||
68 | #define S3C2412_IISFIC_RXFLUSH (1 << 7) | ||
69 | #define S3C2412_IISFIC_TXCOUNT(x) (((x) >> 8) & 0xf) | ||
70 | #define S3C2412_IISFIC_RXCOUNT(x) (((x) >> 0) & 0xf) | ||
71 | |||
72 | |||
73 | |||
74 | #endif /* __ASM_ARCH_REGS_S3C2412_IIS_H */ | ||
75 | |||
diff --git a/arch/arm/mach-s3c2410/include/mach/usb-control.h b/arch/arm/plat-s3c/include/plat/usb-control.h index cd91d1591f31..822c87fe948e 100644 --- a/arch/arm/mach-s3c2410/include/mach/usb-control.h +++ b/arch/arm/plat-s3c/include/plat/usb-control.h | |||
@@ -1,9 +1,9 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/usb-control.h | 1 | /* arch/arm/plat-s3c/include/plat/usb-control.h |
2 | * | 2 | * |
3 | * Copyright (c) 2004 Simtec Electronics | 3 | * Copyright (c) 2004 Simtec Electronics |
4 | * Ben Dooks <ben@simtec.co.uk> | 4 | * Ben Dooks <ben@simtec.co.uk> |
5 | * | 5 | * |
6 | * S3C2410 - usb port information | 6 | * S3C - USB host port information |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
@@ -11,7 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #ifndef __ASM_ARCH_USBCONTROL_H | 13 | #ifndef __ASM_ARCH_USBCONTROL_H |
14 | #define __ASM_ARCH_USBCONTROL_H "arch/arm/mach-s3c2410/include/mach/usb-control.h" | 14 | #define __ASM_ARCH_USBCONTROL_H |
15 | 15 | ||
16 | #define S3C_HCDFLG_USED (1) | 16 | #define S3C_HCDFLG_USED (1) |
17 | 17 | ||
diff --git a/arch/arm/plat-s3c24xx/include/plat/regs-iis.h b/arch/arm/plat-s3c24xx/include/plat/regs-iis.h new file mode 100644 index 000000000000..a6f1d5df13b4 --- /dev/null +++ b/arch/arm/plat-s3c24xx/include/plat/regs-iis.h | |||
@@ -0,0 +1,77 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/regs-iis.h | ||
2 | * | ||
3 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
4 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * S3C2410 IIS register definition | ||
11 | */ | ||
12 | |||
13 | #ifndef __ASM_ARCH_REGS_IIS_H | ||
14 | #define __ASM_ARCH_REGS_IIS_H | ||
15 | |||
16 | #define S3C2410_IISCON (0x00) | ||
17 | |||
18 | #define S3C2410_IISCON_LRINDEX (1<<8) | ||
19 | #define S3C2410_IISCON_TXFIFORDY (1<<7) | ||
20 | #define S3C2410_IISCON_RXFIFORDY (1<<6) | ||
21 | #define S3C2410_IISCON_TXDMAEN (1<<5) | ||
22 | #define S3C2410_IISCON_RXDMAEN (1<<4) | ||
23 | #define S3C2410_IISCON_TXIDLE (1<<3) | ||
24 | #define S3C2410_IISCON_RXIDLE (1<<2) | ||
25 | #define S3C2410_IISCON_PSCEN (1<<1) | ||
26 | #define S3C2410_IISCON_IISEN (1<<0) | ||
27 | |||
28 | #define S3C2410_IISMOD (0x04) | ||
29 | |||
30 | #define S3C2440_IISMOD_MPLL (1<<9) | ||
31 | #define S3C2410_IISMOD_SLAVE (1<<8) | ||
32 | #define S3C2410_IISMOD_NOXFER (0<<6) | ||
33 | #define S3C2410_IISMOD_RXMODE (1<<6) | ||
34 | #define S3C2410_IISMOD_TXMODE (2<<6) | ||
35 | #define S3C2410_IISMOD_TXRXMODE (3<<6) | ||
36 | #define S3C2410_IISMOD_LR_LLOW (0<<5) | ||
37 | #define S3C2410_IISMOD_LR_RLOW (1<<5) | ||
38 | #define S3C2410_IISMOD_IIS (0<<4) | ||
39 | #define S3C2410_IISMOD_MSB (1<<4) | ||
40 | #define S3C2410_IISMOD_8BIT (0<<3) | ||
41 | #define S3C2410_IISMOD_16BIT (1<<3) | ||
42 | #define S3C2410_IISMOD_BITMASK (1<<3) | ||
43 | #define S3C2410_IISMOD_256FS (0<<2) | ||
44 | #define S3C2410_IISMOD_384FS (1<<2) | ||
45 | #define S3C2410_IISMOD_16FS (0<<0) | ||
46 | #define S3C2410_IISMOD_32FS (1<<0) | ||
47 | #define S3C2410_IISMOD_48FS (2<<0) | ||
48 | #define S3C2410_IISMOD_FS_MASK (3<<0) | ||
49 | |||
50 | #define S3C2410_IISPSR (0x08) | ||
51 | #define S3C2410_IISPSR_INTMASK (31<<5) | ||
52 | #define S3C2410_IISPSR_INTSHIFT (5) | ||
53 | #define S3C2410_IISPSR_EXTMASK (31<<0) | ||
54 | #define S3C2410_IISPSR_EXTSHFIT (0) | ||
55 | |||
56 | #define S3C2410_IISFCON (0x0c) | ||
57 | |||
58 | #define S3C2410_IISFCON_TXDMA (1<<15) | ||
59 | #define S3C2410_IISFCON_RXDMA (1<<14) | ||
60 | #define S3C2410_IISFCON_TXENABLE (1<<13) | ||
61 | #define S3C2410_IISFCON_RXENABLE (1<<12) | ||
62 | #define S3C2410_IISFCON_TXMASK (0x3f << 6) | ||
63 | #define S3C2410_IISFCON_TXSHIFT (6) | ||
64 | #define S3C2410_IISFCON_RXMASK (0x3f) | ||
65 | #define S3C2410_IISFCON_RXSHIFT (0) | ||
66 | |||
67 | #define S3C2400_IISFCON_TXDMA (1<<11) | ||
68 | #define S3C2400_IISFCON_RXDMA (1<<10) | ||
69 | #define S3C2400_IISFCON_TXENABLE (1<<9) | ||
70 | #define S3C2400_IISFCON_RXENABLE (1<<8) | ||
71 | #define S3C2400_IISFCON_TXMASK (0x07 << 4) | ||
72 | #define S3C2400_IISFCON_TXSHIFT (4) | ||
73 | #define S3C2400_IISFCON_RXMASK (0x07) | ||
74 | #define S3C2400_IISFCON_RXSHIFT (0) | ||
75 | |||
76 | #define S3C2410_IISFIFO (0x10) | ||
77 | #endif /* __ASM_ARCH_REGS_IIS_H */ | ||
diff --git a/arch/avr32/boards/hammerhead/flash.c b/arch/avr32/boards/hammerhead/flash.c index a98c6dd3a028..559bbcb03f9b 100644 --- a/arch/avr32/boards/hammerhead/flash.c +++ b/arch/avr32/boards/hammerhead/flash.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/mtd/physmap.h> | 15 | #include <linux/mtd/physmap.h> |
16 | #include <linux/usb/isp116x.h> | 16 | #include <linux/usb/isp116x.h> |
17 | #include <linux/dma-mapping.h> | 17 | #include <linux/dma-mapping.h> |
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
20 | 19 | ||
21 | #include <mach/portmux.h> | 20 | #include <mach/portmux.h> |
diff --git a/arch/avr32/include/asm/socket.h b/arch/avr32/include/asm/socket.h index 35863f260929..04c860619700 100644 --- a/arch/avr32/include/asm/socket.h +++ b/arch/avr32/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* __ASM_AVR32_SOCKET_H */ | 60 | #endif /* __ASM_AVR32_SOCKET_H */ |
diff --git a/arch/avr32/include/asm/uaccess.h b/arch/avr32/include/asm/uaccess.h index ed092395215e..245b2ee213c9 100644 --- a/arch/avr32/include/asm/uaccess.h +++ b/arch/avr32/include/asm/uaccess.h | |||
@@ -230,10 +230,10 @@ extern int __put_user_bad(void); | |||
230 | asm volatile( \ | 230 | asm volatile( \ |
231 | "1: ld." suffix " %1, %3 \n" \ | 231 | "1: ld." suffix " %1, %3 \n" \ |
232 | "2: \n" \ | 232 | "2: \n" \ |
233 | " .section .fixup, \"ax\" \n" \ | 233 | " .subsection 1 \n" \ |
234 | "3: mov %0, %4 \n" \ | 234 | "3: mov %0, %4 \n" \ |
235 | " rjmp 2b \n" \ | 235 | " rjmp 2b \n" \ |
236 | " .previous \n" \ | 236 | " .subsection 0 \n" \ |
237 | " .section __ex_table, \"a\" \n" \ | 237 | " .section __ex_table, \"a\" \n" \ |
238 | " .long 1b, 3b \n" \ | 238 | " .long 1b, 3b \n" \ |
239 | " .previous \n" \ | 239 | " .previous \n" \ |
@@ -295,10 +295,10 @@ extern int __put_user_bad(void); | |||
295 | asm volatile( \ | 295 | asm volatile( \ |
296 | "1: st." suffix " %1, %3 \n" \ | 296 | "1: st." suffix " %1, %3 \n" \ |
297 | "2: \n" \ | 297 | "2: \n" \ |
298 | " .section .fixup, \"ax\" \n" \ | 298 | " .subsection 1 \n" \ |
299 | "3: mov %0, %4 \n" \ | 299 | "3: mov %0, %4 \n" \ |
300 | " rjmp 2b \n" \ | 300 | " rjmp 2b \n" \ |
301 | " .previous \n" \ | 301 | " .subsection 0 \n" \ |
302 | " .section __ex_table, \"a\" \n" \ | 302 | " .section __ex_table, \"a\" \n" \ |
303 | " .long 1b, 3b \n" \ | 303 | " .long 1b, 3b \n" \ |
304 | " .previous \n" \ | 304 | " .previous \n" \ |
diff --git a/arch/avr32/kernel/entry-avr32b.S b/arch/avr32/kernel/entry-avr32b.S index 33d49377b8be..009a80155d67 100644 --- a/arch/avr32/kernel/entry-avr32b.S +++ b/arch/avr32/kernel/entry-avr32b.S | |||
@@ -150,10 +150,10 @@ page_not_present: | |||
150 | tlbmiss_restore | 150 | tlbmiss_restore |
151 | sub sp, 4 | 151 | sub sp, 4 |
152 | stmts --sp, r0-lr | 152 | stmts --sp, r0-lr |
153 | rcall save_full_context_ex | 153 | call save_full_context_ex |
154 | mfsr r12, SYSREG_ECR | 154 | mfsr r12, SYSREG_ECR |
155 | mov r11, sp | 155 | mov r11, sp |
156 | rcall do_page_fault | 156 | call do_page_fault |
157 | rjmp ret_from_exception | 157 | rjmp ret_from_exception |
158 | 158 | ||
159 | .align 2 | 159 | .align 2 |
@@ -250,7 +250,7 @@ syscall_badsys: | |||
250 | 250 | ||
251 | .global ret_from_fork | 251 | .global ret_from_fork |
252 | ret_from_fork: | 252 | ret_from_fork: |
253 | rcall schedule_tail | 253 | call schedule_tail |
254 | 254 | ||
255 | /* check for syscall tracing */ | 255 | /* check for syscall tracing */ |
256 | get_thread_info r0 | 256 | get_thread_info r0 |
@@ -261,7 +261,7 @@ ret_from_fork: | |||
261 | 261 | ||
262 | syscall_trace_enter: | 262 | syscall_trace_enter: |
263 | pushm r8-r12 | 263 | pushm r8-r12 |
264 | rcall syscall_trace | 264 | call syscall_trace |
265 | popm r8-r12 | 265 | popm r8-r12 |
266 | rjmp syscall_trace_cont | 266 | rjmp syscall_trace_cont |
267 | 267 | ||
@@ -269,14 +269,14 @@ syscall_exit_work: | |||
269 | bld r1, TIF_SYSCALL_TRACE | 269 | bld r1, TIF_SYSCALL_TRACE |
270 | brcc 1f | 270 | brcc 1f |
271 | unmask_interrupts | 271 | unmask_interrupts |
272 | rcall syscall_trace | 272 | call syscall_trace |
273 | mask_interrupts | 273 | mask_interrupts |
274 | ld.w r1, r0[TI_flags] | 274 | ld.w r1, r0[TI_flags] |
275 | 275 | ||
276 | 1: bld r1, TIF_NEED_RESCHED | 276 | 1: bld r1, TIF_NEED_RESCHED |
277 | brcc 2f | 277 | brcc 2f |
278 | unmask_interrupts | 278 | unmask_interrupts |
279 | rcall schedule | 279 | call schedule |
280 | mask_interrupts | 280 | mask_interrupts |
281 | ld.w r1, r0[TI_flags] | 281 | ld.w r1, r0[TI_flags] |
282 | rjmp 1b | 282 | rjmp 1b |
@@ -287,7 +287,7 @@ syscall_exit_work: | |||
287 | unmask_interrupts | 287 | unmask_interrupts |
288 | mov r12, sp | 288 | mov r12, sp |
289 | mov r11, r0 | 289 | mov r11, r0 |
290 | rcall do_notify_resume | 290 | call do_notify_resume |
291 | mask_interrupts | 291 | mask_interrupts |
292 | ld.w r1, r0[TI_flags] | 292 | ld.w r1, r0[TI_flags] |
293 | rjmp 1b | 293 | rjmp 1b |
@@ -394,7 +394,7 @@ handle_critical: | |||
394 | 394 | ||
395 | mfsr r12, SYSREG_ECR | 395 | mfsr r12, SYSREG_ECR |
396 | mov r11, sp | 396 | mov r11, sp |
397 | rcall do_critical_exception | 397 | call do_critical_exception |
398 | 398 | ||
399 | /* We should never get here... */ | 399 | /* We should never get here... */ |
400 | bad_return: | 400 | bad_return: |
@@ -407,18 +407,18 @@ bad_return: | |||
407 | do_bus_error_write: | 407 | do_bus_error_write: |
408 | sub sp, 4 | 408 | sub sp, 4 |
409 | stmts --sp, r0-lr | 409 | stmts --sp, r0-lr |
410 | rcall save_full_context_ex | 410 | call save_full_context_ex |
411 | mov r11, 1 | 411 | mov r11, 1 |
412 | rjmp 1f | 412 | rjmp 1f |
413 | 413 | ||
414 | do_bus_error_read: | 414 | do_bus_error_read: |
415 | sub sp, 4 | 415 | sub sp, 4 |
416 | stmts --sp, r0-lr | 416 | stmts --sp, r0-lr |
417 | rcall save_full_context_ex | 417 | call save_full_context_ex |
418 | mov r11, 0 | 418 | mov r11, 0 |
419 | 1: mfsr r12, SYSREG_BEAR | 419 | 1: mfsr r12, SYSREG_BEAR |
420 | mov r10, sp | 420 | mov r10, sp |
421 | rcall do_bus_error | 421 | call do_bus_error |
422 | rjmp ret_from_exception | 422 | rjmp ret_from_exception |
423 | 423 | ||
424 | .align 1 | 424 | .align 1 |
@@ -433,7 +433,7 @@ do_nmi_ll: | |||
433 | 1: pushm r8, r9 /* PC and SR */ | 433 | 1: pushm r8, r9 /* PC and SR */ |
434 | mfsr r12, SYSREG_ECR | 434 | mfsr r12, SYSREG_ECR |
435 | mov r11, sp | 435 | mov r11, sp |
436 | rcall do_nmi | 436 | call do_nmi |
437 | popm r8-r9 | 437 | popm r8-r9 |
438 | mtsr SYSREG_RAR_NMI, r8 | 438 | mtsr SYSREG_RAR_NMI, r8 |
439 | tst r0, r0 | 439 | tst r0, r0 |
@@ -457,29 +457,29 @@ do_nmi_ll: | |||
457 | handle_address_fault: | 457 | handle_address_fault: |
458 | sub sp, 4 | 458 | sub sp, 4 |
459 | stmts --sp, r0-lr | 459 | stmts --sp, r0-lr |
460 | rcall save_full_context_ex | 460 | call save_full_context_ex |
461 | mfsr r12, SYSREG_ECR | 461 | mfsr r12, SYSREG_ECR |
462 | mov r11, sp | 462 | mov r11, sp |
463 | rcall do_address_exception | 463 | call do_address_exception |
464 | rjmp ret_from_exception | 464 | rjmp ret_from_exception |
465 | 465 | ||
466 | handle_protection_fault: | 466 | handle_protection_fault: |
467 | sub sp, 4 | 467 | sub sp, 4 |
468 | stmts --sp, r0-lr | 468 | stmts --sp, r0-lr |
469 | rcall save_full_context_ex | 469 | call save_full_context_ex |
470 | mfsr r12, SYSREG_ECR | 470 | mfsr r12, SYSREG_ECR |
471 | mov r11, sp | 471 | mov r11, sp |
472 | rcall do_page_fault | 472 | call do_page_fault |
473 | rjmp ret_from_exception | 473 | rjmp ret_from_exception |
474 | 474 | ||
475 | .align 1 | 475 | .align 1 |
476 | do_illegal_opcode_ll: | 476 | do_illegal_opcode_ll: |
477 | sub sp, 4 | 477 | sub sp, 4 |
478 | stmts --sp, r0-lr | 478 | stmts --sp, r0-lr |
479 | rcall save_full_context_ex | 479 | call save_full_context_ex |
480 | mfsr r12, SYSREG_ECR | 480 | mfsr r12, SYSREG_ECR |
481 | mov r11, sp | 481 | mov r11, sp |
482 | rcall do_illegal_opcode | 482 | call do_illegal_opcode |
483 | rjmp ret_from_exception | 483 | rjmp ret_from_exception |
484 | 484 | ||
485 | do_dtlb_modified: | 485 | do_dtlb_modified: |
@@ -513,11 +513,11 @@ do_dtlb_modified: | |||
513 | do_fpe_ll: | 513 | do_fpe_ll: |
514 | sub sp, 4 | 514 | sub sp, 4 |
515 | stmts --sp, r0-lr | 515 | stmts --sp, r0-lr |
516 | rcall save_full_context_ex | 516 | call save_full_context_ex |
517 | unmask_interrupts | 517 | unmask_interrupts |
518 | mov r12, 26 | 518 | mov r12, 26 |
519 | mov r11, sp | 519 | mov r11, sp |
520 | rcall do_fpe | 520 | call do_fpe |
521 | rjmp ret_from_exception | 521 | rjmp ret_from_exception |
522 | 522 | ||
523 | ret_from_exception: | 523 | ret_from_exception: |
@@ -553,7 +553,7 @@ fault_resume_kernel: | |||
553 | lddsp r4, sp[REG_SR] | 553 | lddsp r4, sp[REG_SR] |
554 | bld r4, SYSREG_GM_OFFSET | 554 | bld r4, SYSREG_GM_OFFSET |
555 | brcs 1f | 555 | brcs 1f |
556 | rcall preempt_schedule_irq | 556 | call preempt_schedule_irq |
557 | 1: | 557 | 1: |
558 | #endif | 558 | #endif |
559 | 559 | ||
@@ -582,7 +582,7 @@ fault_exit_work: | |||
582 | bld r1, TIF_NEED_RESCHED | 582 | bld r1, TIF_NEED_RESCHED |
583 | brcc 1f | 583 | brcc 1f |
584 | unmask_interrupts | 584 | unmask_interrupts |
585 | rcall schedule | 585 | call schedule |
586 | mask_interrupts | 586 | mask_interrupts |
587 | ld.w r1, r0[TI_flags] | 587 | ld.w r1, r0[TI_flags] |
588 | rjmp fault_exit_work | 588 | rjmp fault_exit_work |
@@ -593,7 +593,7 @@ fault_exit_work: | |||
593 | unmask_interrupts | 593 | unmask_interrupts |
594 | mov r12, sp | 594 | mov r12, sp |
595 | mov r11, r0 | 595 | mov r11, r0 |
596 | rcall do_notify_resume | 596 | call do_notify_resume |
597 | mask_interrupts | 597 | mask_interrupts |
598 | ld.w r1, r0[TI_flags] | 598 | ld.w r1, r0[TI_flags] |
599 | rjmp fault_exit_work | 599 | rjmp fault_exit_work |
@@ -616,10 +616,10 @@ handle_debug: | |||
616 | 616 | ||
617 | .Ldebug_fixup_cont: | 617 | .Ldebug_fixup_cont: |
618 | #ifdef CONFIG_TRACE_IRQFLAGS | 618 | #ifdef CONFIG_TRACE_IRQFLAGS |
619 | rcall trace_hardirqs_off | 619 | call trace_hardirqs_off |
620 | #endif | 620 | #endif |
621 | mov r12, sp | 621 | mov r12, sp |
622 | rcall do_debug | 622 | call do_debug |
623 | mov sp, r12 | 623 | mov sp, r12 |
624 | 624 | ||
625 | lddsp r2, sp[REG_SR] | 625 | lddsp r2, sp[REG_SR] |
@@ -643,7 +643,7 @@ handle_debug: | |||
643 | mtsr SYSREG_RSR_DBG, r11 | 643 | mtsr SYSREG_RSR_DBG, r11 |
644 | mtsr SYSREG_RAR_DBG, r10 | 644 | mtsr SYSREG_RAR_DBG, r10 |
645 | #ifdef CONFIG_TRACE_IRQFLAGS | 645 | #ifdef CONFIG_TRACE_IRQFLAGS |
646 | rcall trace_hardirqs_on | 646 | call trace_hardirqs_on |
647 | 1: | 647 | 1: |
648 | #endif | 648 | #endif |
649 | ldmts sp++, r0-lr | 649 | ldmts sp++, r0-lr |
@@ -676,7 +676,7 @@ debug_resume_kernel: | |||
676 | #ifdef CONFIG_TRACE_IRQFLAGS | 676 | #ifdef CONFIG_TRACE_IRQFLAGS |
677 | bld r11, SYSREG_GM_OFFSET | 677 | bld r11, SYSREG_GM_OFFSET |
678 | brcc 1f | 678 | brcc 1f |
679 | rcall trace_hardirqs_on | 679 | call trace_hardirqs_on |
680 | 1: | 680 | 1: |
681 | #endif | 681 | #endif |
682 | mfsr r2, SYSREG_SR | 682 | mfsr r2, SYSREG_SR |
@@ -747,7 +747,7 @@ irq_level\level: | |||
747 | mov r11, sp | 747 | mov r11, sp |
748 | mov r12, \level | 748 | mov r12, \level |
749 | 749 | ||
750 | rcall do_IRQ | 750 | call do_IRQ |
751 | 751 | ||
752 | lddsp r4, sp[REG_SR] | 752 | lddsp r4, sp[REG_SR] |
753 | bfextu r4, r4, SYSREG_M0_OFFSET, 3 | 753 | bfextu r4, r4, SYSREG_M0_OFFSET, 3 |
@@ -767,7 +767,7 @@ irq_level\level: | |||
767 | 767 | ||
768 | 1: | 768 | 1: |
769 | #ifdef CONFIG_TRACE_IRQFLAGS | 769 | #ifdef CONFIG_TRACE_IRQFLAGS |
770 | rcall trace_hardirqs_on | 770 | call trace_hardirqs_on |
771 | #endif | 771 | #endif |
772 | popm r8-r9 | 772 | popm r8-r9 |
773 | mtsr rar_int\level, r8 | 773 | mtsr rar_int\level, r8 |
@@ -807,7 +807,7 @@ irq_level\level: | |||
807 | lddsp r4, sp[REG_SR] | 807 | lddsp r4, sp[REG_SR] |
808 | bld r4, SYSREG_GM_OFFSET | 808 | bld r4, SYSREG_GM_OFFSET |
809 | brcs 1b | 809 | brcs 1b |
810 | rcall preempt_schedule_irq | 810 | call preempt_schedule_irq |
811 | #endif | 811 | #endif |
812 | rjmp 1b | 812 | rjmp 1b |
813 | .endm | 813 | .endm |
diff --git a/arch/avr32/kernel/irq.c b/arch/avr32/kernel/irq.c index a8e767d836aa..9f572229d318 100644 --- a/arch/avr32/kernel/irq.c +++ b/arch/avr32/kernel/irq.c | |||
@@ -58,7 +58,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
58 | 58 | ||
59 | seq_printf(p, "%3d: ", i); | 59 | seq_printf(p, "%3d: ", i); |
60 | for_each_online_cpu(cpu) | 60 | for_each_online_cpu(cpu) |
61 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); | 61 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu)); |
62 | seq_printf(p, " %8s", irq_desc[i].chip->name ? : "-"); | 62 | seq_printf(p, " %8s", irq_desc[i].chip->name ? : "-"); |
63 | seq_printf(p, " %s", action->name); | 63 | seq_printf(p, " %s", action->name); |
64 | for (action = action->next; action; action = action->next) | 64 | for (action = action->next; action; action = action->next) |
diff --git a/arch/avr32/kernel/syscall-stubs.S b/arch/avr32/kernel/syscall-stubs.S index 673178e235f3..f7244cd02fbb 100644 --- a/arch/avr32/kernel/syscall-stubs.S +++ b/arch/avr32/kernel/syscall-stubs.S | |||
@@ -61,7 +61,7 @@ __sys_execve: | |||
61 | __sys_mmap2: | 61 | __sys_mmap2: |
62 | pushm lr | 62 | pushm lr |
63 | st.w --sp, ARG6 | 63 | st.w --sp, ARG6 |
64 | rcall sys_mmap2 | 64 | call sys_mmap2 |
65 | sub sp, -4 | 65 | sub sp, -4 |
66 | popm pc | 66 | popm pc |
67 | 67 | ||
@@ -70,7 +70,7 @@ __sys_mmap2: | |||
70 | __sys_sendto: | 70 | __sys_sendto: |
71 | pushm lr | 71 | pushm lr |
72 | st.w --sp, ARG6 | 72 | st.w --sp, ARG6 |
73 | rcall sys_sendto | 73 | call sys_sendto |
74 | sub sp, -4 | 74 | sub sp, -4 |
75 | popm pc | 75 | popm pc |
76 | 76 | ||
@@ -79,7 +79,7 @@ __sys_sendto: | |||
79 | __sys_recvfrom: | 79 | __sys_recvfrom: |
80 | pushm lr | 80 | pushm lr |
81 | st.w --sp, ARG6 | 81 | st.w --sp, ARG6 |
82 | rcall sys_recvfrom | 82 | call sys_recvfrom |
83 | sub sp, -4 | 83 | sub sp, -4 |
84 | popm pc | 84 | popm pc |
85 | 85 | ||
@@ -88,7 +88,7 @@ __sys_recvfrom: | |||
88 | __sys_pselect6: | 88 | __sys_pselect6: |
89 | pushm lr | 89 | pushm lr |
90 | st.w --sp, ARG6 | 90 | st.w --sp, ARG6 |
91 | rcall sys_pselect6 | 91 | call sys_pselect6 |
92 | sub sp, -4 | 92 | sub sp, -4 |
93 | popm pc | 93 | popm pc |
94 | 94 | ||
@@ -97,7 +97,7 @@ __sys_pselect6: | |||
97 | __sys_splice: | 97 | __sys_splice: |
98 | pushm lr | 98 | pushm lr |
99 | st.w --sp, ARG6 | 99 | st.w --sp, ARG6 |
100 | rcall sys_splice | 100 | call sys_splice |
101 | sub sp, -4 | 101 | sub sp, -4 |
102 | popm pc | 102 | popm pc |
103 | 103 | ||
@@ -106,7 +106,7 @@ __sys_splice: | |||
106 | __sys_epoll_pwait: | 106 | __sys_epoll_pwait: |
107 | pushm lr | 107 | pushm lr |
108 | st.w --sp, ARG6 | 108 | st.w --sp, ARG6 |
109 | rcall sys_epoll_pwait | 109 | call sys_epoll_pwait |
110 | sub sp, -4 | 110 | sub sp, -4 |
111 | popm pc | 111 | popm pc |
112 | 112 | ||
@@ -115,6 +115,6 @@ __sys_epoll_pwait: | |||
115 | __sys_sync_file_range: | 115 | __sys_sync_file_range: |
116 | pushm lr | 116 | pushm lr |
117 | st.w --sp, ARG6 | 117 | st.w --sp, ARG6 |
118 | rcall sys_sync_file_range | 118 | call sys_sync_file_range |
119 | sub sp, -4 | 119 | sub sp, -4 |
120 | popm pc | 120 | popm pc |
diff --git a/arch/avr32/lib/strnlen_user.S b/arch/avr32/lib/strnlen_user.S index 65ce11afa66a..e46f4724962b 100644 --- a/arch/avr32/lib/strnlen_user.S +++ b/arch/avr32/lib/strnlen_user.S | |||
@@ -48,7 +48,7 @@ adjust_length: | |||
48 | lddpc lr, _task_size | 48 | lddpc lr, _task_size |
49 | sub r11, lr, r12 | 49 | sub r11, lr, r12 |
50 | mov r9, r11 | 50 | mov r9, r11 |
51 | rcall __strnlen_user | 51 | call __strnlen_user |
52 | cp.w r12, r9 | 52 | cp.w r12, r9 |
53 | brgt 1f | 53 | brgt 1f |
54 | popm pc | 54 | popm pc |
diff --git a/arch/blackfin/include/asm/socket.h b/arch/blackfin/include/asm/socket.h index 2ca702e44d47..fac7fe9e1f8a 100644 --- a/arch/blackfin/include/asm/socket.h +++ b/arch/blackfin/include/asm/socket.h | |||
@@ -53,4 +53,7 @@ | |||
53 | 53 | ||
54 | #define SO_MARK 36 | 54 | #define SO_MARK 36 |
55 | 55 | ||
56 | #define SO_TIMESTAMPING 37 | ||
57 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
58 | |||
56 | #endif /* _ASM_SOCKET_H */ | 59 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c index 1ab5b532ec72..401bd32aa499 100644 --- a/arch/blackfin/kernel/irqchip.c +++ b/arch/blackfin/kernel/irqchip.c | |||
@@ -88,7 +88,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
88 | goto skip; | 88 | goto skip; |
89 | seq_printf(p, "%3d: ", i); | 89 | seq_printf(p, "%3d: ", i); |
90 | for_each_online_cpu(j) | 90 | for_each_online_cpu(j) |
91 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 91 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
92 | seq_printf(p, " %8s", irq_desc[i].chip->name); | 92 | seq_printf(p, " %8s", irq_desc[i].chip->name); |
93 | seq_printf(p, " %s", action->name); | 93 | seq_printf(p, " %s", action->name); |
94 | for (action = action->next; action; action = action->next) | 94 | for (action = action->next; action; action = action->next) |
diff --git a/arch/cris/include/asm/socket.h b/arch/cris/include/asm/socket.h index 9df0ca82f5de..d5cf74005408 100644 --- a/arch/cris/include/asm/socket.h +++ b/arch/cris/include/asm/socket.h | |||
@@ -56,6 +56,9 @@ | |||
56 | 56 | ||
57 | #define SO_MARK 36 | 57 | #define SO_MARK 36 |
58 | 58 | ||
59 | #define SO_TIMESTAMPING 37 | ||
60 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
61 | |||
59 | #endif /* _ASM_SOCKET_H */ | 62 | #endif /* _ASM_SOCKET_H */ |
60 | 63 | ||
61 | 64 | ||
diff --git a/arch/cris/kernel/irq.c b/arch/cris/kernel/irq.c index 2dfac8c79090..7f642fcffbfc 100644 --- a/arch/cris/kernel/irq.c +++ b/arch/cris/kernel/irq.c | |||
@@ -66,7 +66,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
66 | seq_printf(p, "%10u ", kstat_irqs(i)); | 66 | seq_printf(p, "%10u ", kstat_irqs(i)); |
67 | #else | 67 | #else |
68 | for_each_online_cpu(j) | 68 | for_each_online_cpu(j) |
69 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 69 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
70 | #endif | 70 | #endif |
71 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 71 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
72 | seq_printf(p, " %s", action->name); | 72 | seq_printf(p, " %s", action->name); |
diff --git a/arch/frv/kernel/irq.c b/arch/frv/kernel/irq.c index 73abae767fdc..af3e824b91b3 100644 --- a/arch/frv/kernel/irq.c +++ b/arch/frv/kernel/irq.c | |||
@@ -74,7 +74,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
74 | if (action) { | 74 | if (action) { |
75 | seq_printf(p, "%3d: ", i); | 75 | seq_printf(p, "%3d: ", i); |
76 | for_each_present_cpu(cpu) | 76 | for_each_present_cpu(cpu) |
77 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); | 77 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu)); |
78 | seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-"); | 78 | seq_printf(p, " %10s", irq_desc[i].chip->name ? : "-"); |
79 | seq_printf(p, " %s", action->name); | 79 | seq_printf(p, " %s", action->name); |
80 | for (action = action->next; | 80 | for (action = action->next; |
diff --git a/arch/h8300/include/asm/socket.h b/arch/h8300/include/asm/socket.h index da2520dbf254..602518a70a1a 100644 --- a/arch/h8300/include/asm/socket.h +++ b/arch/h8300/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* _ASM_SOCKET_H */ | 60 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/h8300/kernel/irq.c b/arch/h8300/kernel/irq.c index ef4f0047067d..74f8dd7b34d2 100644 --- a/arch/h8300/kernel/irq.c +++ b/arch/h8300/kernel/irq.c | |||
@@ -183,7 +183,7 @@ asmlinkage void do_IRQ(int irq) | |||
183 | #if defined(CONFIG_PROC_FS) | 183 | #if defined(CONFIG_PROC_FS) |
184 | int show_interrupts(struct seq_file *p, void *v) | 184 | int show_interrupts(struct seq_file *p, void *v) |
185 | { | 185 | { |
186 | int i = *(loff_t *) v, j; | 186 | int i = *(loff_t *) v; |
187 | struct irqaction * action; | 187 | struct irqaction * action; |
188 | unsigned long flags; | 188 | unsigned long flags; |
189 | 189 | ||
@@ -196,7 +196,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
196 | if (!action) | 196 | if (!action) |
197 | goto unlock; | 197 | goto unlock; |
198 | seq_printf(p, "%3d: ",i); | 198 | seq_printf(p, "%3d: ",i); |
199 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 199 | seq_printf(p, "%10u ", kstat_irqs(i)); |
200 | seq_printf(p, " %14s", irq_desc[i].chip->name); | 200 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
201 | seq_printf(p, "-%-8s", irq_desc[i].name); | 201 | seq_printf(p, "-%-8s", irq_desc[i].name); |
202 | seq_printf(p, " %s", action->name); | 202 | seq_printf(p, " %s", action->name); |
diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S index a46f8395e9a5..af9405cd70e5 100644 --- a/arch/ia64/ia32/ia32_entry.S +++ b/arch/ia64/ia32/ia32_entry.S | |||
@@ -240,7 +240,7 @@ ia32_syscall_table: | |||
240 | data8 sys_ni_syscall | 240 | data8 sys_ni_syscall |
241 | data8 sys_umask /* 60 */ | 241 | data8 sys_umask /* 60 */ |
242 | data8 sys_chroot | 242 | data8 sys_chroot |
243 | data8 sys_ustat | 243 | data8 compat_sys_ustat |
244 | data8 sys_dup2 | 244 | data8 sys_dup2 |
245 | data8 sys_getppid | 245 | data8 sys_getppid |
246 | data8 sys_getpgrp /* 65 */ | 246 | data8 sys_getpgrp /* 65 */ |
diff --git a/arch/ia64/include/asm/kvm.h b/arch/ia64/include/asm/kvm.h index 2b0a38e84705..18a7e49abbc5 100644 --- a/arch/ia64/include/asm/kvm.h +++ b/arch/ia64/include/asm/kvm.h | |||
@@ -165,7 +165,40 @@ struct saved_vpd { | |||
165 | unsigned long vcpuid[5]; | 165 | unsigned long vcpuid[5]; |
166 | unsigned long vpsr; | 166 | unsigned long vpsr; |
167 | unsigned long vpr; | 167 | unsigned long vpr; |
168 | unsigned long vcr[128]; | 168 | union { |
169 | unsigned long vcr[128]; | ||
170 | struct { | ||
171 | unsigned long dcr; | ||
172 | unsigned long itm; | ||
173 | unsigned long iva; | ||
174 | unsigned long rsv1[5]; | ||
175 | unsigned long pta; | ||
176 | unsigned long rsv2[7]; | ||
177 | unsigned long ipsr; | ||
178 | unsigned long isr; | ||
179 | unsigned long rsv3; | ||
180 | unsigned long iip; | ||
181 | unsigned long ifa; | ||
182 | unsigned long itir; | ||
183 | unsigned long iipa; | ||
184 | unsigned long ifs; | ||
185 | unsigned long iim; | ||
186 | unsigned long iha; | ||
187 | unsigned long rsv4[38]; | ||
188 | unsigned long lid; | ||
189 | unsigned long ivr; | ||
190 | unsigned long tpr; | ||
191 | unsigned long eoi; | ||
192 | unsigned long irr[4]; | ||
193 | unsigned long itv; | ||
194 | unsigned long pmv; | ||
195 | unsigned long cmcv; | ||
196 | unsigned long rsv5[5]; | ||
197 | unsigned long lrr0; | ||
198 | unsigned long lrr1; | ||
199 | unsigned long rsv6[46]; | ||
200 | }; | ||
201 | }; | ||
169 | }; | 202 | }; |
170 | 203 | ||
171 | struct kvm_regs { | 204 | struct kvm_regs { |
@@ -213,4 +246,18 @@ struct kvm_sregs { | |||
213 | struct kvm_fpu { | 246 | struct kvm_fpu { |
214 | }; | 247 | }; |
215 | 248 | ||
249 | #define KVM_IA64_VCPU_STACK_SHIFT 16 | ||
250 | #define KVM_IA64_VCPU_STACK_SIZE (1UL << KVM_IA64_VCPU_STACK_SHIFT) | ||
251 | |||
252 | struct kvm_ia64_vcpu_stack { | ||
253 | unsigned char stack[KVM_IA64_VCPU_STACK_SIZE]; | ||
254 | }; | ||
255 | |||
256 | struct kvm_debug_exit_arch { | ||
257 | }; | ||
258 | |||
259 | /* for KVM_SET_GUEST_DEBUG */ | ||
260 | struct kvm_guest_debug_arch { | ||
261 | }; | ||
262 | |||
216 | #endif | 263 | #endif |
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h index 348663661659..4542651e6acb 100644 --- a/arch/ia64/include/asm/kvm_host.h +++ b/arch/ia64/include/asm/kvm_host.h | |||
@@ -112,7 +112,11 @@ | |||
112 | #define VCPU_STRUCT_SHIFT 16 | 112 | #define VCPU_STRUCT_SHIFT 16 |
113 | #define VCPU_STRUCT_SIZE (__IA64_UL_CONST(1) << VCPU_STRUCT_SHIFT) | 113 | #define VCPU_STRUCT_SIZE (__IA64_UL_CONST(1) << VCPU_STRUCT_SHIFT) |
114 | 114 | ||
115 | #define KVM_STK_OFFSET VCPU_STRUCT_SIZE | 115 | /* |
116 | * This must match KVM_IA64_VCPU_STACK_{SHIFT,SIZE} arch/ia64/include/asm/kvm.h | ||
117 | */ | ||
118 | #define KVM_STK_SHIFT 16 | ||
119 | #define KVM_STK_OFFSET (__IA64_UL_CONST(1)<< KVM_STK_SHIFT) | ||
116 | 120 | ||
117 | #define KVM_VM_STRUCT_SHIFT 19 | 121 | #define KVM_VM_STRUCT_SHIFT 19 |
118 | #define KVM_VM_STRUCT_SIZE (__IA64_UL_CONST(1) << KVM_VM_STRUCT_SHIFT) | 122 | #define KVM_VM_STRUCT_SIZE (__IA64_UL_CONST(1) << KVM_VM_STRUCT_SHIFT) |
@@ -153,10 +157,10 @@ struct kvm_vm_data { | |||
153 | struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS]; | 157 | struct kvm_vcpu_data vcpu_data[KVM_MAX_VCPUS]; |
154 | }; | 158 | }; |
155 | 159 | ||
156 | #define VCPU_BASE(n) KVM_VM_DATA_BASE + \ | 160 | #define VCPU_BASE(n) (KVM_VM_DATA_BASE + \ |
157 | offsetof(struct kvm_vm_data, vcpu_data[n]) | 161 | offsetof(struct kvm_vm_data, vcpu_data[n])) |
158 | #define VM_BASE KVM_VM_DATA_BASE + \ | 162 | #define KVM_VM_BASE (KVM_VM_DATA_BASE + \ |
159 | offsetof(struct kvm_vm_data, kvm_vm_struct) | 163 | offsetof(struct kvm_vm_data, kvm_vm_struct)) |
160 | #define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \ | 164 | #define KVM_MEM_DIRTY_LOG_BASE KVM_VM_DATA_BASE + \ |
161 | offsetof(struct kvm_vm_data, kvm_mem_dirty_log) | 165 | offsetof(struct kvm_vm_data, kvm_mem_dirty_log) |
162 | 166 | ||
@@ -235,8 +239,6 @@ struct kvm_vm_data { | |||
235 | 239 | ||
236 | struct kvm; | 240 | struct kvm; |
237 | struct kvm_vcpu; | 241 | struct kvm_vcpu; |
238 | struct kvm_guest_debug{ | ||
239 | }; | ||
240 | 242 | ||
241 | struct kvm_mmio_req { | 243 | struct kvm_mmio_req { |
242 | uint64_t addr; /* physical address */ | 244 | uint64_t addr; /* physical address */ |
@@ -462,6 +464,8 @@ struct kvm_arch { | |||
462 | unsigned long metaphysical_rr4; | 464 | unsigned long metaphysical_rr4; |
463 | unsigned long vmm_init_rr; | 465 | unsigned long vmm_init_rr; |
464 | 466 | ||
467 | int online_vcpus; | ||
468 | |||
465 | struct kvm_ioapic *vioapic; | 469 | struct kvm_ioapic *vioapic; |
466 | struct kvm_vm_stat stat; | 470 | struct kvm_vm_stat stat; |
467 | struct kvm_sal_data rdv_sal_data; | 471 | struct kvm_sal_data rdv_sal_data; |
diff --git a/arch/ia64/include/asm/msidef.h b/arch/ia64/include/asm/msidef.h new file mode 100644 index 000000000000..592c1047a0c5 --- /dev/null +++ b/arch/ia64/include/asm/msidef.h | |||
@@ -0,0 +1,42 @@ | |||
1 | #ifndef _IA64_MSI_DEF_H | ||
2 | #define _IA64_MSI_DEF_H | ||
3 | |||
4 | /* | ||
5 | * Shifts for APIC-based data | ||
6 | */ | ||
7 | |||
8 | #define MSI_DATA_VECTOR_SHIFT 0 | ||
9 | #define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) | ||
10 | #define MSI_DATA_VECTOR_MASK 0xffffff00 | ||
11 | |||
12 | #define MSI_DATA_DELIVERY_MODE_SHIFT 8 | ||
13 | #define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_MODE_SHIFT) | ||
14 | #define MSI_DATA_DELIVERY_LOWPRI (1 << MSI_DATA_DELIVERY_MODE_SHIFT) | ||
15 | |||
16 | #define MSI_DATA_LEVEL_SHIFT 14 | ||
17 | #define MSI_DATA_LEVEL_DEASSERT (0 << MSI_DATA_LEVEL_SHIFT) | ||
18 | #define MSI_DATA_LEVEL_ASSERT (1 << MSI_DATA_LEVEL_SHIFT) | ||
19 | |||
20 | #define MSI_DATA_TRIGGER_SHIFT 15 | ||
21 | #define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT) | ||
22 | #define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT) | ||
23 | |||
24 | /* | ||
25 | * Shift/mask fields for APIC-based bus address | ||
26 | */ | ||
27 | |||
28 | #define MSI_ADDR_DEST_ID_SHIFT 4 | ||
29 | #define MSI_ADDR_HEADER 0xfee00000 | ||
30 | |||
31 | #define MSI_ADDR_DEST_ID_MASK 0xfff0000f | ||
32 | #define MSI_ADDR_DEST_ID_CPU(cpu) ((cpu) << MSI_ADDR_DEST_ID_SHIFT) | ||
33 | |||
34 | #define MSI_ADDR_DEST_MODE_SHIFT 2 | ||
35 | #define MSI_ADDR_DEST_MODE_PHYS (0 << MSI_ADDR_DEST_MODE_SHIFT) | ||
36 | #define MSI_ADDR_DEST_MODE_LOGIC (1 << MSI_ADDR_DEST_MODE_SHIFT) | ||
37 | |||
38 | #define MSI_ADDR_REDIRECTION_SHIFT 3 | ||
39 | #define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT) | ||
40 | #define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) | ||
41 | |||
42 | #endif/* _IA64_MSI_DEF_H */ | ||
diff --git a/arch/ia64/include/asm/socket.h b/arch/ia64/include/asm/socket.h index d5ef0aa3e312..745421225ec6 100644 --- a/arch/ia64/include/asm/socket.h +++ b/arch/ia64/include/asm/socket.h | |||
@@ -63,4 +63,7 @@ | |||
63 | 63 | ||
64 | #define SO_MARK 36 | 64 | #define SO_MARK 36 |
65 | 65 | ||
66 | #define SO_TIMESTAMPING 37 | ||
67 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
68 | |||
66 | #endif /* _ASM_IA64_SOCKET_H */ | 69 | #endif /* _ASM_IA64_SOCKET_H */ |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 226233a6fa19..7429752ef5ad 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
@@ -80,7 +80,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
80 | seq_printf(p, "%10u ", kstat_irqs(i)); | 80 | seq_printf(p, "%10u ", kstat_irqs(i)); |
81 | #else | 81 | #else |
82 | for_each_online_cpu(j) { | 82 | for_each_online_cpu(j) { |
83 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 83 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
84 | } | 84 | } |
85 | #endif | 85 | #endif |
86 | seq_printf(p, " %14s", irq_desc[i].chip->name); | 86 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 927ad027820c..acc4d19ae62a 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -493,16 +493,15 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); | 493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); |
494 | ia64_srlz_d(); | 494 | ia64_srlz_d(); |
495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
496 | struct irq_desc *desc = irq_to_desc(vector); | 496 | int irq = local_vector_to_irq(vector); |
497 | struct irq_desc *desc = irq_to_desc(irq); | ||
497 | 498 | ||
498 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 499 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
499 | smp_local_flush_tlb(); | 500 | smp_local_flush_tlb(); |
500 | kstat_incr_irqs_this_cpu(vector, desc); | 501 | kstat_incr_irqs_this_cpu(irq, desc); |
501 | } else if (unlikely(IS_RESCHEDULE(vector))) | 502 | } else if (unlikely(IS_RESCHEDULE(vector))) { |
502 | kstat_incr_irqs_this_cpu(vector, desc); | 503 | kstat_incr_irqs_this_cpu(irq, desc); |
503 | else { | 504 | } else { |
504 | int irq = local_vector_to_irq(vector); | ||
505 | |||
506 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 505 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
507 | ia64_srlz_d(); | 506 | ia64_srlz_d(); |
508 | 507 | ||
@@ -545,24 +544,24 @@ void ia64_process_pending_intr(void) | |||
545 | 544 | ||
546 | vector = ia64_get_ivr(); | 545 | vector = ia64_get_ivr(); |
547 | 546 | ||
548 | irq_enter(); | 547 | irq_enter(); |
549 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); | 548 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); |
550 | ia64_srlz_d(); | 549 | ia64_srlz_d(); |
551 | 550 | ||
552 | /* | 551 | /* |
553 | * Perform normal interrupt style processing | 552 | * Perform normal interrupt style processing |
554 | */ | 553 | */ |
555 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 554 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
556 | struct irq_desc *desc = irq_to_desc(vector); | 555 | int irq = local_vector_to_irq(vector); |
556 | struct irq_desc *desc = irq_to_desc(irq); | ||
557 | 557 | ||
558 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 558 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
559 | smp_local_flush_tlb(); | 559 | smp_local_flush_tlb(); |
560 | kstat_incr_irqs_this_cpu(vector, desc); | 560 | kstat_incr_irqs_this_cpu(irq, desc); |
561 | } else if (unlikely(IS_RESCHEDULE(vector))) | 561 | } else if (unlikely(IS_RESCHEDULE(vector))) { |
562 | kstat_incr_irqs_this_cpu(vector, desc); | 562 | kstat_incr_irqs_this_cpu(irq, desc); |
563 | else { | 563 | } else { |
564 | struct pt_regs *old_regs = set_irq_regs(NULL); | 564 | struct pt_regs *old_regs = set_irq_regs(NULL); |
565 | int irq = local_vector_to_irq(vector); | ||
566 | 565 | ||
567 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 566 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
568 | ia64_srlz_d(); | 567 | ia64_srlz_d(); |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index dcb6b7c51ea7..2b15e233f7fe 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -7,44 +7,7 @@ | |||
7 | #include <linux/msi.h> | 7 | #include <linux/msi.h> |
8 | #include <linux/dmar.h> | 8 | #include <linux/dmar.h> |
9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
10 | 10 | #include <asm/msidef.h> | |
11 | /* | ||
12 | * Shifts for APIC-based data | ||
13 | */ | ||
14 | |||
15 | #define MSI_DATA_VECTOR_SHIFT 0 | ||
16 | #define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) | ||
17 | #define MSI_DATA_VECTOR_MASK 0xffffff00 | ||
18 | |||
19 | #define MSI_DATA_DELIVERY_SHIFT 8 | ||
20 | #define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT) | ||
21 | #define MSI_DATA_DELIVERY_LOWPRI (1 << MSI_DATA_DELIVERY_SHIFT) | ||
22 | |||
23 | #define MSI_DATA_LEVEL_SHIFT 14 | ||
24 | #define MSI_DATA_LEVEL_DEASSERT (0 << MSI_DATA_LEVEL_SHIFT) | ||
25 | #define MSI_DATA_LEVEL_ASSERT (1 << MSI_DATA_LEVEL_SHIFT) | ||
26 | |||
27 | #define MSI_DATA_TRIGGER_SHIFT 15 | ||
28 | #define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT) | ||
29 | #define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT) | ||
30 | |||
31 | /* | ||
32 | * Shift/mask fields for APIC-based bus address | ||
33 | */ | ||
34 | |||
35 | #define MSI_TARGET_CPU_SHIFT 4 | ||
36 | #define MSI_ADDR_HEADER 0xfee00000 | ||
37 | |||
38 | #define MSI_ADDR_DESTID_MASK 0xfff0000f | ||
39 | #define MSI_ADDR_DESTID_CPU(cpu) ((cpu) << MSI_TARGET_CPU_SHIFT) | ||
40 | |||
41 | #define MSI_ADDR_DESTMODE_SHIFT 2 | ||
42 | #define MSI_ADDR_DESTMODE_PHYS (0 << MSI_ADDR_DESTMODE_SHIFT) | ||
43 | #define MSI_ADDR_DESTMODE_LOGIC (1 << MSI_ADDR_DESTMODE_SHIFT) | ||
44 | |||
45 | #define MSI_ADDR_REDIRECTION_SHIFT 3 | ||
46 | #define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT) | ||
47 | #define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) | ||
48 | 11 | ||
49 | static struct irq_chip ia64_msi_chip; | 12 | static struct irq_chip ia64_msi_chip; |
50 | 13 | ||
@@ -65,8 +28,8 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
65 | read_msi_msg(irq, &msg); | 28 | read_msi_msg(irq, &msg); |
66 | 29 | ||
67 | addr = msg.address_lo; | 30 | addr = msg.address_lo; |
68 | addr &= MSI_ADDR_DESTID_MASK; | 31 | addr &= MSI_ADDR_DEST_ID_MASK; |
69 | addr |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 32 | addr |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu)); |
70 | msg.address_lo = addr; | 33 | msg.address_lo = addr; |
71 | 34 | ||
72 | data = msg.data; | 35 | data = msg.data; |
@@ -98,9 +61,9 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc) | |||
98 | msg.address_hi = 0; | 61 | msg.address_hi = 0; |
99 | msg.address_lo = | 62 | msg.address_lo = |
100 | MSI_ADDR_HEADER | | 63 | MSI_ADDR_HEADER | |
101 | MSI_ADDR_DESTMODE_PHYS | | 64 | MSI_ADDR_DEST_MODE_PHYS | |
102 | MSI_ADDR_REDIRECTION_CPU | | 65 | MSI_ADDR_REDIRECTION_CPU | |
103 | MSI_ADDR_DESTID_CPU(dest_phys_id); | 66 | MSI_ADDR_DEST_ID_CPU(dest_phys_id); |
104 | 67 | ||
105 | msg.data = | 68 | msg.data = |
106 | MSI_DATA_TRIGGER_EDGE | | 69 | MSI_DATA_TRIGGER_EDGE | |
@@ -183,8 +146,8 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
183 | 146 | ||
184 | msg.data &= ~MSI_DATA_VECTOR_MASK; | 147 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
185 | msg.data |= MSI_DATA_VECTOR(cfg->vector); | 148 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
186 | msg.address_lo &= ~MSI_ADDR_DESTID_MASK; | 149 | msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK; |
187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 150 | msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu)); |
188 | 151 | ||
189 | dmar_msi_write(irq, &msg); | 152 | dmar_msi_write(irq, &msg); |
190 | cpumask_copy(irq_desc[irq].affinity, mask); | 153 | cpumask_copy(irq_desc[irq].affinity, mask); |
@@ -215,9 +178,9 @@ msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg) | |||
215 | msg->address_hi = 0; | 178 | msg->address_hi = 0; |
216 | msg->address_lo = | 179 | msg->address_lo = |
217 | MSI_ADDR_HEADER | | 180 | MSI_ADDR_HEADER | |
218 | MSI_ADDR_DESTMODE_PHYS | | 181 | MSI_ADDR_DEST_MODE_PHYS | |
219 | MSI_ADDR_REDIRECTION_CPU | | 182 | MSI_ADDR_REDIRECTION_CPU | |
220 | MSI_ADDR_DESTID_CPU(dest); | 183 | MSI_ADDR_DEST_ID_CPU(dest); |
221 | 184 | ||
222 | msg->data = | 185 | msg->data = |
223 | MSI_DATA_TRIGGER_EDGE | | 186 | MSI_DATA_TRIGGER_EDGE | |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 0e499757309b..5c0f408cfd71 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -2196,7 +2196,7 @@ pfmfs_delete_dentry(struct dentry *dentry) | |||
2196 | return 1; | 2196 | return 1; |
2197 | } | 2197 | } |
2198 | 2198 | ||
2199 | static struct dentry_operations pfmfs_dentry_operations = { | 2199 | static const struct dentry_operations pfmfs_dentry_operations = { |
2200 | .d_delete = pfmfs_delete_dentry, | 2200 | .d_delete = pfmfs_delete_dentry, |
2201 | }; | 2201 | }; |
2202 | 2202 | ||
diff --git a/arch/ia64/kvm/Kconfig b/arch/ia64/kvm/Kconfig index f833a0b4188d..0a2d6b86075a 100644 --- a/arch/ia64/kvm/Kconfig +++ b/arch/ia64/kvm/Kconfig | |||
@@ -4,6 +4,10 @@ | |||
4 | config HAVE_KVM | 4 | config HAVE_KVM |
5 | bool | 5 | bool |
6 | 6 | ||
7 | config HAVE_KVM_IRQCHIP | ||
8 | bool | ||
9 | default y | ||
10 | |||
7 | menuconfig VIRTUALIZATION | 11 | menuconfig VIRTUALIZATION |
8 | bool "Virtualization" | 12 | bool "Virtualization" |
9 | depends on HAVE_KVM || IA64 | 13 | depends on HAVE_KVM || IA64 |
diff --git a/arch/ia64/kvm/irq.h b/arch/ia64/kvm/irq.h index c6786e8b1bf4..c0785a728271 100644 --- a/arch/ia64/kvm/irq.h +++ b/arch/ia64/kvm/irq.h | |||
@@ -23,6 +23,8 @@ | |||
23 | #ifndef __IRQ_H | 23 | #ifndef __IRQ_H |
24 | #define __IRQ_H | 24 | #define __IRQ_H |
25 | 25 | ||
26 | #include "lapic.h" | ||
27 | |||
26 | static inline int irqchip_in_kernel(struct kvm *kvm) | 28 | static inline int irqchip_in_kernel(struct kvm *kvm) |
27 | { | 29 | { |
28 | return 1; | 30 | return 1; |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index 28f982045f29..076b00d1dbff 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -182,7 +182,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
182 | switch (ext) { | 182 | switch (ext) { |
183 | case KVM_CAP_IRQCHIP: | 183 | case KVM_CAP_IRQCHIP: |
184 | case KVM_CAP_MP_STATE: | 184 | case KVM_CAP_MP_STATE: |
185 | 185 | case KVM_CAP_IRQ_INJECT_STATUS: | |
186 | r = 1; | 186 | r = 1; |
187 | break; | 187 | break; |
188 | case KVM_CAP_COALESCED_MMIO: | 188 | case KVM_CAP_COALESCED_MMIO: |
@@ -314,7 +314,7 @@ static struct kvm_vcpu *lid_to_vcpu(struct kvm *kvm, unsigned long id, | |||
314 | union ia64_lid lid; | 314 | union ia64_lid lid; |
315 | int i; | 315 | int i; |
316 | 316 | ||
317 | for (i = 0; i < KVM_MAX_VCPUS; i++) { | 317 | for (i = 0; i < kvm->arch.online_vcpus; i++) { |
318 | if (kvm->vcpus[i]) { | 318 | if (kvm->vcpus[i]) { |
319 | lid.val = VCPU_LID(kvm->vcpus[i]); | 319 | lid.val = VCPU_LID(kvm->vcpus[i]); |
320 | if (lid.id == id && lid.eid == eid) | 320 | if (lid.id == id && lid.eid == eid) |
@@ -388,7 +388,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
388 | 388 | ||
389 | call_data.ptc_g_data = p->u.ptc_g_data; | 389 | call_data.ptc_g_data = p->u.ptc_g_data; |
390 | 390 | ||
391 | for (i = 0; i < KVM_MAX_VCPUS; i++) { | 391 | for (i = 0; i < kvm->arch.online_vcpus; i++) { |
392 | if (!kvm->vcpus[i] || kvm->vcpus[i]->arch.mp_state == | 392 | if (!kvm->vcpus[i] || kvm->vcpus[i]->arch.mp_state == |
393 | KVM_MP_STATE_UNINITIALIZED || | 393 | KVM_MP_STATE_UNINITIALIZED || |
394 | vcpu == kvm->vcpus[i]) | 394 | vcpu == kvm->vcpus[i]) |
@@ -788,6 +788,8 @@ struct kvm *kvm_arch_create_vm(void) | |||
788 | return ERR_PTR(-ENOMEM); | 788 | return ERR_PTR(-ENOMEM); |
789 | kvm_init_vm(kvm); | 789 | kvm_init_vm(kvm); |
790 | 790 | ||
791 | kvm->arch.online_vcpus = 0; | ||
792 | |||
791 | return kvm; | 793 | return kvm; |
792 | 794 | ||
793 | } | 795 | } |
@@ -919,7 +921,13 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
919 | r = kvm_ioapic_init(kvm); | 921 | r = kvm_ioapic_init(kvm); |
920 | if (r) | 922 | if (r) |
921 | goto out; | 923 | goto out; |
924 | r = kvm_setup_default_irq_routing(kvm); | ||
925 | if (r) { | ||
926 | kfree(kvm->arch.vioapic); | ||
927 | goto out; | ||
928 | } | ||
922 | break; | 929 | break; |
930 | case KVM_IRQ_LINE_STATUS: | ||
923 | case KVM_IRQ_LINE: { | 931 | case KVM_IRQ_LINE: { |
924 | struct kvm_irq_level irq_event; | 932 | struct kvm_irq_level irq_event; |
925 | 933 | ||
@@ -927,10 +935,17 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
927 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) | 935 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) |
928 | goto out; | 936 | goto out; |
929 | if (irqchip_in_kernel(kvm)) { | 937 | if (irqchip_in_kernel(kvm)) { |
938 | __s32 status; | ||
930 | mutex_lock(&kvm->lock); | 939 | mutex_lock(&kvm->lock); |
931 | kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, | 940 | status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, |
932 | irq_event.irq, irq_event.level); | 941 | irq_event.irq, irq_event.level); |
933 | mutex_unlock(&kvm->lock); | 942 | mutex_unlock(&kvm->lock); |
943 | if (ioctl == KVM_IRQ_LINE_STATUS) { | ||
944 | irq_event.status = status; | ||
945 | if (copy_to_user(argp, &irq_event, | ||
946 | sizeof irq_event)) | ||
947 | goto out; | ||
948 | } | ||
934 | r = 0; | 949 | r = 0; |
935 | } | 950 | } |
936 | break; | 951 | break; |
@@ -1149,7 +1164,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | |||
1149 | 1164 | ||
1150 | /*Initialize itc offset for vcpus*/ | 1165 | /*Initialize itc offset for vcpus*/ |
1151 | itc_offset = 0UL - ia64_getreg(_IA64_REG_AR_ITC); | 1166 | itc_offset = 0UL - ia64_getreg(_IA64_REG_AR_ITC); |
1152 | for (i = 0; i < KVM_MAX_VCPUS; i++) { | 1167 | for (i = 0; i < kvm->arch.online_vcpus; i++) { |
1153 | v = (struct kvm_vcpu *)((char *)vcpu + | 1168 | v = (struct kvm_vcpu *)((char *)vcpu + |
1154 | sizeof(struct kvm_vcpu_data) * i); | 1169 | sizeof(struct kvm_vcpu_data) * i); |
1155 | v->arch.itc_offset = itc_offset; | 1170 | v->arch.itc_offset = itc_offset; |
@@ -1283,6 +1298,8 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, | |||
1283 | goto fail; | 1298 | goto fail; |
1284 | } | 1299 | } |
1285 | 1300 | ||
1301 | kvm->arch.online_vcpus++; | ||
1302 | |||
1286 | return vcpu; | 1303 | return vcpu; |
1287 | fail: | 1304 | fail: |
1288 | return ERR_PTR(r); | 1305 | return ERR_PTR(r); |
@@ -1303,8 +1320,8 @@ int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) | |||
1303 | return -EINVAL; | 1320 | return -EINVAL; |
1304 | } | 1321 | } |
1305 | 1322 | ||
1306 | int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, | 1323 | int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, |
1307 | struct kvm_debug_guest *dbg) | 1324 | struct kvm_guest_debug *dbg) |
1308 | { | 1325 | { |
1309 | return -EINVAL; | 1326 | return -EINVAL; |
1310 | } | 1327 | } |
@@ -1421,6 +1438,23 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
1421 | return 0; | 1438 | return 0; |
1422 | } | 1439 | } |
1423 | 1440 | ||
1441 | int kvm_arch_vcpu_ioctl_get_stack(struct kvm_vcpu *vcpu, | ||
1442 | struct kvm_ia64_vcpu_stack *stack) | ||
1443 | { | ||
1444 | memcpy(stack, vcpu, sizeof(struct kvm_ia64_vcpu_stack)); | ||
1445 | return 0; | ||
1446 | } | ||
1447 | |||
1448 | int kvm_arch_vcpu_ioctl_set_stack(struct kvm_vcpu *vcpu, | ||
1449 | struct kvm_ia64_vcpu_stack *stack) | ||
1450 | { | ||
1451 | memcpy(vcpu + 1, &stack->stack[0] + sizeof(struct kvm_vcpu), | ||
1452 | sizeof(struct kvm_ia64_vcpu_stack) - sizeof(struct kvm_vcpu)); | ||
1453 | |||
1454 | vcpu->arch.exit_data = ((struct kvm_vcpu *)stack)->arch.exit_data; | ||
1455 | return 0; | ||
1456 | } | ||
1457 | |||
1424 | void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) | 1458 | void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) |
1425 | { | 1459 | { |
1426 | 1460 | ||
@@ -1430,9 +1464,78 @@ void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) | |||
1430 | 1464 | ||
1431 | 1465 | ||
1432 | long kvm_arch_vcpu_ioctl(struct file *filp, | 1466 | long kvm_arch_vcpu_ioctl(struct file *filp, |
1433 | unsigned int ioctl, unsigned long arg) | 1467 | unsigned int ioctl, unsigned long arg) |
1434 | { | 1468 | { |
1435 | return -EINVAL; | 1469 | struct kvm_vcpu *vcpu = filp->private_data; |
1470 | void __user *argp = (void __user *)arg; | ||
1471 | struct kvm_ia64_vcpu_stack *stack = NULL; | ||
1472 | long r; | ||
1473 | |||
1474 | switch (ioctl) { | ||
1475 | case KVM_IA64_VCPU_GET_STACK: { | ||
1476 | struct kvm_ia64_vcpu_stack __user *user_stack; | ||
1477 | void __user *first_p = argp; | ||
1478 | |||
1479 | r = -EFAULT; | ||
1480 | if (copy_from_user(&user_stack, first_p, sizeof(void *))) | ||
1481 | goto out; | ||
1482 | |||
1483 | if (!access_ok(VERIFY_WRITE, user_stack, | ||
1484 | sizeof(struct kvm_ia64_vcpu_stack))) { | ||
1485 | printk(KERN_INFO "KVM_IA64_VCPU_GET_STACK: " | ||
1486 | "Illegal user destination address for stack\n"); | ||
1487 | goto out; | ||
1488 | } | ||
1489 | stack = kzalloc(sizeof(struct kvm_ia64_vcpu_stack), GFP_KERNEL); | ||
1490 | if (!stack) { | ||
1491 | r = -ENOMEM; | ||
1492 | goto out; | ||
1493 | } | ||
1494 | |||
1495 | r = kvm_arch_vcpu_ioctl_get_stack(vcpu, stack); | ||
1496 | if (r) | ||
1497 | goto out; | ||
1498 | |||
1499 | if (copy_to_user(user_stack, stack, | ||
1500 | sizeof(struct kvm_ia64_vcpu_stack))) | ||
1501 | goto out; | ||
1502 | |||
1503 | break; | ||
1504 | } | ||
1505 | case KVM_IA64_VCPU_SET_STACK: { | ||
1506 | struct kvm_ia64_vcpu_stack __user *user_stack; | ||
1507 | void __user *first_p = argp; | ||
1508 | |||
1509 | r = -EFAULT; | ||
1510 | if (copy_from_user(&user_stack, first_p, sizeof(void *))) | ||
1511 | goto out; | ||
1512 | |||
1513 | if (!access_ok(VERIFY_READ, user_stack, | ||
1514 | sizeof(struct kvm_ia64_vcpu_stack))) { | ||
1515 | printk(KERN_INFO "KVM_IA64_VCPU_SET_STACK: " | ||
1516 | "Illegal user address for stack\n"); | ||
1517 | goto out; | ||
1518 | } | ||
1519 | stack = kmalloc(sizeof(struct kvm_ia64_vcpu_stack), GFP_KERNEL); | ||
1520 | if (!stack) { | ||
1521 | r = -ENOMEM; | ||
1522 | goto out; | ||
1523 | } | ||
1524 | if (copy_from_user(stack, user_stack, | ||
1525 | sizeof(struct kvm_ia64_vcpu_stack))) | ||
1526 | goto out; | ||
1527 | |||
1528 | r = kvm_arch_vcpu_ioctl_set_stack(vcpu, stack); | ||
1529 | break; | ||
1530 | } | ||
1531 | |||
1532 | default: | ||
1533 | r = -EINVAL; | ||
1534 | } | ||
1535 | |||
1536 | out: | ||
1537 | kfree(stack); | ||
1538 | return r; | ||
1436 | } | 1539 | } |
1437 | 1540 | ||
1438 | int kvm_arch_set_memory_region(struct kvm *kvm, | 1541 | int kvm_arch_set_memory_region(struct kvm *kvm, |
@@ -1472,7 +1575,7 @@ void kvm_arch_flush_shadow(struct kvm *kvm) | |||
1472 | } | 1575 | } |
1473 | 1576 | ||
1474 | long kvm_arch_dev_ioctl(struct file *filp, | 1577 | long kvm_arch_dev_ioctl(struct file *filp, |
1475 | unsigned int ioctl, unsigned long arg) | 1578 | unsigned int ioctl, unsigned long arg) |
1476 | { | 1579 | { |
1477 | return -EINVAL; | 1580 | return -EINVAL; |
1478 | } | 1581 | } |
@@ -1737,7 +1840,7 @@ struct kvm_vcpu *kvm_get_lowest_prio_vcpu(struct kvm *kvm, u8 vector, | |||
1737 | struct kvm_vcpu *lvcpu = kvm->vcpus[0]; | 1840 | struct kvm_vcpu *lvcpu = kvm->vcpus[0]; |
1738 | int i; | 1841 | int i; |
1739 | 1842 | ||
1740 | for (i = 1; i < KVM_MAX_VCPUS; i++) { | 1843 | for (i = 1; i < kvm->arch.online_vcpus; i++) { |
1741 | if (!kvm->vcpus[i]) | 1844 | if (!kvm->vcpus[i]) |
1742 | continue; | 1845 | continue; |
1743 | if (lvcpu->arch.xtp > kvm->vcpus[i]->arch.xtp) | 1846 | if (lvcpu->arch.xtp > kvm->vcpus[i]->arch.xtp) |
diff --git a/arch/ia64/kvm/kvm_fw.c b/arch/ia64/kvm/kvm_fw.c index cb7600bdff9d..a8ae52ed5635 100644 --- a/arch/ia64/kvm/kvm_fw.c +++ b/arch/ia64/kvm/kvm_fw.c | |||
@@ -227,6 +227,18 @@ static struct ia64_pal_retval pal_proc_get_features(struct kvm_vcpu *vcpu) | |||
227 | return result; | 227 | return result; |
228 | } | 228 | } |
229 | 229 | ||
230 | static struct ia64_pal_retval pal_register_info(struct kvm_vcpu *vcpu) | ||
231 | { | ||
232 | |||
233 | struct ia64_pal_retval result = {0, 0, 0, 0}; | ||
234 | long in0, in1, in2, in3; | ||
235 | |||
236 | kvm_get_pal_call_data(vcpu, &in0, &in1, &in2, &in3); | ||
237 | result.status = ia64_pal_register_info(in1, &result.v1, &result.v2); | ||
238 | |||
239 | return result; | ||
240 | } | ||
241 | |||
230 | static struct ia64_pal_retval pal_cache_info(struct kvm_vcpu *vcpu) | 242 | static struct ia64_pal_retval pal_cache_info(struct kvm_vcpu *vcpu) |
231 | { | 243 | { |
232 | 244 | ||
@@ -268,8 +280,12 @@ static struct ia64_pal_retval pal_vm_summary(struct kvm_vcpu *vcpu) | |||
268 | static struct ia64_pal_retval pal_vm_info(struct kvm_vcpu *vcpu) | 280 | static struct ia64_pal_retval pal_vm_info(struct kvm_vcpu *vcpu) |
269 | { | 281 | { |
270 | struct ia64_pal_retval result; | 282 | struct ia64_pal_retval result; |
283 | unsigned long in0, in1, in2, in3; | ||
271 | 284 | ||
272 | INIT_PAL_STATUS_UNIMPLEMENTED(result); | 285 | kvm_get_pal_call_data(vcpu, &in0, &in1, &in2, &in3); |
286 | |||
287 | result.status = ia64_pal_vm_info(in1, in2, | ||
288 | (pal_tc_info_u_t *)&result.v1, &result.v2); | ||
273 | 289 | ||
274 | return result; | 290 | return result; |
275 | } | 291 | } |
@@ -292,6 +308,108 @@ static void prepare_for_halt(struct kvm_vcpu *vcpu) | |||
292 | vcpu->arch.timer_fired = 0; | 308 | vcpu->arch.timer_fired = 0; |
293 | } | 309 | } |
294 | 310 | ||
311 | static struct ia64_pal_retval pal_perf_mon_info(struct kvm_vcpu *vcpu) | ||
312 | { | ||
313 | long status; | ||
314 | unsigned long in0, in1, in2, in3, r9; | ||
315 | unsigned long pm_buffer[16]; | ||
316 | |||
317 | kvm_get_pal_call_data(vcpu, &in0, &in1, &in2, &in3); | ||
318 | status = ia64_pal_perf_mon_info(pm_buffer, | ||
319 | (pal_perf_mon_info_u_t *) &r9); | ||
320 | if (status != 0) { | ||
321 | printk(KERN_DEBUG"PAL_PERF_MON_INFO fails ret=%ld\n", status); | ||
322 | } else { | ||
323 | if (in1) | ||
324 | memcpy((void *)in1, pm_buffer, sizeof(pm_buffer)); | ||
325 | else { | ||
326 | status = PAL_STATUS_EINVAL; | ||
327 | printk(KERN_WARNING"Invalid parameters " | ||
328 | "for PAL call:0x%lx!\n", in0); | ||
329 | } | ||
330 | } | ||
331 | return (struct ia64_pal_retval){status, r9, 0, 0}; | ||
332 | } | ||
333 | |||
334 | static struct ia64_pal_retval pal_halt_info(struct kvm_vcpu *vcpu) | ||
335 | { | ||
336 | unsigned long in0, in1, in2, in3; | ||
337 | long status; | ||
338 | unsigned long res = 1000UL | (1000UL << 16) | (10UL << 32) | ||
339 | | (1UL << 61) | (1UL << 60); | ||
340 | |||
341 | kvm_get_pal_call_data(vcpu, &in0, &in1, &in2, &in3); | ||
342 | if (in1) { | ||
343 | memcpy((void *)in1, &res, sizeof(res)); | ||
344 | status = 0; | ||
345 | } else{ | ||
346 | status = PAL_STATUS_EINVAL; | ||
347 | printk(KERN_WARNING"Invalid parameters " | ||
348 | "for PAL call:0x%lx!\n", in0); | ||
349 | } | ||
350 | |||
351 | return (struct ia64_pal_retval){status, 0, 0, 0}; | ||
352 | } | ||
353 | |||
354 | static struct ia64_pal_retval pal_mem_attrib(struct kvm_vcpu *vcpu) | ||
355 | { | ||
356 | unsigned long r9; | ||
357 | long status; | ||
358 | |||
359 | status = ia64_pal_mem_attrib(&r9); | ||
360 | |||
361 | return (struct ia64_pal_retval){status, r9, 0, 0}; | ||
362 | } | ||
363 | |||
364 | static void remote_pal_prefetch_visibility(void *v) | ||
365 | { | ||
366 | s64 trans_type = (s64)v; | ||
367 | ia64_pal_prefetch_visibility(trans_type); | ||
368 | } | ||
369 | |||
370 | static struct ia64_pal_retval pal_prefetch_visibility(struct kvm_vcpu *vcpu) | ||
371 | { | ||
372 | struct ia64_pal_retval result = {0, 0, 0, 0}; | ||
373 | unsigned long in0, in1, in2, in3; | ||
374 | kvm_get_pal_call_data(vcpu, &in0, &in1, &in2, &in3); | ||
375 | result.status = ia64_pal_prefetch_visibility(in1); | ||
376 | if (result.status == 0) { | ||
377 | /* Must be performed on all remote processors | ||
378 | in the coherence domain. */ | ||
379 | smp_call_function(remote_pal_prefetch_visibility, | ||
380 | (void *)in1, 1); | ||
381 | /* Unnecessary on remote processor for other vcpus!*/ | ||
382 | result.status = 1; | ||
383 | } | ||
384 | return result; | ||
385 | } | ||
386 | |||
387 | static void remote_pal_mc_drain(void *v) | ||
388 | { | ||
389 | ia64_pal_mc_drain(); | ||
390 | } | ||
391 | |||
392 | static struct ia64_pal_retval pal_get_brand_info(struct kvm_vcpu *vcpu) | ||
393 | { | ||
394 | struct ia64_pal_retval result = {0, 0, 0, 0}; | ||
395 | unsigned long in0, in1, in2, in3; | ||
396 | |||
397 | kvm_get_pal_call_data(vcpu, &in0, &in1, &in2, &in3); | ||
398 | |||
399 | if (in1 == 0 && in2) { | ||
400 | char brand_info[128]; | ||
401 | result.status = ia64_pal_get_brand_info(brand_info); | ||
402 | if (result.status == PAL_STATUS_SUCCESS) | ||
403 | memcpy((void *)in2, brand_info, 128); | ||
404 | } else { | ||
405 | result.status = PAL_STATUS_REQUIRES_MEMORY; | ||
406 | printk(KERN_WARNING"Invalid parameters for " | ||
407 | "PAL call:0x%lx!\n", in0); | ||
408 | } | ||
409 | |||
410 | return result; | ||
411 | } | ||
412 | |||
295 | int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | 413 | int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) |
296 | { | 414 | { |
297 | 415 | ||
@@ -300,14 +418,22 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
300 | int ret = 1; | 418 | int ret = 1; |
301 | 419 | ||
302 | gr28 = kvm_get_pal_call_index(vcpu); | 420 | gr28 = kvm_get_pal_call_index(vcpu); |
303 | /*printk("pal_call index:%lx\n",gr28);*/ | ||
304 | switch (gr28) { | 421 | switch (gr28) { |
305 | case PAL_CACHE_FLUSH: | 422 | case PAL_CACHE_FLUSH: |
306 | result = pal_cache_flush(vcpu); | 423 | result = pal_cache_flush(vcpu); |
307 | break; | 424 | break; |
425 | case PAL_MEM_ATTRIB: | ||
426 | result = pal_mem_attrib(vcpu); | ||
427 | break; | ||
308 | case PAL_CACHE_SUMMARY: | 428 | case PAL_CACHE_SUMMARY: |
309 | result = pal_cache_summary(vcpu); | 429 | result = pal_cache_summary(vcpu); |
310 | break; | 430 | break; |
431 | case PAL_PERF_MON_INFO: | ||
432 | result = pal_perf_mon_info(vcpu); | ||
433 | break; | ||
434 | case PAL_HALT_INFO: | ||
435 | result = pal_halt_info(vcpu); | ||
436 | break; | ||
311 | case PAL_HALT_LIGHT: | 437 | case PAL_HALT_LIGHT: |
312 | { | 438 | { |
313 | INIT_PAL_STATUS_SUCCESS(result); | 439 | INIT_PAL_STATUS_SUCCESS(result); |
@@ -317,6 +443,16 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
317 | } | 443 | } |
318 | break; | 444 | break; |
319 | 445 | ||
446 | case PAL_PREFETCH_VISIBILITY: | ||
447 | result = pal_prefetch_visibility(vcpu); | ||
448 | break; | ||
449 | case PAL_MC_DRAIN: | ||
450 | result.status = ia64_pal_mc_drain(); | ||
451 | /* FIXME: All vcpus likely call PAL_MC_DRAIN. | ||
452 | That causes the congestion. */ | ||
453 | smp_call_function(remote_pal_mc_drain, NULL, 1); | ||
454 | break; | ||
455 | |||
320 | case PAL_FREQ_RATIOS: | 456 | case PAL_FREQ_RATIOS: |
321 | result = pal_freq_ratios(vcpu); | 457 | result = pal_freq_ratios(vcpu); |
322 | break; | 458 | break; |
@@ -346,6 +482,9 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
346 | INIT_PAL_STATUS_SUCCESS(result); | 482 | INIT_PAL_STATUS_SUCCESS(result); |
347 | result.v1 = (1L << 32) | 1L; | 483 | result.v1 = (1L << 32) | 1L; |
348 | break; | 484 | break; |
485 | case PAL_REGISTER_INFO: | ||
486 | result = pal_register_info(vcpu); | ||
487 | break; | ||
349 | case PAL_VM_PAGE_SIZE: | 488 | case PAL_VM_PAGE_SIZE: |
350 | result.status = ia64_pal_vm_page_size(&result.v0, | 489 | result.status = ia64_pal_vm_page_size(&result.v0, |
351 | &result.v1); | 490 | &result.v1); |
@@ -365,12 +504,18 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
365 | result.status = ia64_pal_version( | 504 | result.status = ia64_pal_version( |
366 | (pal_version_u_t *)&result.v0, | 505 | (pal_version_u_t *)&result.v0, |
367 | (pal_version_u_t *)&result.v1); | 506 | (pal_version_u_t *)&result.v1); |
368 | |||
369 | break; | 507 | break; |
370 | case PAL_FIXED_ADDR: | 508 | case PAL_FIXED_ADDR: |
371 | result.status = PAL_STATUS_SUCCESS; | 509 | result.status = PAL_STATUS_SUCCESS; |
372 | result.v0 = vcpu->vcpu_id; | 510 | result.v0 = vcpu->vcpu_id; |
373 | break; | 511 | break; |
512 | case PAL_BRAND_INFO: | ||
513 | result = pal_get_brand_info(vcpu); | ||
514 | break; | ||
515 | case PAL_GET_PSTATE: | ||
516 | case PAL_CACHE_SHARED_INFO: | ||
517 | INIT_PAL_STATUS_UNIMPLEMENTED(result); | ||
518 | break; | ||
374 | default: | 519 | default: |
375 | INIT_PAL_STATUS_UNIMPLEMENTED(result); | 520 | INIT_PAL_STATUS_UNIMPLEMENTED(result); |
376 | printk(KERN_WARNING"kvm: Unsupported pal call," | 521 | printk(KERN_WARNING"kvm: Unsupported pal call," |
diff --git a/arch/ia64/kvm/process.c b/arch/ia64/kvm/process.c index 230eae482f32..b1dc80952d91 100644 --- a/arch/ia64/kvm/process.c +++ b/arch/ia64/kvm/process.c | |||
@@ -167,7 +167,6 @@ static u64 vcpu_get_itir_on_fault(struct kvm_vcpu *vcpu, u64 ifa) | |||
167 | return (rr1.val); | 167 | return (rr1.val); |
168 | } | 168 | } |
169 | 169 | ||
170 | |||
171 | /* | 170 | /* |
172 | * Set vIFA & vITIR & vIHA, when vPSR.ic =1 | 171 | * Set vIFA & vITIR & vIHA, when vPSR.ic =1 |
173 | * Parameter: | 172 | * Parameter: |
@@ -222,8 +221,6 @@ void itlb_fault(struct kvm_vcpu *vcpu, u64 vadr) | |||
222 | inject_guest_interruption(vcpu, IA64_INST_TLB_VECTOR); | 221 | inject_guest_interruption(vcpu, IA64_INST_TLB_VECTOR); |
223 | } | 222 | } |
224 | 223 | ||
225 | |||
226 | |||
227 | /* | 224 | /* |
228 | * Data Nested TLB Fault | 225 | * Data Nested TLB Fault |
229 | * @ Data Nested TLB Vector | 226 | * @ Data Nested TLB Vector |
@@ -245,7 +242,6 @@ void alt_dtlb(struct kvm_vcpu *vcpu, u64 vadr) | |||
245 | inject_guest_interruption(vcpu, IA64_ALT_DATA_TLB_VECTOR); | 242 | inject_guest_interruption(vcpu, IA64_ALT_DATA_TLB_VECTOR); |
246 | } | 243 | } |
247 | 244 | ||
248 | |||
249 | /* | 245 | /* |
250 | * Data TLB Fault | 246 | * Data TLB Fault |
251 | * @ Data TLB vector | 247 | * @ Data TLB vector |
@@ -265,8 +261,6 @@ static void _vhpt_fault(struct kvm_vcpu *vcpu, u64 vadr) | |||
265 | /* If vPSR.ic, IFA, ITIR, IHA*/ | 261 | /* If vPSR.ic, IFA, ITIR, IHA*/ |
266 | set_ifa_itir_iha(vcpu, vadr, 1, 1, 1); | 262 | set_ifa_itir_iha(vcpu, vadr, 1, 1, 1); |
267 | inject_guest_interruption(vcpu, IA64_VHPT_TRANS_VECTOR); | 263 | inject_guest_interruption(vcpu, IA64_VHPT_TRANS_VECTOR); |
268 | |||
269 | |||
270 | } | 264 | } |
271 | 265 | ||
272 | /* | 266 | /* |
@@ -279,7 +273,6 @@ void ivhpt_fault(struct kvm_vcpu *vcpu, u64 vadr) | |||
279 | _vhpt_fault(vcpu, vadr); | 273 | _vhpt_fault(vcpu, vadr); |
280 | } | 274 | } |
281 | 275 | ||
282 | |||
283 | /* | 276 | /* |
284 | * VHPT Data Fault | 277 | * VHPT Data Fault |
285 | * @ VHPT Translation vector | 278 | * @ VHPT Translation vector |
@@ -290,8 +283,6 @@ void dvhpt_fault(struct kvm_vcpu *vcpu, u64 vadr) | |||
290 | _vhpt_fault(vcpu, vadr); | 283 | _vhpt_fault(vcpu, vadr); |
291 | } | 284 | } |
292 | 285 | ||
293 | |||
294 | |||
295 | /* | 286 | /* |
296 | * Deal with: | 287 | * Deal with: |
297 | * General Exception vector | 288 | * General Exception vector |
@@ -301,7 +292,6 @@ void _general_exception(struct kvm_vcpu *vcpu) | |||
301 | inject_guest_interruption(vcpu, IA64_GENEX_VECTOR); | 292 | inject_guest_interruption(vcpu, IA64_GENEX_VECTOR); |
302 | } | 293 | } |
303 | 294 | ||
304 | |||
305 | /* | 295 | /* |
306 | * Illegal Operation Fault | 296 | * Illegal Operation Fault |
307 | * @ General Exception Vector | 297 | * @ General Exception Vector |
@@ -419,19 +409,16 @@ static void __page_not_present(struct kvm_vcpu *vcpu, u64 vadr) | |||
419 | inject_guest_interruption(vcpu, IA64_PAGE_NOT_PRESENT_VECTOR); | 409 | inject_guest_interruption(vcpu, IA64_PAGE_NOT_PRESENT_VECTOR); |
420 | } | 410 | } |
421 | 411 | ||
422 | |||
423 | void data_page_not_present(struct kvm_vcpu *vcpu, u64 vadr) | 412 | void data_page_not_present(struct kvm_vcpu *vcpu, u64 vadr) |
424 | { | 413 | { |
425 | __page_not_present(vcpu, vadr); | 414 | __page_not_present(vcpu, vadr); |
426 | } | 415 | } |
427 | 416 | ||
428 | |||
429 | void inst_page_not_present(struct kvm_vcpu *vcpu, u64 vadr) | 417 | void inst_page_not_present(struct kvm_vcpu *vcpu, u64 vadr) |
430 | { | 418 | { |
431 | __page_not_present(vcpu, vadr); | 419 | __page_not_present(vcpu, vadr); |
432 | } | 420 | } |
433 | 421 | ||
434 | |||
435 | /* Deal with | 422 | /* Deal with |
436 | * Data access rights vector | 423 | * Data access rights vector |
437 | */ | 424 | */ |
@@ -563,22 +550,64 @@ void reflect_interruption(u64 ifa, u64 isr, u64 iim, | |||
563 | inject_guest_interruption(vcpu, vector); | 550 | inject_guest_interruption(vcpu, vector); |
564 | } | 551 | } |
565 | 552 | ||
553 | static unsigned long kvm_trans_pal_call_args(struct kvm_vcpu *vcpu, | ||
554 | unsigned long arg) | ||
555 | { | ||
556 | struct thash_data *data; | ||
557 | unsigned long gpa, poff; | ||
558 | |||
559 | if (!is_physical_mode(vcpu)) { | ||
560 | /* Depends on caller to provide the DTR or DTC mapping.*/ | ||
561 | data = vtlb_lookup(vcpu, arg, D_TLB); | ||
562 | if (data) | ||
563 | gpa = data->page_flags & _PAGE_PPN_MASK; | ||
564 | else { | ||
565 | data = vhpt_lookup(arg); | ||
566 | if (!data) | ||
567 | return 0; | ||
568 | gpa = data->gpaddr & _PAGE_PPN_MASK; | ||
569 | } | ||
570 | |||
571 | poff = arg & (PSIZE(data->ps) - 1); | ||
572 | arg = PAGEALIGN(gpa, data->ps) | poff; | ||
573 | } | ||
574 | arg = kvm_gpa_to_mpa(arg << 1 >> 1); | ||
575 | |||
576 | return (unsigned long)__va(arg); | ||
577 | } | ||
578 | |||
566 | static void set_pal_call_data(struct kvm_vcpu *vcpu) | 579 | static void set_pal_call_data(struct kvm_vcpu *vcpu) |
567 | { | 580 | { |
568 | struct exit_ctl_data *p = &vcpu->arch.exit_data; | 581 | struct exit_ctl_data *p = &vcpu->arch.exit_data; |
582 | unsigned long gr28 = vcpu_get_gr(vcpu, 28); | ||
583 | unsigned long gr29 = vcpu_get_gr(vcpu, 29); | ||
584 | unsigned long gr30 = vcpu_get_gr(vcpu, 30); | ||
569 | 585 | ||
570 | /*FIXME:For static and stacked convention, firmware | 586 | /*FIXME:For static and stacked convention, firmware |
571 | * has put the parameters in gr28-gr31 before | 587 | * has put the parameters in gr28-gr31 before |
572 | * break to vmm !!*/ | 588 | * break to vmm !!*/ |
573 | 589 | ||
574 | p->u.pal_data.gr28 = vcpu_get_gr(vcpu, 28); | 590 | switch (gr28) { |
575 | p->u.pal_data.gr29 = vcpu_get_gr(vcpu, 29); | 591 | case PAL_PERF_MON_INFO: |
576 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); | 592 | case PAL_HALT_INFO: |
593 | p->u.pal_data.gr29 = kvm_trans_pal_call_args(vcpu, gr29); | ||
594 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); | ||
595 | break; | ||
596 | case PAL_BRAND_INFO: | ||
597 | p->u.pal_data.gr29 = gr29;; | ||
598 | p->u.pal_data.gr30 = kvm_trans_pal_call_args(vcpu, gr30); | ||
599 | break; | ||
600 | default: | ||
601 | p->u.pal_data.gr29 = gr29;; | ||
602 | p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30); | ||
603 | } | ||
604 | p->u.pal_data.gr28 = gr28; | ||
577 | p->u.pal_data.gr31 = vcpu_get_gr(vcpu, 31); | 605 | p->u.pal_data.gr31 = vcpu_get_gr(vcpu, 31); |
606 | |||
578 | p->exit_reason = EXIT_REASON_PAL_CALL; | 607 | p->exit_reason = EXIT_REASON_PAL_CALL; |
579 | } | 608 | } |
580 | 609 | ||
581 | static void set_pal_call_result(struct kvm_vcpu *vcpu) | 610 | static void get_pal_call_result(struct kvm_vcpu *vcpu) |
582 | { | 611 | { |
583 | struct exit_ctl_data *p = &vcpu->arch.exit_data; | 612 | struct exit_ctl_data *p = &vcpu->arch.exit_data; |
584 | 613 | ||
@@ -606,7 +635,7 @@ static void set_sal_call_data(struct kvm_vcpu *vcpu) | |||
606 | p->exit_reason = EXIT_REASON_SAL_CALL; | 635 | p->exit_reason = EXIT_REASON_SAL_CALL; |
607 | } | 636 | } |
608 | 637 | ||
609 | static void set_sal_call_result(struct kvm_vcpu *vcpu) | 638 | static void get_sal_call_result(struct kvm_vcpu *vcpu) |
610 | { | 639 | { |
611 | struct exit_ctl_data *p = &vcpu->arch.exit_data; | 640 | struct exit_ctl_data *p = &vcpu->arch.exit_data; |
612 | 641 | ||
@@ -629,13 +658,13 @@ void kvm_ia64_handle_break(unsigned long ifa, struct kvm_pt_regs *regs, | |||
629 | if (iim == DOMN_PAL_REQUEST) { | 658 | if (iim == DOMN_PAL_REQUEST) { |
630 | set_pal_call_data(v); | 659 | set_pal_call_data(v); |
631 | vmm_transition(v); | 660 | vmm_transition(v); |
632 | set_pal_call_result(v); | 661 | get_pal_call_result(v); |
633 | vcpu_increment_iip(v); | 662 | vcpu_increment_iip(v); |
634 | return; | 663 | return; |
635 | } else if (iim == DOMN_SAL_REQUEST) { | 664 | } else if (iim == DOMN_SAL_REQUEST) { |
636 | set_sal_call_data(v); | 665 | set_sal_call_data(v); |
637 | vmm_transition(v); | 666 | vmm_transition(v); |
638 | set_sal_call_result(v); | 667 | get_sal_call_result(v); |
639 | vcpu_increment_iip(v); | 668 | vcpu_increment_iip(v); |
640 | return; | 669 | return; |
641 | } | 670 | } |
@@ -703,7 +732,6 @@ void vhpi_detection(struct kvm_vcpu *vcpu) | |||
703 | } | 732 | } |
704 | } | 733 | } |
705 | 734 | ||
706 | |||
707 | void leave_hypervisor_tail(void) | 735 | void leave_hypervisor_tail(void) |
708 | { | 736 | { |
709 | struct kvm_vcpu *v = current_vcpu; | 737 | struct kvm_vcpu *v = current_vcpu; |
@@ -737,7 +765,6 @@ void leave_hypervisor_tail(void) | |||
737 | } | 765 | } |
738 | } | 766 | } |
739 | 767 | ||
740 | |||
741 | static inline void handle_lds(struct kvm_pt_regs *regs) | 768 | static inline void handle_lds(struct kvm_pt_regs *regs) |
742 | { | 769 | { |
743 | regs->cr_ipsr |= IA64_PSR_ED; | 770 | regs->cr_ipsr |= IA64_PSR_ED; |
diff --git a/arch/ia64/kvm/vcpu.c b/arch/ia64/kvm/vcpu.c index ecd526b55323..d4d280505878 100644 --- a/arch/ia64/kvm/vcpu.c +++ b/arch/ia64/kvm/vcpu.c | |||
@@ -112,7 +112,6 @@ void switch_to_physical_rid(struct kvm_vcpu *vcpu) | |||
112 | return; | 112 | return; |
113 | } | 113 | } |
114 | 114 | ||
115 | |||
116 | void switch_to_virtual_rid(struct kvm_vcpu *vcpu) | 115 | void switch_to_virtual_rid(struct kvm_vcpu *vcpu) |
117 | { | 116 | { |
118 | unsigned long psr; | 117 | unsigned long psr; |
@@ -166,8 +165,6 @@ void switch_mm_mode(struct kvm_vcpu *vcpu, struct ia64_psr old_psr, | |||
166 | return; | 165 | return; |
167 | } | 166 | } |
168 | 167 | ||
169 | |||
170 | |||
171 | /* | 168 | /* |
172 | * In physical mode, insert tc/tr for region 0 and 4 uses | 169 | * In physical mode, insert tc/tr for region 0 and 4 uses |
173 | * RID[0] and RID[4] which is for physical mode emulation. | 170 | * RID[0] and RID[4] which is for physical mode emulation. |
@@ -269,7 +266,6 @@ static inline unsigned long fph_index(struct kvm_pt_regs *regs, | |||
269 | return rotate_reg(96, rrb_fr, (regnum - IA64_FIRST_ROTATING_FR)); | 266 | return rotate_reg(96, rrb_fr, (regnum - IA64_FIRST_ROTATING_FR)); |
270 | } | 267 | } |
271 | 268 | ||
272 | |||
273 | /* | 269 | /* |
274 | * The inverse of the above: given bspstore and the number of | 270 | * The inverse of the above: given bspstore and the number of |
275 | * registers, calculate ar.bsp. | 271 | * registers, calculate ar.bsp. |
@@ -811,12 +807,15 @@ static inline void vcpu_set_itm(struct kvm_vcpu *vcpu, u64 val); | |||
811 | static void vcpu_set_itc(struct kvm_vcpu *vcpu, u64 val) | 807 | static void vcpu_set_itc(struct kvm_vcpu *vcpu, u64 val) |
812 | { | 808 | { |
813 | struct kvm_vcpu *v; | 809 | struct kvm_vcpu *v; |
810 | struct kvm *kvm; | ||
814 | int i; | 811 | int i; |
815 | long itc_offset = val - ia64_getreg(_IA64_REG_AR_ITC); | 812 | long itc_offset = val - ia64_getreg(_IA64_REG_AR_ITC); |
816 | unsigned long vitv = VCPU(vcpu, itv); | 813 | unsigned long vitv = VCPU(vcpu, itv); |
817 | 814 | ||
815 | kvm = (struct kvm *)KVM_VM_BASE; | ||
816 | |||
818 | if (vcpu->vcpu_id == 0) { | 817 | if (vcpu->vcpu_id == 0) { |
819 | for (i = 0; i < KVM_MAX_VCPUS; i++) { | 818 | for (i = 0; i < kvm->arch.online_vcpus; i++) { |
820 | v = (struct kvm_vcpu *)((char *)vcpu + | 819 | v = (struct kvm_vcpu *)((char *)vcpu + |
821 | sizeof(struct kvm_vcpu_data) * i); | 820 | sizeof(struct kvm_vcpu_data) * i); |
822 | VMX(v, itc_offset) = itc_offset; | 821 | VMX(v, itc_offset) = itc_offset; |
@@ -1039,8 +1038,6 @@ u64 vcpu_tak(struct kvm_vcpu *vcpu, u64 vadr) | |||
1039 | return key; | 1038 | return key; |
1040 | } | 1039 | } |
1041 | 1040 | ||
1042 | |||
1043 | |||
1044 | void kvm_thash(struct kvm_vcpu *vcpu, INST64 inst) | 1041 | void kvm_thash(struct kvm_vcpu *vcpu, INST64 inst) |
1045 | { | 1042 | { |
1046 | unsigned long thash, vadr; | 1043 | unsigned long thash, vadr; |
@@ -1050,7 +1047,6 @@ void kvm_thash(struct kvm_vcpu *vcpu, INST64 inst) | |||
1050 | vcpu_set_gr(vcpu, inst.M46.r1, thash, 0); | 1047 | vcpu_set_gr(vcpu, inst.M46.r1, thash, 0); |
1051 | } | 1048 | } |
1052 | 1049 | ||
1053 | |||
1054 | void kvm_ttag(struct kvm_vcpu *vcpu, INST64 inst) | 1050 | void kvm_ttag(struct kvm_vcpu *vcpu, INST64 inst) |
1055 | { | 1051 | { |
1056 | unsigned long tag, vadr; | 1052 | unsigned long tag, vadr; |
@@ -1131,7 +1127,6 @@ int vcpu_tpa(struct kvm_vcpu *vcpu, u64 vadr, u64 *padr) | |||
1131 | return IA64_NO_FAULT; | 1127 | return IA64_NO_FAULT; |
1132 | } | 1128 | } |
1133 | 1129 | ||
1134 | |||
1135 | int kvm_tpa(struct kvm_vcpu *vcpu, INST64 inst) | 1130 | int kvm_tpa(struct kvm_vcpu *vcpu, INST64 inst) |
1136 | { | 1131 | { |
1137 | unsigned long r1, r3; | 1132 | unsigned long r1, r3; |
@@ -1154,7 +1149,6 @@ void kvm_tak(struct kvm_vcpu *vcpu, INST64 inst) | |||
1154 | vcpu_set_gr(vcpu, inst.M46.r1, r1, 0); | 1149 | vcpu_set_gr(vcpu, inst.M46.r1, r1, 0); |
1155 | } | 1150 | } |
1156 | 1151 | ||
1157 | |||
1158 | /************************************ | 1152 | /************************************ |
1159 | * Insert/Purge translation register/cache | 1153 | * Insert/Purge translation register/cache |
1160 | ************************************/ | 1154 | ************************************/ |
@@ -1385,7 +1379,6 @@ void kvm_mov_to_ar_reg(struct kvm_vcpu *vcpu, INST64 inst) | |||
1385 | vcpu_set_itc(vcpu, r2); | 1379 | vcpu_set_itc(vcpu, r2); |
1386 | } | 1380 | } |
1387 | 1381 | ||
1388 | |||
1389 | void kvm_mov_from_ar_reg(struct kvm_vcpu *vcpu, INST64 inst) | 1382 | void kvm_mov_from_ar_reg(struct kvm_vcpu *vcpu, INST64 inst) |
1390 | { | 1383 | { |
1391 | unsigned long r1; | 1384 | unsigned long r1; |
@@ -1393,8 +1386,9 @@ void kvm_mov_from_ar_reg(struct kvm_vcpu *vcpu, INST64 inst) | |||
1393 | r1 = vcpu_get_itc(vcpu); | 1386 | r1 = vcpu_get_itc(vcpu); |
1394 | vcpu_set_gr(vcpu, inst.M31.r1, r1, 0); | 1387 | vcpu_set_gr(vcpu, inst.M31.r1, r1, 0); |
1395 | } | 1388 | } |
1389 | |||
1396 | /************************************************************************** | 1390 | /************************************************************************** |
1397 | struct kvm_vcpu*protection key register access routines | 1391 | struct kvm_vcpu protection key register access routines |
1398 | **************************************************************************/ | 1392 | **************************************************************************/ |
1399 | 1393 | ||
1400 | unsigned long vcpu_get_pkr(struct kvm_vcpu *vcpu, unsigned long reg) | 1394 | unsigned long vcpu_get_pkr(struct kvm_vcpu *vcpu, unsigned long reg) |
@@ -1407,20 +1401,6 @@ void vcpu_set_pkr(struct kvm_vcpu *vcpu, unsigned long reg, unsigned long val) | |||
1407 | ia64_set_pkr(reg, val); | 1401 | ia64_set_pkr(reg, val); |
1408 | } | 1402 | } |
1409 | 1403 | ||
1410 | |||
1411 | unsigned long vcpu_get_itir_on_fault(struct kvm_vcpu *vcpu, unsigned long ifa) | ||
1412 | { | ||
1413 | union ia64_rr rr, rr1; | ||
1414 | |||
1415 | rr.val = vcpu_get_rr(vcpu, ifa); | ||
1416 | rr1.val = 0; | ||
1417 | rr1.ps = rr.ps; | ||
1418 | rr1.rid = rr.rid; | ||
1419 | return (rr1.val); | ||
1420 | } | ||
1421 | |||
1422 | |||
1423 | |||
1424 | /******************************** | 1404 | /******************************** |
1425 | * Moves to privileged registers | 1405 | * Moves to privileged registers |
1426 | ********************************/ | 1406 | ********************************/ |
@@ -1464,8 +1444,6 @@ unsigned long vcpu_set_rr(struct kvm_vcpu *vcpu, unsigned long reg, | |||
1464 | return (IA64_NO_FAULT); | 1444 | return (IA64_NO_FAULT); |
1465 | } | 1445 | } |
1466 | 1446 | ||
1467 | |||
1468 | |||
1469 | void kvm_mov_to_rr(struct kvm_vcpu *vcpu, INST64 inst) | 1447 | void kvm_mov_to_rr(struct kvm_vcpu *vcpu, INST64 inst) |
1470 | { | 1448 | { |
1471 | unsigned long r3, r2; | 1449 | unsigned long r3, r2; |
@@ -1510,8 +1488,6 @@ void kvm_mov_to_pkr(struct kvm_vcpu *vcpu, INST64 inst) | |||
1510 | vcpu_set_pkr(vcpu, r3, r2); | 1488 | vcpu_set_pkr(vcpu, r3, r2); |
1511 | } | 1489 | } |
1512 | 1490 | ||
1513 | |||
1514 | |||
1515 | void kvm_mov_from_rr(struct kvm_vcpu *vcpu, INST64 inst) | 1491 | void kvm_mov_from_rr(struct kvm_vcpu *vcpu, INST64 inst) |
1516 | { | 1492 | { |
1517 | unsigned long r3, r1; | 1493 | unsigned long r3, r1; |
@@ -1557,7 +1533,6 @@ void kvm_mov_from_pmc(struct kvm_vcpu *vcpu, INST64 inst) | |||
1557 | vcpu_set_gr(vcpu, inst.M43.r1, r1, 0); | 1533 | vcpu_set_gr(vcpu, inst.M43.r1, r1, 0); |
1558 | } | 1534 | } |
1559 | 1535 | ||
1560 | |||
1561 | unsigned long vcpu_get_cpuid(struct kvm_vcpu *vcpu, unsigned long reg) | 1536 | unsigned long vcpu_get_cpuid(struct kvm_vcpu *vcpu, unsigned long reg) |
1562 | { | 1537 | { |
1563 | /* FIXME: This could get called as a result of a rsvd-reg fault */ | 1538 | /* FIXME: This could get called as a result of a rsvd-reg fault */ |
@@ -1609,7 +1584,6 @@ unsigned long kvm_mov_to_cr(struct kvm_vcpu *vcpu, INST64 inst) | |||
1609 | return 0; | 1584 | return 0; |
1610 | } | 1585 | } |
1611 | 1586 | ||
1612 | |||
1613 | unsigned long kvm_mov_from_cr(struct kvm_vcpu *vcpu, INST64 inst) | 1587 | unsigned long kvm_mov_from_cr(struct kvm_vcpu *vcpu, INST64 inst) |
1614 | { | 1588 | { |
1615 | unsigned long tgt = inst.M33.r1; | 1589 | unsigned long tgt = inst.M33.r1; |
@@ -1633,8 +1607,6 @@ unsigned long kvm_mov_from_cr(struct kvm_vcpu *vcpu, INST64 inst) | |||
1633 | return 0; | 1607 | return 0; |
1634 | } | 1608 | } |
1635 | 1609 | ||
1636 | |||
1637 | |||
1638 | void vcpu_set_psr(struct kvm_vcpu *vcpu, unsigned long val) | 1610 | void vcpu_set_psr(struct kvm_vcpu *vcpu, unsigned long val) |
1639 | { | 1611 | { |
1640 | 1612 | ||
@@ -1776,9 +1748,6 @@ void vcpu_bsw1(struct kvm_vcpu *vcpu) | |||
1776 | } | 1748 | } |
1777 | } | 1749 | } |
1778 | 1750 | ||
1779 | |||
1780 | |||
1781 | |||
1782 | void vcpu_rfi(struct kvm_vcpu *vcpu) | 1751 | void vcpu_rfi(struct kvm_vcpu *vcpu) |
1783 | { | 1752 | { |
1784 | unsigned long ifs, psr; | 1753 | unsigned long ifs, psr; |
@@ -1796,7 +1765,6 @@ void vcpu_rfi(struct kvm_vcpu *vcpu) | |||
1796 | regs->cr_iip = VCPU(vcpu, iip); | 1765 | regs->cr_iip = VCPU(vcpu, iip); |
1797 | } | 1766 | } |
1798 | 1767 | ||
1799 | |||
1800 | /* | 1768 | /* |
1801 | VPSR can't keep track of below bits of guest PSR | 1769 | VPSR can't keep track of below bits of guest PSR |
1802 | This function gets guest PSR | 1770 | This function gets guest PSR |
diff --git a/arch/ia64/kvm/vcpu.h b/arch/ia64/kvm/vcpu.h index b2f12a562bdf..042af92ced83 100644 --- a/arch/ia64/kvm/vcpu.h +++ b/arch/ia64/kvm/vcpu.h | |||
@@ -703,7 +703,7 @@ extern u64 guest_vhpt_lookup(u64 iha, u64 *pte); | |||
703 | extern void thash_purge_entries(struct kvm_vcpu *v, u64 va, u64 ps); | 703 | extern void thash_purge_entries(struct kvm_vcpu *v, u64 va, u64 ps); |
704 | extern void thash_purge_entries_remote(struct kvm_vcpu *v, u64 va, u64 ps); | 704 | extern void thash_purge_entries_remote(struct kvm_vcpu *v, u64 va, u64 ps); |
705 | extern u64 translate_phy_pte(u64 *pte, u64 itir, u64 va); | 705 | extern u64 translate_phy_pte(u64 *pte, u64 itir, u64 va); |
706 | extern int thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, | 706 | extern void thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, |
707 | u64 itir, u64 ifa, int type); | 707 | u64 itir, u64 ifa, int type); |
708 | extern void thash_purge_all(struct kvm_vcpu *v); | 708 | extern void thash_purge_all(struct kvm_vcpu *v); |
709 | extern struct thash_data *vtlb_lookup(struct kvm_vcpu *v, | 709 | extern struct thash_data *vtlb_lookup(struct kvm_vcpu *v, |
@@ -738,7 +738,7 @@ void kvm_init_vhpt(struct kvm_vcpu *v); | |||
738 | void thash_init(struct thash_cb *hcb, u64 sz); | 738 | void thash_init(struct thash_cb *hcb, u64 sz); |
739 | 739 | ||
740 | void panic_vm(struct kvm_vcpu *v, const char *fmt, ...); | 740 | void panic_vm(struct kvm_vcpu *v, const char *fmt, ...); |
741 | 741 | u64 kvm_gpa_to_mpa(u64 gpa); | |
742 | extern u64 ia64_call_vsa(u64 proc, u64 arg1, u64 arg2, u64 arg3, | 742 | extern u64 ia64_call_vsa(u64 proc, u64 arg1, u64 arg2, u64 arg3, |
743 | u64 arg4, u64 arg5, u64 arg6, u64 arg7); | 743 | u64 arg4, u64 arg5, u64 arg6, u64 arg7); |
744 | 744 | ||
diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index 6b6307a3bd55..38232b37668b 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c | |||
@@ -164,11 +164,11 @@ static void vhpt_insert(u64 pte, u64 itir, u64 ifa, u64 gpte) | |||
164 | unsigned long ps, gpaddr; | 164 | unsigned long ps, gpaddr; |
165 | 165 | ||
166 | ps = itir_ps(itir); | 166 | ps = itir_ps(itir); |
167 | rr.val = ia64_get_rr(ifa); | ||
167 | 168 | ||
168 | gpaddr = ((gpte & _PAGE_PPN_MASK) >> ps << ps) | | 169 | gpaddr = ((gpte & _PAGE_PPN_MASK) >> ps << ps) | |
169 | (ifa & ((1UL << ps) - 1)); | 170 | (ifa & ((1UL << ps) - 1)); |
170 | 171 | ||
171 | rr.val = ia64_get_rr(ifa); | ||
172 | head = (struct thash_data *)ia64_thash(ifa); | 172 | head = (struct thash_data *)ia64_thash(ifa); |
173 | head->etag = INVALID_TI_TAG; | 173 | head->etag = INVALID_TI_TAG; |
174 | ia64_mf(); | 174 | ia64_mf(); |
@@ -412,16 +412,14 @@ u64 translate_phy_pte(u64 *pte, u64 itir, u64 va) | |||
412 | 412 | ||
413 | /* | 413 | /* |
414 | * Purge overlap TCs and then insert the new entry to emulate itc ops. | 414 | * Purge overlap TCs and then insert the new entry to emulate itc ops. |
415 | * Notes: Only TC entry can purge and insert. | 415 | * Notes: Only TC entry can purge and insert. |
416 | * 1 indicates this is MMIO | ||
417 | */ | 416 | */ |
418 | int thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, u64 itir, | 417 | void thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, u64 itir, |
419 | u64 ifa, int type) | 418 | u64 ifa, int type) |
420 | { | 419 | { |
421 | u64 ps; | 420 | u64 ps; |
422 | u64 phy_pte, io_mask, index; | 421 | u64 phy_pte, io_mask, index; |
423 | union ia64_rr vrr, mrr; | 422 | union ia64_rr vrr, mrr; |
424 | int ret = 0; | ||
425 | 423 | ||
426 | ps = itir_ps(itir); | 424 | ps = itir_ps(itir); |
427 | vrr.val = vcpu_get_rr(v, ifa); | 425 | vrr.val = vcpu_get_rr(v, ifa); |
@@ -441,25 +439,19 @@ int thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, u64 itir, | |||
441 | phy_pte &= ~_PAGE_MA_MASK; | 439 | phy_pte &= ~_PAGE_MA_MASK; |
442 | } | 440 | } |
443 | 441 | ||
444 | if (pte & VTLB_PTE_IO) | ||
445 | ret = 1; | ||
446 | |||
447 | vtlb_purge(v, ifa, ps); | 442 | vtlb_purge(v, ifa, ps); |
448 | vhpt_purge(v, ifa, ps); | 443 | vhpt_purge(v, ifa, ps); |
449 | 444 | ||
450 | if (ps == mrr.ps) { | 445 | if ((ps != mrr.ps) || (pte & VTLB_PTE_IO)) { |
451 | if (!(pte&VTLB_PTE_IO)) { | ||
452 | vhpt_insert(phy_pte, itir, ifa, pte); | ||
453 | } else { | ||
454 | vtlb_insert(v, pte, itir, ifa); | ||
455 | vcpu_quick_region_set(VMX(v, tc_regions), ifa); | ||
456 | } | ||
457 | } else if (ps > mrr.ps) { | ||
458 | vtlb_insert(v, pte, itir, ifa); | 446 | vtlb_insert(v, pte, itir, ifa); |
459 | vcpu_quick_region_set(VMX(v, tc_regions), ifa); | 447 | vcpu_quick_region_set(VMX(v, tc_regions), ifa); |
460 | if (!(pte&VTLB_PTE_IO)) | 448 | } |
461 | vhpt_insert(phy_pte, itir, ifa, pte); | 449 | if (pte & VTLB_PTE_IO) |
462 | } else { | 450 | return; |
451 | |||
452 | if (ps >= mrr.ps) | ||
453 | vhpt_insert(phy_pte, itir, ifa, pte); | ||
454 | else { | ||
463 | u64 psr; | 455 | u64 psr; |
464 | phy_pte &= ~PAGE_FLAGS_RV_MASK; | 456 | phy_pte &= ~PAGE_FLAGS_RV_MASK; |
465 | psr = ia64_clear_ic(); | 457 | psr = ia64_clear_ic(); |
@@ -469,7 +461,6 @@ int thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, u64 itir, | |||
469 | if (!(pte&VTLB_PTE_IO)) | 461 | if (!(pte&VTLB_PTE_IO)) |
470 | mark_pages_dirty(v, pte, ps); | 462 | mark_pages_dirty(v, pte, ps); |
471 | 463 | ||
472 | return ret; | ||
473 | } | 464 | } |
474 | 465 | ||
475 | /* | 466 | /* |
@@ -509,7 +500,6 @@ void thash_purge_all(struct kvm_vcpu *v) | |||
509 | local_flush_tlb_all(); | 500 | local_flush_tlb_all(); |
510 | } | 501 | } |
511 | 502 | ||
512 | |||
513 | /* | 503 | /* |
514 | * Lookup the hash table and its collision chain to find an entry | 504 | * Lookup the hash table and its collision chain to find an entry |
515 | * covering this address rid:va or the entry. | 505 | * covering this address rid:va or the entry. |
@@ -517,7 +507,6 @@ void thash_purge_all(struct kvm_vcpu *v) | |||
517 | * INPUT: | 507 | * INPUT: |
518 | * in: TLB format for both VHPT & TLB. | 508 | * in: TLB format for both VHPT & TLB. |
519 | */ | 509 | */ |
520 | |||
521 | struct thash_data *vtlb_lookup(struct kvm_vcpu *v, u64 va, int is_data) | 510 | struct thash_data *vtlb_lookup(struct kvm_vcpu *v, u64 va, int is_data) |
522 | { | 511 | { |
523 | struct thash_data *cch; | 512 | struct thash_data *cch; |
@@ -547,7 +536,6 @@ struct thash_data *vtlb_lookup(struct kvm_vcpu *v, u64 va, int is_data) | |||
547 | return NULL; | 536 | return NULL; |
548 | } | 537 | } |
549 | 538 | ||
550 | |||
551 | /* | 539 | /* |
552 | * Initialize internal control data before service. | 540 | * Initialize internal control data before service. |
553 | */ | 541 | */ |
@@ -573,6 +561,10 @@ void thash_init(struct thash_cb *hcb, u64 sz) | |||
573 | u64 kvm_get_mpt_entry(u64 gpfn) | 561 | u64 kvm_get_mpt_entry(u64 gpfn) |
574 | { | 562 | { |
575 | u64 *base = (u64 *) KVM_P2M_BASE; | 563 | u64 *base = (u64 *) KVM_P2M_BASE; |
564 | |||
565 | if (gpfn >= (KVM_P2M_SIZE >> 3)) | ||
566 | panic_vm(current_vcpu, "Invalid gpfn =%lx\n", gpfn); | ||
567 | |||
576 | return *(base + gpfn); | 568 | return *(base + gpfn); |
577 | } | 569 | } |
578 | 570 | ||
@@ -589,7 +581,6 @@ u64 kvm_gpa_to_mpa(u64 gpa) | |||
589 | return (pte >> PAGE_SHIFT << PAGE_SHIFT) | (gpa & ~PAGE_MASK); | 581 | return (pte >> PAGE_SHIFT << PAGE_SHIFT) | (gpa & ~PAGE_MASK); |
590 | } | 582 | } |
591 | 583 | ||
592 | |||
593 | /* | 584 | /* |
594 | * Fetch guest bundle code. | 585 | * Fetch guest bundle code. |
595 | * INPUT: | 586 | * INPUT: |
@@ -631,7 +622,6 @@ int fetch_code(struct kvm_vcpu *vcpu, u64 gip, IA64_BUNDLE *pbundle) | |||
631 | return IA64_NO_FAULT; | 622 | return IA64_NO_FAULT; |
632 | } | 623 | } |
633 | 624 | ||
634 | |||
635 | void kvm_init_vhpt(struct kvm_vcpu *v) | 625 | void kvm_init_vhpt(struct kvm_vcpu *v) |
636 | { | 626 | { |
637 | v->arch.vhpt.num = VHPT_NUM_ENTRIES; | 627 | v->arch.vhpt.num = VHPT_NUM_ENTRIES; |
diff --git a/arch/m32r/kernel/irq.c b/arch/m32r/kernel/irq.c index 2aeae4670098..8dfd31e87c4c 100644 --- a/arch/m32r/kernel/irq.c +++ b/arch/m32r/kernel/irq.c | |||
@@ -49,7 +49,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
49 | seq_printf(p, "%10u ", kstat_irqs(i)); | 49 | seq_printf(p, "%10u ", kstat_irqs(i)); |
50 | #else | 50 | #else |
51 | for_each_online_cpu(j) | 51 | for_each_online_cpu(j) |
52 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 52 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
53 | #endif | 53 | #endif |
54 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 54 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
55 | seq_printf(p, " %s", action->name); | 55 | seq_printf(p, " %s", action->name); |
diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile index 8133dbc44964..570d85c3f97f 100644 --- a/arch/m68k/Makefile +++ b/arch/m68k/Makefile | |||
@@ -117,3 +117,6 @@ endif | |||
117 | 117 | ||
118 | archclean: | 118 | archclean: |
119 | rm -f vmlinux.gz vmlinux.bz2 | 119 | rm -f vmlinux.gz vmlinux.bz2 |
120 | |||
121 | install: | ||
122 | sh $(srctree)/arch/m68k/install.sh $(KERNELRELEASE) vmlinux.gz System.map "$(INSTALL_PATH)" | ||
diff --git a/arch/m68k/include/asm/irq_mm.h b/arch/m68k/include/asm/irq_mm.h index 226bfc0f21b1..0cab42cad79e 100644 --- a/arch/m68k/include/asm/irq_mm.h +++ b/arch/m68k/include/asm/irq_mm.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <linux/linkage.h> | 4 | #include <linux/linkage.h> |
5 | #include <linux/hardirq.h> | 5 | #include <linux/hardirq.h> |
6 | #include <linux/irqreturn.h> | ||
6 | #include <linux/spinlock_types.h> | 7 | #include <linux/spinlock_types.h> |
7 | 8 | ||
8 | /* | 9 | /* |
@@ -80,7 +81,7 @@ struct pt_regs; | |||
80 | * interrupt source (if it supports chaining). | 81 | * interrupt source (if it supports chaining). |
81 | */ | 82 | */ |
82 | typedef struct irq_node { | 83 | typedef struct irq_node { |
83 | int (*handler)(int, void *); | 84 | irqreturn_t (*handler)(int, void *); |
84 | void *dev_id; | 85 | void *dev_id; |
85 | struct irq_node *next; | 86 | struct irq_node *next; |
86 | unsigned long flags; | 87 | unsigned long flags; |
diff --git a/arch/m68k/include/asm/macintosh.h b/arch/m68k/include/asm/macintosh.h index 05309f7e3d06..50db3591ca15 100644 --- a/arch/m68k/include/asm/macintosh.h +++ b/arch/m68k/include/asm/macintosh.h | |||
@@ -34,6 +34,7 @@ struct mac_model | |||
34 | char scc_type; | 34 | char scc_type; |
35 | char ether_type; | 35 | char ether_type; |
36 | char nubus_type; | 36 | char nubus_type; |
37 | char floppy_type; | ||
37 | }; | 38 | }; |
38 | 39 | ||
39 | #define MAC_ADB_NONE 0 | 40 | #define MAC_ADB_NONE 0 |
@@ -71,6 +72,12 @@ struct mac_model | |||
71 | #define MAC_NO_NUBUS 0 | 72 | #define MAC_NO_NUBUS 0 |
72 | #define MAC_NUBUS 1 | 73 | #define MAC_NUBUS 1 |
73 | 74 | ||
75 | #define MAC_FLOPPY_IWM 0 | ||
76 | #define MAC_FLOPPY_SWIM_ADDR1 1 | ||
77 | #define MAC_FLOPPY_SWIM_ADDR2 2 | ||
78 | #define MAC_FLOPPY_SWIM_IOP 3 | ||
79 | #define MAC_FLOPPY_AV 4 | ||
80 | |||
74 | /* | 81 | /* |
75 | * Gestalt numbers | 82 | * Gestalt numbers |
76 | */ | 83 | */ |
diff --git a/arch/m68k/include/asm/socket.h b/arch/m68k/include/asm/socket.h index dbc64e92c41a..ca87f938b03f 100644 --- a/arch/m68k/include/asm/socket.h +++ b/arch/m68k/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* _ASM_SOCKET_H */ | 60 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/m68k/install.sh b/arch/m68k/install.sh new file mode 100644 index 000000000000..9c6bae6112e3 --- /dev/null +++ b/arch/m68k/install.sh | |||
@@ -0,0 +1,52 @@ | |||
1 | #!/bin/sh | ||
2 | # | ||
3 | # This file is subject to the terms and conditions of the GNU General Public | ||
4 | # License. See the file "COPYING" in the main directory of this archive | ||
5 | # for more details. | ||
6 | # | ||
7 | # Copyright (C) 1995 by Linus Torvalds | ||
8 | # | ||
9 | # Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin | ||
10 | # | ||
11 | # "make install" script for m68k architecture | ||
12 | # | ||
13 | # Arguments: | ||
14 | # $1 - kernel version | ||
15 | # $2 - kernel image file | ||
16 | # $3 - kernel map file | ||
17 | # $4 - default install path (blank if root directory) | ||
18 | # | ||
19 | |||
20 | verify () { | ||
21 | if [ ! -f "$1" ]; then | ||
22 | echo "" 1>&2 | ||
23 | echo " *** Missing file: $1" 1>&2 | ||
24 | echo ' *** You need to run "make" before "make install".' 1>&2 | ||
25 | echo "" 1>&2 | ||
26 | exit 1 | ||
27 | fi | ||
28 | } | ||
29 | |||
30 | # Make sure the files actually exist | ||
31 | verify "$2" | ||
32 | verify "$3" | ||
33 | |||
34 | # User may have a custom install script | ||
35 | |||
36 | if [ -x ~/bin/${CROSS_COMPILE}installkernel ]; then exec ~/bin/${CROSS_COMPILE}installkernel "$@"; fi | ||
37 | if [ -x /sbin/${CROSS_COMPILE}installkernel ]; then exec /sbin/${CROSS_COMPILE}installkernel "$@"; fi | ||
38 | |||
39 | # Default install - same as make zlilo | ||
40 | |||
41 | if [ -f $4/vmlinuz ]; then | ||
42 | mv $4/vmlinuz $4/vmlinuz.old | ||
43 | fi | ||
44 | |||
45 | if [ -f $4/System.map ]; then | ||
46 | mv $4/System.map $4/System.old | ||
47 | fi | ||
48 | |||
49 | cat $2 > $4/vmlinuz | ||
50 | cp $3 $4/System.map | ||
51 | |||
52 | sync | ||
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index 98b6bcfb37bf..be017984a456 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c | |||
@@ -22,6 +22,7 @@ | |||
22 | /* keyb */ | 22 | /* keyb */ |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/vt_kern.h> | 24 | #include <linux/vt_kern.h> |
25 | #include <linux/platform_device.h> | ||
25 | 26 | ||
26 | #define BOOTINFO_COMPAT_1_0 | 27 | #define BOOTINFO_COMPAT_1_0 |
27 | #include <asm/setup.h> | 28 | #include <asm/setup.h> |
@@ -43,6 +44,10 @@ | |||
43 | #include <asm/mac_oss.h> | 44 | #include <asm/mac_oss.h> |
44 | #include <asm/mac_psc.h> | 45 | #include <asm/mac_psc.h> |
45 | 46 | ||
47 | /* platform device info */ | ||
48 | |||
49 | #define SWIM_IO_SIZE 0x2000 /* SWIM IO resource size */ | ||
50 | |||
46 | /* Mac bootinfo struct */ | 51 | /* Mac bootinfo struct */ |
47 | 52 | ||
48 | struct mac_booter_data mac_bi_data; | 53 | struct mac_booter_data mac_bi_data; |
@@ -224,7 +229,8 @@ static struct mac_model mac_data_table[] = { | |||
224 | .via_type = MAC_VIA_II, | 229 | .via_type = MAC_VIA_II, |
225 | .scsi_type = MAC_SCSI_OLD, | 230 | .scsi_type = MAC_SCSI_OLD, |
226 | .scc_type = MAC_SCC_II, | 231 | .scc_type = MAC_SCC_II, |
227 | .nubus_type = MAC_NUBUS | 232 | .nubus_type = MAC_NUBUS, |
233 | .floppy_type = MAC_FLOPPY_IWM | ||
228 | }, | 234 | }, |
229 | 235 | ||
230 | /* | 236 | /* |
@@ -239,7 +245,8 @@ static struct mac_model mac_data_table[] = { | |||
239 | .via_type = MAC_VIA_II, | 245 | .via_type = MAC_VIA_II, |
240 | .scsi_type = MAC_SCSI_OLD, | 246 | .scsi_type = MAC_SCSI_OLD, |
241 | .scc_type = MAC_SCC_II, | 247 | .scc_type = MAC_SCC_II, |
242 | .nubus_type = MAC_NUBUS | 248 | .nubus_type = MAC_NUBUS, |
249 | .floppy_type = MAC_FLOPPY_IWM | ||
243 | }, { | 250 | }, { |
244 | .ident = MAC_MODEL_IIX, | 251 | .ident = MAC_MODEL_IIX, |
245 | .name = "IIx", | 252 | .name = "IIx", |
@@ -247,7 +254,8 @@ static struct mac_model mac_data_table[] = { | |||
247 | .via_type = MAC_VIA_II, | 254 | .via_type = MAC_VIA_II, |
248 | .scsi_type = MAC_SCSI_OLD, | 255 | .scsi_type = MAC_SCSI_OLD, |
249 | .scc_type = MAC_SCC_II, | 256 | .scc_type = MAC_SCC_II, |
250 | .nubus_type = MAC_NUBUS | 257 | .nubus_type = MAC_NUBUS, |
258 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
251 | }, { | 259 | }, { |
252 | .ident = MAC_MODEL_IICX, | 260 | .ident = MAC_MODEL_IICX, |
253 | .name = "IIcx", | 261 | .name = "IIcx", |
@@ -255,7 +263,8 @@ static struct mac_model mac_data_table[] = { | |||
255 | .via_type = MAC_VIA_II, | 263 | .via_type = MAC_VIA_II, |
256 | .scsi_type = MAC_SCSI_OLD, | 264 | .scsi_type = MAC_SCSI_OLD, |
257 | .scc_type = MAC_SCC_II, | 265 | .scc_type = MAC_SCC_II, |
258 | .nubus_type = MAC_NUBUS | 266 | .nubus_type = MAC_NUBUS, |
267 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
259 | }, { | 268 | }, { |
260 | .ident = MAC_MODEL_SE30, | 269 | .ident = MAC_MODEL_SE30, |
261 | .name = "SE/30", | 270 | .name = "SE/30", |
@@ -263,7 +272,8 @@ static struct mac_model mac_data_table[] = { | |||
263 | .via_type = MAC_VIA_II, | 272 | .via_type = MAC_VIA_II, |
264 | .scsi_type = MAC_SCSI_OLD, | 273 | .scsi_type = MAC_SCSI_OLD, |
265 | .scc_type = MAC_SCC_II, | 274 | .scc_type = MAC_SCC_II, |
266 | .nubus_type = MAC_NUBUS | 275 | .nubus_type = MAC_NUBUS, |
276 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
267 | }, | 277 | }, |
268 | 278 | ||
269 | /* | 279 | /* |
@@ -280,7 +290,8 @@ static struct mac_model mac_data_table[] = { | |||
280 | .via_type = MAC_VIA_IIci, | 290 | .via_type = MAC_VIA_IIci, |
281 | .scsi_type = MAC_SCSI_OLD, | 291 | .scsi_type = MAC_SCSI_OLD, |
282 | .scc_type = MAC_SCC_II, | 292 | .scc_type = MAC_SCC_II, |
283 | .nubus_type = MAC_NUBUS | 293 | .nubus_type = MAC_NUBUS, |
294 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
284 | }, { | 295 | }, { |
285 | .ident = MAC_MODEL_IIFX, | 296 | .ident = MAC_MODEL_IIFX, |
286 | .name = "IIfx", | 297 | .name = "IIfx", |
@@ -288,7 +299,8 @@ static struct mac_model mac_data_table[] = { | |||
288 | .via_type = MAC_VIA_IIci, | 299 | .via_type = MAC_VIA_IIci, |
289 | .scsi_type = MAC_SCSI_OLD, | 300 | .scsi_type = MAC_SCSI_OLD, |
290 | .scc_type = MAC_SCC_IOP, | 301 | .scc_type = MAC_SCC_IOP, |
291 | .nubus_type = MAC_NUBUS | 302 | .nubus_type = MAC_NUBUS, |
303 | .floppy_type = MAC_FLOPPY_SWIM_IOP | ||
292 | }, { | 304 | }, { |
293 | .ident = MAC_MODEL_IISI, | 305 | .ident = MAC_MODEL_IISI, |
294 | .name = "IIsi", | 306 | .name = "IIsi", |
@@ -296,7 +308,8 @@ static struct mac_model mac_data_table[] = { | |||
296 | .via_type = MAC_VIA_IIci, | 308 | .via_type = MAC_VIA_IIci, |
297 | .scsi_type = MAC_SCSI_OLD, | 309 | .scsi_type = MAC_SCSI_OLD, |
298 | .scc_type = MAC_SCC_II, | 310 | .scc_type = MAC_SCC_II, |
299 | .nubus_type = MAC_NUBUS | 311 | .nubus_type = MAC_NUBUS, |
312 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
300 | }, { | 313 | }, { |
301 | .ident = MAC_MODEL_IIVI, | 314 | .ident = MAC_MODEL_IIVI, |
302 | .name = "IIvi", | 315 | .name = "IIvi", |
@@ -304,7 +317,8 @@ static struct mac_model mac_data_table[] = { | |||
304 | .via_type = MAC_VIA_IIci, | 317 | .via_type = MAC_VIA_IIci, |
305 | .scsi_type = MAC_SCSI_OLD, | 318 | .scsi_type = MAC_SCSI_OLD, |
306 | .scc_type = MAC_SCC_II, | 319 | .scc_type = MAC_SCC_II, |
307 | .nubus_type = MAC_NUBUS | 320 | .nubus_type = MAC_NUBUS, |
321 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
308 | }, { | 322 | }, { |
309 | .ident = MAC_MODEL_IIVX, | 323 | .ident = MAC_MODEL_IIVX, |
310 | .name = "IIvx", | 324 | .name = "IIvx", |
@@ -312,7 +326,8 @@ static struct mac_model mac_data_table[] = { | |||
312 | .via_type = MAC_VIA_IIci, | 326 | .via_type = MAC_VIA_IIci, |
313 | .scsi_type = MAC_SCSI_OLD, | 327 | .scsi_type = MAC_SCSI_OLD, |
314 | .scc_type = MAC_SCC_II, | 328 | .scc_type = MAC_SCC_II, |
315 | .nubus_type = MAC_NUBUS | 329 | .nubus_type = MAC_NUBUS, |
330 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
316 | }, | 331 | }, |
317 | 332 | ||
318 | /* | 333 | /* |
@@ -326,7 +341,8 @@ static struct mac_model mac_data_table[] = { | |||
326 | .via_type = MAC_VIA_IIci, | 341 | .via_type = MAC_VIA_IIci, |
327 | .scsi_type = MAC_SCSI_OLD, | 342 | .scsi_type = MAC_SCSI_OLD, |
328 | .scc_type = MAC_SCC_II, | 343 | .scc_type = MAC_SCC_II, |
329 | .nubus_type = MAC_NUBUS | 344 | .nubus_type = MAC_NUBUS, |
345 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
330 | }, { | 346 | }, { |
331 | .ident = MAC_MODEL_CCL, | 347 | .ident = MAC_MODEL_CCL, |
332 | .name = "Color Classic", | 348 | .name = "Color Classic", |
@@ -334,7 +350,9 @@ static struct mac_model mac_data_table[] = { | |||
334 | .via_type = MAC_VIA_IIci, | 350 | .via_type = MAC_VIA_IIci, |
335 | .scsi_type = MAC_SCSI_OLD, | 351 | .scsi_type = MAC_SCSI_OLD, |
336 | .scc_type = MAC_SCC_II, | 352 | .scc_type = MAC_SCC_II, |
337 | .nubus_type = MAC_NUBUS}, | 353 | .nubus_type = MAC_NUBUS, |
354 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
355 | }, | ||
338 | 356 | ||
339 | /* | 357 | /* |
340 | * Some Mac LC machines. Basically the same as the IIci, ADB like IIsi | 358 | * Some Mac LC machines. Basically the same as the IIci, ADB like IIsi |
@@ -347,7 +365,8 @@ static struct mac_model mac_data_table[] = { | |||
347 | .via_type = MAC_VIA_IIci, | 365 | .via_type = MAC_VIA_IIci, |
348 | .scsi_type = MAC_SCSI_OLD, | 366 | .scsi_type = MAC_SCSI_OLD, |
349 | .scc_type = MAC_SCC_II, | 367 | .scc_type = MAC_SCC_II, |
350 | .nubus_type = MAC_NUBUS | 368 | .nubus_type = MAC_NUBUS, |
369 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
351 | }, { | 370 | }, { |
352 | .ident = MAC_MODEL_LCII, | 371 | .ident = MAC_MODEL_LCII, |
353 | .name = "LC II", | 372 | .name = "LC II", |
@@ -355,7 +374,8 @@ static struct mac_model mac_data_table[] = { | |||
355 | .via_type = MAC_VIA_IIci, | 374 | .via_type = MAC_VIA_IIci, |
356 | .scsi_type = MAC_SCSI_OLD, | 375 | .scsi_type = MAC_SCSI_OLD, |
357 | .scc_type = MAC_SCC_II, | 376 | .scc_type = MAC_SCC_II, |
358 | .nubus_type = MAC_NUBUS | 377 | .nubus_type = MAC_NUBUS, |
378 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
359 | }, { | 379 | }, { |
360 | .ident = MAC_MODEL_LCIII, | 380 | .ident = MAC_MODEL_LCIII, |
361 | .name = "LC III", | 381 | .name = "LC III", |
@@ -363,7 +383,8 @@ static struct mac_model mac_data_table[] = { | |||
363 | .via_type = MAC_VIA_IIci, | 383 | .via_type = MAC_VIA_IIci, |
364 | .scsi_type = MAC_SCSI_OLD, | 384 | .scsi_type = MAC_SCSI_OLD, |
365 | .scc_type = MAC_SCC_II, | 385 | .scc_type = MAC_SCC_II, |
366 | .nubus_type = MAC_NUBUS | 386 | .nubus_type = MAC_NUBUS, |
387 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
367 | }, | 388 | }, |
368 | 389 | ||
369 | /* | 390 | /* |
@@ -383,7 +404,8 @@ static struct mac_model mac_data_table[] = { | |||
383 | .via_type = MAC_VIA_QUADRA, | 404 | .via_type = MAC_VIA_QUADRA, |
384 | .scsi_type = MAC_SCSI_QUADRA, | 405 | .scsi_type = MAC_SCSI_QUADRA, |
385 | .scc_type = MAC_SCC_QUADRA, | 406 | .scc_type = MAC_SCC_QUADRA, |
386 | .nubus_type = MAC_NUBUS | 407 | .nubus_type = MAC_NUBUS, |
408 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
387 | }, { | 409 | }, { |
388 | .ident = MAC_MODEL_Q605_ACC, | 410 | .ident = MAC_MODEL_Q605_ACC, |
389 | .name = "Quadra 605", | 411 | .name = "Quadra 605", |
@@ -391,7 +413,8 @@ static struct mac_model mac_data_table[] = { | |||
391 | .via_type = MAC_VIA_QUADRA, | 413 | .via_type = MAC_VIA_QUADRA, |
392 | .scsi_type = MAC_SCSI_QUADRA, | 414 | .scsi_type = MAC_SCSI_QUADRA, |
393 | .scc_type = MAC_SCC_QUADRA, | 415 | .scc_type = MAC_SCC_QUADRA, |
394 | .nubus_type = MAC_NUBUS | 416 | .nubus_type = MAC_NUBUS, |
417 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
395 | }, { | 418 | }, { |
396 | .ident = MAC_MODEL_Q610, | 419 | .ident = MAC_MODEL_Q610, |
397 | .name = "Quadra 610", | 420 | .name = "Quadra 610", |
@@ -400,7 +423,8 @@ static struct mac_model mac_data_table[] = { | |||
400 | .scsi_type = MAC_SCSI_QUADRA, | 423 | .scsi_type = MAC_SCSI_QUADRA, |
401 | .scc_type = MAC_SCC_QUADRA, | 424 | .scc_type = MAC_SCC_QUADRA, |
402 | .ether_type = MAC_ETHER_SONIC, | 425 | .ether_type = MAC_ETHER_SONIC, |
403 | .nubus_type = MAC_NUBUS | 426 | .nubus_type = MAC_NUBUS, |
427 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
404 | }, { | 428 | }, { |
405 | .ident = MAC_MODEL_Q630, | 429 | .ident = MAC_MODEL_Q630, |
406 | .name = "Quadra 630", | 430 | .name = "Quadra 630", |
@@ -410,7 +434,8 @@ static struct mac_model mac_data_table[] = { | |||
410 | .ide_type = MAC_IDE_QUADRA, | 434 | .ide_type = MAC_IDE_QUADRA, |
411 | .scc_type = MAC_SCC_QUADRA, | 435 | .scc_type = MAC_SCC_QUADRA, |
412 | .ether_type = MAC_ETHER_SONIC, | 436 | .ether_type = MAC_ETHER_SONIC, |
413 | .nubus_type = MAC_NUBUS | 437 | .nubus_type = MAC_NUBUS, |
438 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
414 | }, { | 439 | }, { |
415 | .ident = MAC_MODEL_Q650, | 440 | .ident = MAC_MODEL_Q650, |
416 | .name = "Quadra 650", | 441 | .name = "Quadra 650", |
@@ -419,7 +444,8 @@ static struct mac_model mac_data_table[] = { | |||
419 | .scsi_type = MAC_SCSI_QUADRA, | 444 | .scsi_type = MAC_SCSI_QUADRA, |
420 | .scc_type = MAC_SCC_QUADRA, | 445 | .scc_type = MAC_SCC_QUADRA, |
421 | .ether_type = MAC_ETHER_SONIC, | 446 | .ether_type = MAC_ETHER_SONIC, |
422 | .nubus_type = MAC_NUBUS | 447 | .nubus_type = MAC_NUBUS, |
448 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
423 | }, | 449 | }, |
424 | /* The Q700 does have a NS Sonic */ | 450 | /* The Q700 does have a NS Sonic */ |
425 | { | 451 | { |
@@ -430,7 +456,8 @@ static struct mac_model mac_data_table[] = { | |||
430 | .scsi_type = MAC_SCSI_QUADRA2, | 456 | .scsi_type = MAC_SCSI_QUADRA2, |
431 | .scc_type = MAC_SCC_QUADRA, | 457 | .scc_type = MAC_SCC_QUADRA, |
432 | .ether_type = MAC_ETHER_SONIC, | 458 | .ether_type = MAC_ETHER_SONIC, |
433 | .nubus_type = MAC_NUBUS | 459 | .nubus_type = MAC_NUBUS, |
460 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
434 | }, { | 461 | }, { |
435 | .ident = MAC_MODEL_Q800, | 462 | .ident = MAC_MODEL_Q800, |
436 | .name = "Quadra 800", | 463 | .name = "Quadra 800", |
@@ -439,7 +466,8 @@ static struct mac_model mac_data_table[] = { | |||
439 | .scsi_type = MAC_SCSI_QUADRA, | 466 | .scsi_type = MAC_SCSI_QUADRA, |
440 | .scc_type = MAC_SCC_QUADRA, | 467 | .scc_type = MAC_SCC_QUADRA, |
441 | .ether_type = MAC_ETHER_SONIC, | 468 | .ether_type = MAC_ETHER_SONIC, |
442 | .nubus_type = MAC_NUBUS | 469 | .nubus_type = MAC_NUBUS, |
470 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
443 | }, { | 471 | }, { |
444 | .ident = MAC_MODEL_Q840, | 472 | .ident = MAC_MODEL_Q840, |
445 | .name = "Quadra 840AV", | 473 | .name = "Quadra 840AV", |
@@ -448,7 +476,8 @@ static struct mac_model mac_data_table[] = { | |||
448 | .scsi_type = MAC_SCSI_QUADRA3, | 476 | .scsi_type = MAC_SCSI_QUADRA3, |
449 | .scc_type = MAC_SCC_PSC, | 477 | .scc_type = MAC_SCC_PSC, |
450 | .ether_type = MAC_ETHER_MACE, | 478 | .ether_type = MAC_ETHER_MACE, |
451 | .nubus_type = MAC_NUBUS | 479 | .nubus_type = MAC_NUBUS, |
480 | .floppy_type = MAC_FLOPPY_AV | ||
452 | }, { | 481 | }, { |
453 | .ident = MAC_MODEL_Q900, | 482 | .ident = MAC_MODEL_Q900, |
454 | .name = "Quadra 900", | 483 | .name = "Quadra 900", |
@@ -457,7 +486,8 @@ static struct mac_model mac_data_table[] = { | |||
457 | .scsi_type = MAC_SCSI_QUADRA2, | 486 | .scsi_type = MAC_SCSI_QUADRA2, |
458 | .scc_type = MAC_SCC_IOP, | 487 | .scc_type = MAC_SCC_IOP, |
459 | .ether_type = MAC_ETHER_SONIC, | 488 | .ether_type = MAC_ETHER_SONIC, |
460 | .nubus_type = MAC_NUBUS | 489 | .nubus_type = MAC_NUBUS, |
490 | .floppy_type = MAC_FLOPPY_SWIM_IOP | ||
461 | }, { | 491 | }, { |
462 | .ident = MAC_MODEL_Q950, | 492 | .ident = MAC_MODEL_Q950, |
463 | .name = "Quadra 950", | 493 | .name = "Quadra 950", |
@@ -466,7 +496,8 @@ static struct mac_model mac_data_table[] = { | |||
466 | .scsi_type = MAC_SCSI_QUADRA2, | 496 | .scsi_type = MAC_SCSI_QUADRA2, |
467 | .scc_type = MAC_SCC_IOP, | 497 | .scc_type = MAC_SCC_IOP, |
468 | .ether_type = MAC_ETHER_SONIC, | 498 | .ether_type = MAC_ETHER_SONIC, |
469 | .nubus_type = MAC_NUBUS | 499 | .nubus_type = MAC_NUBUS, |
500 | .floppy_type = MAC_FLOPPY_SWIM_IOP | ||
470 | }, | 501 | }, |
471 | 502 | ||
472 | /* | 503 | /* |
@@ -480,7 +511,8 @@ static struct mac_model mac_data_table[] = { | |||
480 | .via_type = MAC_VIA_IIci, | 511 | .via_type = MAC_VIA_IIci, |
481 | .scsi_type = MAC_SCSI_OLD, | 512 | .scsi_type = MAC_SCSI_OLD, |
482 | .scc_type = MAC_SCC_II, | 513 | .scc_type = MAC_SCC_II, |
483 | .nubus_type = MAC_NUBUS | 514 | .nubus_type = MAC_NUBUS, |
515 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
484 | }, { | 516 | }, { |
485 | .ident = MAC_MODEL_P475, | 517 | .ident = MAC_MODEL_P475, |
486 | .name = "Performa 475", | 518 | .name = "Performa 475", |
@@ -488,7 +520,8 @@ static struct mac_model mac_data_table[] = { | |||
488 | .via_type = MAC_VIA_QUADRA, | 520 | .via_type = MAC_VIA_QUADRA, |
489 | .scsi_type = MAC_SCSI_QUADRA, | 521 | .scsi_type = MAC_SCSI_QUADRA, |
490 | .scc_type = MAC_SCC_II, | 522 | .scc_type = MAC_SCC_II, |
491 | .nubus_type = MAC_NUBUS | 523 | .nubus_type = MAC_NUBUS, |
524 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
492 | }, { | 525 | }, { |
493 | .ident = MAC_MODEL_P475F, | 526 | .ident = MAC_MODEL_P475F, |
494 | .name = "Performa 475", | 527 | .name = "Performa 475", |
@@ -496,7 +529,8 @@ static struct mac_model mac_data_table[] = { | |||
496 | .via_type = MAC_VIA_QUADRA, | 529 | .via_type = MAC_VIA_QUADRA, |
497 | .scsi_type = MAC_SCSI_QUADRA, | 530 | .scsi_type = MAC_SCSI_QUADRA, |
498 | .scc_type = MAC_SCC_II, | 531 | .scc_type = MAC_SCC_II, |
499 | .nubus_type = MAC_NUBUS | 532 | .nubus_type = MAC_NUBUS, |
533 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
500 | }, { | 534 | }, { |
501 | .ident = MAC_MODEL_P520, | 535 | .ident = MAC_MODEL_P520, |
502 | .name = "Performa 520", | 536 | .name = "Performa 520", |
@@ -504,7 +538,8 @@ static struct mac_model mac_data_table[] = { | |||
504 | .via_type = MAC_VIA_IIci, | 538 | .via_type = MAC_VIA_IIci, |
505 | .scsi_type = MAC_SCSI_OLD, | 539 | .scsi_type = MAC_SCSI_OLD, |
506 | .scc_type = MAC_SCC_II, | 540 | .scc_type = MAC_SCC_II, |
507 | .nubus_type = MAC_NUBUS | 541 | .nubus_type = MAC_NUBUS, |
542 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
508 | }, { | 543 | }, { |
509 | .ident = MAC_MODEL_P550, | 544 | .ident = MAC_MODEL_P550, |
510 | .name = "Performa 550", | 545 | .name = "Performa 550", |
@@ -512,7 +547,8 @@ static struct mac_model mac_data_table[] = { | |||
512 | .via_type = MAC_VIA_IIci, | 547 | .via_type = MAC_VIA_IIci, |
513 | .scsi_type = MAC_SCSI_OLD, | 548 | .scsi_type = MAC_SCSI_OLD, |
514 | .scc_type = MAC_SCC_II, | 549 | .scc_type = MAC_SCC_II, |
515 | .nubus_type = MAC_NUBUS | 550 | .nubus_type = MAC_NUBUS, |
551 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
516 | }, | 552 | }, |
517 | /* These have the comm slot, and therefore the possibility of SONIC ethernet */ | 553 | /* These have the comm slot, and therefore the possibility of SONIC ethernet */ |
518 | { | 554 | { |
@@ -523,7 +559,8 @@ static struct mac_model mac_data_table[] = { | |||
523 | .scsi_type = MAC_SCSI_QUADRA, | 559 | .scsi_type = MAC_SCSI_QUADRA, |
524 | .scc_type = MAC_SCC_II, | 560 | .scc_type = MAC_SCC_II, |
525 | .ether_type = MAC_ETHER_SONIC, | 561 | .ether_type = MAC_ETHER_SONIC, |
526 | .nubus_type = MAC_NUBUS | 562 | .nubus_type = MAC_NUBUS, |
563 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
527 | }, { | 564 | }, { |
528 | .ident = MAC_MODEL_P588, | 565 | .ident = MAC_MODEL_P588, |
529 | .name = "Performa 588", | 566 | .name = "Performa 588", |
@@ -533,7 +570,8 @@ static struct mac_model mac_data_table[] = { | |||
533 | .ide_type = MAC_IDE_QUADRA, | 570 | .ide_type = MAC_IDE_QUADRA, |
534 | .scc_type = MAC_SCC_II, | 571 | .scc_type = MAC_SCC_II, |
535 | .ether_type = MAC_ETHER_SONIC, | 572 | .ether_type = MAC_ETHER_SONIC, |
536 | .nubus_type = MAC_NUBUS | 573 | .nubus_type = MAC_NUBUS, |
574 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
537 | }, { | 575 | }, { |
538 | .ident = MAC_MODEL_TV, | 576 | .ident = MAC_MODEL_TV, |
539 | .name = "TV", | 577 | .name = "TV", |
@@ -541,7 +579,8 @@ static struct mac_model mac_data_table[] = { | |||
541 | .via_type = MAC_VIA_QUADRA, | 579 | .via_type = MAC_VIA_QUADRA, |
542 | .scsi_type = MAC_SCSI_OLD, | 580 | .scsi_type = MAC_SCSI_OLD, |
543 | .scc_type = MAC_SCC_II, | 581 | .scc_type = MAC_SCC_II, |
544 | .nubus_type = MAC_NUBUS | 582 | .nubus_type = MAC_NUBUS, |
583 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
545 | }, { | 584 | }, { |
546 | .ident = MAC_MODEL_P600, | 585 | .ident = MAC_MODEL_P600, |
547 | .name = "Performa 600", | 586 | .name = "Performa 600", |
@@ -549,7 +588,8 @@ static struct mac_model mac_data_table[] = { | |||
549 | .via_type = MAC_VIA_IIci, | 588 | .via_type = MAC_VIA_IIci, |
550 | .scsi_type = MAC_SCSI_OLD, | 589 | .scsi_type = MAC_SCSI_OLD, |
551 | .scc_type = MAC_SCC_II, | 590 | .scc_type = MAC_SCC_II, |
552 | .nubus_type = MAC_NUBUS | 591 | .nubus_type = MAC_NUBUS, |
592 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
553 | }, | 593 | }, |
554 | 594 | ||
555 | /* | 595 | /* |
@@ -565,7 +605,8 @@ static struct mac_model mac_data_table[] = { | |||
565 | .scsi_type = MAC_SCSI_QUADRA, | 605 | .scsi_type = MAC_SCSI_QUADRA, |
566 | .scc_type = MAC_SCC_QUADRA, | 606 | .scc_type = MAC_SCC_QUADRA, |
567 | .ether_type = MAC_ETHER_SONIC, | 607 | .ether_type = MAC_ETHER_SONIC, |
568 | .nubus_type = MAC_NUBUS | 608 | .nubus_type = MAC_NUBUS, |
609 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
569 | }, { | 610 | }, { |
570 | .ident = MAC_MODEL_C650, | 611 | .ident = MAC_MODEL_C650, |
571 | .name = "Centris 650", | 612 | .name = "Centris 650", |
@@ -574,7 +615,8 @@ static struct mac_model mac_data_table[] = { | |||
574 | .scsi_type = MAC_SCSI_QUADRA, | 615 | .scsi_type = MAC_SCSI_QUADRA, |
575 | .scc_type = MAC_SCC_QUADRA, | 616 | .scc_type = MAC_SCC_QUADRA, |
576 | .ether_type = MAC_ETHER_SONIC, | 617 | .ether_type = MAC_ETHER_SONIC, |
577 | .nubus_type = MAC_NUBUS | 618 | .nubus_type = MAC_NUBUS, |
619 | .floppy_type = MAC_FLOPPY_SWIM_ADDR1 | ||
578 | }, { | 620 | }, { |
579 | .ident = MAC_MODEL_C660, | 621 | .ident = MAC_MODEL_C660, |
580 | .name = "Centris 660AV", | 622 | .name = "Centris 660AV", |
@@ -583,7 +625,8 @@ static struct mac_model mac_data_table[] = { | |||
583 | .scsi_type = MAC_SCSI_QUADRA3, | 625 | .scsi_type = MAC_SCSI_QUADRA3, |
584 | .scc_type = MAC_SCC_PSC, | 626 | .scc_type = MAC_SCC_PSC, |
585 | .ether_type = MAC_ETHER_MACE, | 627 | .ether_type = MAC_ETHER_MACE, |
586 | .nubus_type = MAC_NUBUS | 628 | .nubus_type = MAC_NUBUS, |
629 | .floppy_type = MAC_FLOPPY_AV | ||
587 | }, | 630 | }, |
588 | 631 | ||
589 | /* | 632 | /* |
@@ -599,7 +642,8 @@ static struct mac_model mac_data_table[] = { | |||
599 | .via_type = MAC_VIA_QUADRA, | 642 | .via_type = MAC_VIA_QUADRA, |
600 | .scsi_type = MAC_SCSI_OLD, | 643 | .scsi_type = MAC_SCSI_OLD, |
601 | .scc_type = MAC_SCC_QUADRA, | 644 | .scc_type = MAC_SCC_QUADRA, |
602 | .nubus_type = MAC_NUBUS | 645 | .nubus_type = MAC_NUBUS, |
646 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
603 | }, { | 647 | }, { |
604 | .ident = MAC_MODEL_PB145, | 648 | .ident = MAC_MODEL_PB145, |
605 | .name = "PowerBook 145", | 649 | .name = "PowerBook 145", |
@@ -607,7 +651,8 @@ static struct mac_model mac_data_table[] = { | |||
607 | .via_type = MAC_VIA_QUADRA, | 651 | .via_type = MAC_VIA_QUADRA, |
608 | .scsi_type = MAC_SCSI_OLD, | 652 | .scsi_type = MAC_SCSI_OLD, |
609 | .scc_type = MAC_SCC_QUADRA, | 653 | .scc_type = MAC_SCC_QUADRA, |
610 | .nubus_type = MAC_NUBUS | 654 | .nubus_type = MAC_NUBUS, |
655 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
611 | }, { | 656 | }, { |
612 | .ident = MAC_MODEL_PB150, | 657 | .ident = MAC_MODEL_PB150, |
613 | .name = "PowerBook 150", | 658 | .name = "PowerBook 150", |
@@ -616,7 +661,8 @@ static struct mac_model mac_data_table[] = { | |||
616 | .scsi_type = MAC_SCSI_OLD, | 661 | .scsi_type = MAC_SCSI_OLD, |
617 | .ide_type = MAC_IDE_PB, | 662 | .ide_type = MAC_IDE_PB, |
618 | .scc_type = MAC_SCC_QUADRA, | 663 | .scc_type = MAC_SCC_QUADRA, |
619 | .nubus_type = MAC_NUBUS | 664 | .nubus_type = MAC_NUBUS, |
665 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
620 | }, { | 666 | }, { |
621 | .ident = MAC_MODEL_PB160, | 667 | .ident = MAC_MODEL_PB160, |
622 | .name = "PowerBook 160", | 668 | .name = "PowerBook 160", |
@@ -624,7 +670,8 @@ static struct mac_model mac_data_table[] = { | |||
624 | .via_type = MAC_VIA_QUADRA, | 670 | .via_type = MAC_VIA_QUADRA, |
625 | .scsi_type = MAC_SCSI_OLD, | 671 | .scsi_type = MAC_SCSI_OLD, |
626 | .scc_type = MAC_SCC_QUADRA, | 672 | .scc_type = MAC_SCC_QUADRA, |
627 | .nubus_type = MAC_NUBUS | 673 | .nubus_type = MAC_NUBUS, |
674 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
628 | }, { | 675 | }, { |
629 | .ident = MAC_MODEL_PB165, | 676 | .ident = MAC_MODEL_PB165, |
630 | .name = "PowerBook 165", | 677 | .name = "PowerBook 165", |
@@ -632,7 +679,8 @@ static struct mac_model mac_data_table[] = { | |||
632 | .via_type = MAC_VIA_QUADRA, | 679 | .via_type = MAC_VIA_QUADRA, |
633 | .scsi_type = MAC_SCSI_OLD, | 680 | .scsi_type = MAC_SCSI_OLD, |
634 | .scc_type = MAC_SCC_QUADRA, | 681 | .scc_type = MAC_SCC_QUADRA, |
635 | .nubus_type = MAC_NUBUS | 682 | .nubus_type = MAC_NUBUS, |
683 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
636 | }, { | 684 | }, { |
637 | .ident = MAC_MODEL_PB165C, | 685 | .ident = MAC_MODEL_PB165C, |
638 | .name = "PowerBook 165c", | 686 | .name = "PowerBook 165c", |
@@ -640,7 +688,8 @@ static struct mac_model mac_data_table[] = { | |||
640 | .via_type = MAC_VIA_QUADRA, | 688 | .via_type = MAC_VIA_QUADRA, |
641 | .scsi_type = MAC_SCSI_OLD, | 689 | .scsi_type = MAC_SCSI_OLD, |
642 | .scc_type = MAC_SCC_QUADRA, | 690 | .scc_type = MAC_SCC_QUADRA, |
643 | .nubus_type = MAC_NUBUS | 691 | .nubus_type = MAC_NUBUS, |
692 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
644 | }, { | 693 | }, { |
645 | .ident = MAC_MODEL_PB170, | 694 | .ident = MAC_MODEL_PB170, |
646 | .name = "PowerBook 170", | 695 | .name = "PowerBook 170", |
@@ -648,7 +697,8 @@ static struct mac_model mac_data_table[] = { | |||
648 | .via_type = MAC_VIA_QUADRA, | 697 | .via_type = MAC_VIA_QUADRA, |
649 | .scsi_type = MAC_SCSI_OLD, | 698 | .scsi_type = MAC_SCSI_OLD, |
650 | .scc_type = MAC_SCC_QUADRA, | 699 | .scc_type = MAC_SCC_QUADRA, |
651 | .nubus_type = MAC_NUBUS | 700 | .nubus_type = MAC_NUBUS, |
701 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
652 | }, { | 702 | }, { |
653 | .ident = MAC_MODEL_PB180, | 703 | .ident = MAC_MODEL_PB180, |
654 | .name = "PowerBook 180", | 704 | .name = "PowerBook 180", |
@@ -656,7 +706,8 @@ static struct mac_model mac_data_table[] = { | |||
656 | .via_type = MAC_VIA_QUADRA, | 706 | .via_type = MAC_VIA_QUADRA, |
657 | .scsi_type = MAC_SCSI_OLD, | 707 | .scsi_type = MAC_SCSI_OLD, |
658 | .scc_type = MAC_SCC_QUADRA, | 708 | .scc_type = MAC_SCC_QUADRA, |
659 | .nubus_type = MAC_NUBUS | 709 | .nubus_type = MAC_NUBUS, |
710 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
660 | }, { | 711 | }, { |
661 | .ident = MAC_MODEL_PB180C, | 712 | .ident = MAC_MODEL_PB180C, |
662 | .name = "PowerBook 180c", | 713 | .name = "PowerBook 180c", |
@@ -664,7 +715,8 @@ static struct mac_model mac_data_table[] = { | |||
664 | .via_type = MAC_VIA_QUADRA, | 715 | .via_type = MAC_VIA_QUADRA, |
665 | .scsi_type = MAC_SCSI_OLD, | 716 | .scsi_type = MAC_SCSI_OLD, |
666 | .scc_type = MAC_SCC_QUADRA, | 717 | .scc_type = MAC_SCC_QUADRA, |
667 | .nubus_type = MAC_NUBUS | 718 | .nubus_type = MAC_NUBUS, |
719 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
668 | }, { | 720 | }, { |
669 | .ident = MAC_MODEL_PB190, | 721 | .ident = MAC_MODEL_PB190, |
670 | .name = "PowerBook 190", | 722 | .name = "PowerBook 190", |
@@ -673,7 +725,8 @@ static struct mac_model mac_data_table[] = { | |||
673 | .scsi_type = MAC_SCSI_OLD, | 725 | .scsi_type = MAC_SCSI_OLD, |
674 | .ide_type = MAC_IDE_BABOON, | 726 | .ide_type = MAC_IDE_BABOON, |
675 | .scc_type = MAC_SCC_QUADRA, | 727 | .scc_type = MAC_SCC_QUADRA, |
676 | .nubus_type = MAC_NUBUS | 728 | .nubus_type = MAC_NUBUS, |
729 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
677 | }, { | 730 | }, { |
678 | .ident = MAC_MODEL_PB520, | 731 | .ident = MAC_MODEL_PB520, |
679 | .name = "PowerBook 520", | 732 | .name = "PowerBook 520", |
@@ -682,7 +735,8 @@ static struct mac_model mac_data_table[] = { | |||
682 | .scsi_type = MAC_SCSI_OLD, | 735 | .scsi_type = MAC_SCSI_OLD, |
683 | .scc_type = MAC_SCC_QUADRA, | 736 | .scc_type = MAC_SCC_QUADRA, |
684 | .ether_type = MAC_ETHER_SONIC, | 737 | .ether_type = MAC_ETHER_SONIC, |
685 | .nubus_type = MAC_NUBUS | 738 | .nubus_type = MAC_NUBUS, |
739 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
686 | }, | 740 | }, |
687 | 741 | ||
688 | /* | 742 | /* |
@@ -702,7 +756,8 @@ static struct mac_model mac_data_table[] = { | |||
702 | .via_type = MAC_VIA_IIci, | 756 | .via_type = MAC_VIA_IIci, |
703 | .scsi_type = MAC_SCSI_OLD, | 757 | .scsi_type = MAC_SCSI_OLD, |
704 | .scc_type = MAC_SCC_QUADRA, | 758 | .scc_type = MAC_SCC_QUADRA, |
705 | .nubus_type = MAC_NUBUS | 759 | .nubus_type = MAC_NUBUS, |
760 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
706 | }, { | 761 | }, { |
707 | .ident = MAC_MODEL_PB230, | 762 | .ident = MAC_MODEL_PB230, |
708 | .name = "PowerBook Duo 230", | 763 | .name = "PowerBook Duo 230", |
@@ -710,7 +765,8 @@ static struct mac_model mac_data_table[] = { | |||
710 | .via_type = MAC_VIA_IIci, | 765 | .via_type = MAC_VIA_IIci, |
711 | .scsi_type = MAC_SCSI_OLD, | 766 | .scsi_type = MAC_SCSI_OLD, |
712 | .scc_type = MAC_SCC_QUADRA, | 767 | .scc_type = MAC_SCC_QUADRA, |
713 | .nubus_type = MAC_NUBUS | 768 | .nubus_type = MAC_NUBUS, |
769 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
714 | }, { | 770 | }, { |
715 | .ident = MAC_MODEL_PB250, | 771 | .ident = MAC_MODEL_PB250, |
716 | .name = "PowerBook Duo 250", | 772 | .name = "PowerBook Duo 250", |
@@ -718,7 +774,8 @@ static struct mac_model mac_data_table[] = { | |||
718 | .via_type = MAC_VIA_IIci, | 774 | .via_type = MAC_VIA_IIci, |
719 | .scsi_type = MAC_SCSI_OLD, | 775 | .scsi_type = MAC_SCSI_OLD, |
720 | .scc_type = MAC_SCC_QUADRA, | 776 | .scc_type = MAC_SCC_QUADRA, |
721 | .nubus_type = MAC_NUBUS | 777 | .nubus_type = MAC_NUBUS, |
778 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
722 | }, { | 779 | }, { |
723 | .ident = MAC_MODEL_PB270C, | 780 | .ident = MAC_MODEL_PB270C, |
724 | .name = "PowerBook Duo 270c", | 781 | .name = "PowerBook Duo 270c", |
@@ -726,7 +783,8 @@ static struct mac_model mac_data_table[] = { | |||
726 | .via_type = MAC_VIA_IIci, | 783 | .via_type = MAC_VIA_IIci, |
727 | .scsi_type = MAC_SCSI_OLD, | 784 | .scsi_type = MAC_SCSI_OLD, |
728 | .scc_type = MAC_SCC_QUADRA, | 785 | .scc_type = MAC_SCC_QUADRA, |
729 | .nubus_type = MAC_NUBUS | 786 | .nubus_type = MAC_NUBUS, |
787 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
730 | }, { | 788 | }, { |
731 | .ident = MAC_MODEL_PB280, | 789 | .ident = MAC_MODEL_PB280, |
732 | .name = "PowerBook Duo 280", | 790 | .name = "PowerBook Duo 280", |
@@ -734,7 +792,8 @@ static struct mac_model mac_data_table[] = { | |||
734 | .via_type = MAC_VIA_IIci, | 792 | .via_type = MAC_VIA_IIci, |
735 | .scsi_type = MAC_SCSI_OLD, | 793 | .scsi_type = MAC_SCSI_OLD, |
736 | .scc_type = MAC_SCC_QUADRA, | 794 | .scc_type = MAC_SCC_QUADRA, |
737 | .nubus_type = MAC_NUBUS | 795 | .nubus_type = MAC_NUBUS, |
796 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
738 | }, { | 797 | }, { |
739 | .ident = MAC_MODEL_PB280C, | 798 | .ident = MAC_MODEL_PB280C, |
740 | .name = "PowerBook Duo 280c", | 799 | .name = "PowerBook Duo 280c", |
@@ -742,7 +801,8 @@ static struct mac_model mac_data_table[] = { | |||
742 | .via_type = MAC_VIA_IIci, | 801 | .via_type = MAC_VIA_IIci, |
743 | .scsi_type = MAC_SCSI_OLD, | 802 | .scsi_type = MAC_SCSI_OLD, |
744 | .scc_type = MAC_SCC_QUADRA, | 803 | .scc_type = MAC_SCC_QUADRA, |
745 | .nubus_type = MAC_NUBUS | 804 | .nubus_type = MAC_NUBUS, |
805 | .floppy_type = MAC_FLOPPY_SWIM_ADDR2 | ||
746 | }, | 806 | }, |
747 | 807 | ||
748 | /* | 808 | /* |
@@ -815,3 +875,42 @@ static void mac_get_model(char *str) | |||
815 | strcpy(str, "Macintosh "); | 875 | strcpy(str, "Macintosh "); |
816 | strcat(str, macintosh_config->name); | 876 | strcat(str, macintosh_config->name); |
817 | } | 877 | } |
878 | |||
879 | static struct resource swim_resources[1]; | ||
880 | |||
881 | static struct platform_device swim_device = { | ||
882 | .name = "swim", | ||
883 | .id = -1, | ||
884 | .num_resources = ARRAY_SIZE(swim_resources), | ||
885 | .resource = swim_resources, | ||
886 | }; | ||
887 | |||
888 | static struct platform_device *mac_platform_devices[] __initdata = { | ||
889 | &swim_device | ||
890 | }; | ||
891 | |||
892 | int __init mac_platform_init(void) | ||
893 | { | ||
894 | u8 *swim_base; | ||
895 | |||
896 | switch (macintosh_config->floppy_type) { | ||
897 | case MAC_FLOPPY_SWIM_ADDR1: | ||
898 | swim_base = (u8 *)(VIA1_BASE + 0x1E000); | ||
899 | break; | ||
900 | case MAC_FLOPPY_SWIM_ADDR2: | ||
901 | swim_base = (u8 *)(VIA1_BASE + 0x16000); | ||
902 | break; | ||
903 | default: | ||
904 | return 0; | ||
905 | } | ||
906 | |||
907 | swim_resources[0].name = "swim-regs"; | ||
908 | swim_resources[0].start = (resource_size_t)swim_base; | ||
909 | swim_resources[0].end = (resource_size_t)(swim_base + SWIM_IO_SIZE); | ||
910 | swim_resources[0].flags = IORESOURCE_MEM; | ||
911 | |||
912 | return platform_add_devices(mac_platform_devices, | ||
913 | ARRAY_SIZE(mac_platform_devices)); | ||
914 | } | ||
915 | |||
916 | arch_initcall(mac_platform_init); | ||
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c index 7d97ba54536e..11bce3cb6482 100644 --- a/arch/m68k/mac/via.c +++ b/arch/m68k/mac/via.c | |||
@@ -645,3 +645,12 @@ int via_irq_pending(int irq) | |||
645 | } | 645 | } |
646 | return 0; | 646 | return 0; |
647 | } | 647 | } |
648 | |||
649 | void via1_set_head(int head) | ||
650 | { | ||
651 | if (head == 0) | ||
652 | via1[vBufA] &= ~VIA1A_vHeadSel; | ||
653 | else | ||
654 | via1[vBufA] |= VIA1A_vHeadSel; | ||
655 | } | ||
656 | EXPORT_SYMBOL(via1_set_head); | ||
diff --git a/arch/m68knommu/platform/520x/config.c b/arch/m68knommu/platform/520x/config.c index 06d887cdcbfb..855fc6a79d72 100644 --- a/arch/m68knommu/platform/520x/config.c +++ b/arch/m68knommu/platform/520x/config.c | |||
@@ -49,8 +49,39 @@ static struct platform_device m520x_uart = { | |||
49 | .dev.platform_data = m520x_uart_platform, | 49 | .dev.platform_data = m520x_uart_platform, |
50 | }; | 50 | }; |
51 | 51 | ||
52 | static struct resource m520x_fec_resources[] = { | ||
53 | { | ||
54 | .start = MCF_MBAR + 0x30000, | ||
55 | .end = MCF_MBAR + 0x30000 + 0x7ff, | ||
56 | .flags = IORESOURCE_MEM, | ||
57 | }, | ||
58 | { | ||
59 | .start = 64 + 36, | ||
60 | .end = 64 + 36, | ||
61 | .flags = IORESOURCE_IRQ, | ||
62 | }, | ||
63 | { | ||
64 | .start = 64 + 40, | ||
65 | .end = 64 + 40, | ||
66 | .flags = IORESOURCE_IRQ, | ||
67 | }, | ||
68 | { | ||
69 | .start = 64 + 42, | ||
70 | .end = 64 + 42, | ||
71 | .flags = IORESOURCE_IRQ, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | static struct platform_device m520x_fec = { | ||
76 | .name = "fec", | ||
77 | .id = 0, | ||
78 | .num_resources = ARRAY_SIZE(m520x_fec_resources), | ||
79 | .resource = m520x_fec_resources, | ||
80 | }; | ||
81 | |||
52 | static struct platform_device *m520x_devices[] __initdata = { | 82 | static struct platform_device *m520x_devices[] __initdata = { |
53 | &m520x_uart, | 83 | &m520x_uart, |
84 | &m520x_fec, | ||
54 | }; | 85 | }; |
55 | 86 | ||
56 | /***************************************************************************/ | 87 | /***************************************************************************/ |
@@ -103,6 +134,30 @@ static void __init m520x_uarts_init(void) | |||
103 | 134 | ||
104 | /***************************************************************************/ | 135 | /***************************************************************************/ |
105 | 136 | ||
137 | static void __init m520x_fec_init(void) | ||
138 | { | ||
139 | u32 imr; | ||
140 | u8 v; | ||
141 | |||
142 | /* Unmask FEC interrupts at ColdFire interrupt controller */ | ||
143 | writeb(0x4, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 36); | ||
144 | writeb(0x4, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 40); | ||
145 | writeb(0x4, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 42); | ||
146 | |||
147 | imr = readl(MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH); | ||
148 | imr &= ~0x0001FFF0; | ||
149 | writel(imr, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH); | ||
150 | |||
151 | /* Set multi-function pins to ethernet mode */ | ||
152 | v = readb(MCF_IPSBAR + MCF_GPIO_PAR_FEC); | ||
153 | writeb(v | 0xf0, MCF_IPSBAR + MCF_GPIO_PAR_FEC); | ||
154 | |||
155 | v = readb(MCF_IPSBAR + MCF_GPIO_PAR_FECI2C); | ||
156 | writeb(v | 0x0f, MCF_IPSBAR + MCF_GPIO_PAR_FECI2C); | ||
157 | } | ||
158 | |||
159 | /***************************************************************************/ | ||
160 | |||
106 | /* | 161 | /* |
107 | * Program the vector to be an auto-vectored. | 162 | * Program the vector to be an auto-vectored. |
108 | */ | 163 | */ |
@@ -118,6 +173,7 @@ void __init config_BSP(char *commandp, int size) | |||
118 | { | 173 | { |
119 | mach_reset = coldfire_reset; | 174 | mach_reset = coldfire_reset; |
120 | m520x_uarts_init(); | 175 | m520x_uarts_init(); |
176 | m520x_fec_init(); | ||
121 | } | 177 | } |
122 | 178 | ||
123 | /***************************************************************************/ | 179 | /***************************************************************************/ |
diff --git a/arch/m68knommu/platform/523x/config.c b/arch/m68knommu/platform/523x/config.c index 13f02611ea23..74133f27b30c 100644 --- a/arch/m68knommu/platform/523x/config.c +++ b/arch/m68knommu/platform/523x/config.c | |||
@@ -50,8 +50,39 @@ static struct platform_device m523x_uart = { | |||
50 | .dev.platform_data = m523x_uart_platform, | 50 | .dev.platform_data = m523x_uart_platform, |
51 | }; | 51 | }; |
52 | 52 | ||
53 | static struct resource m523x_fec_resources[] = { | ||
54 | { | ||
55 | .start = MCF_MBAR + 0x1000, | ||
56 | .end = MCF_MBAR + 0x1000 + 0x7ff, | ||
57 | .flags = IORESOURCE_MEM, | ||
58 | }, | ||
59 | { | ||
60 | .start = 64 + 23, | ||
61 | .end = 64 + 23, | ||
62 | .flags = IORESOURCE_IRQ, | ||
63 | }, | ||
64 | { | ||
65 | .start = 64 + 27, | ||
66 | .end = 64 + 27, | ||
67 | .flags = IORESOURCE_IRQ, | ||
68 | }, | ||
69 | { | ||
70 | .start = 64 + 29, | ||
71 | .end = 64 + 29, | ||
72 | .flags = IORESOURCE_IRQ, | ||
73 | }, | ||
74 | }; | ||
75 | |||
76 | static struct platform_device m523x_fec = { | ||
77 | .name = "fec", | ||
78 | .id = 0, | ||
79 | .num_resources = ARRAY_SIZE(m523x_fec_resources), | ||
80 | .resource = m523x_fec_resources, | ||
81 | }; | ||
82 | |||
53 | static struct platform_device *m523x_devices[] __initdata = { | 83 | static struct platform_device *m523x_devices[] __initdata = { |
54 | &m523x_uart, | 84 | &m523x_uart, |
85 | &m523x_fec, | ||
55 | }; | 86 | }; |
56 | 87 | ||
57 | /***************************************************************************/ | 88 | /***************************************************************************/ |
@@ -83,6 +114,25 @@ static void __init m523x_uarts_init(void) | |||
83 | 114 | ||
84 | /***************************************************************************/ | 115 | /***************************************************************************/ |
85 | 116 | ||
117 | static void __init m523x_fec_init(void) | ||
118 | { | ||
119 | u32 imr; | ||
120 | |||
121 | /* Unmask FEC interrupts at ColdFire interrupt controller */ | ||
122 | writeb(0x28, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 23); | ||
123 | writeb(0x27, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 27); | ||
124 | writeb(0x26, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 29); | ||
125 | |||
126 | imr = readl(MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH); | ||
127 | imr &= ~0xf; | ||
128 | writel(imr, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH); | ||
129 | imr = readl(MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRL); | ||
130 | imr &= ~0xff800001; | ||
131 | writel(imr, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRL); | ||
132 | } | ||
133 | |||
134 | /***************************************************************************/ | ||
135 | |||
86 | void mcf_disableall(void) | 136 | void mcf_disableall(void) |
87 | { | 137 | { |
88 | *((volatile unsigned long *) (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH)) = 0xffffffff; | 138 | *((volatile unsigned long *) (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH)) = 0xffffffff; |
@@ -103,6 +153,7 @@ void __init config_BSP(char *commandp, int size) | |||
103 | mcf_disableall(); | 153 | mcf_disableall(); |
104 | mach_reset = coldfire_reset; | 154 | mach_reset = coldfire_reset; |
105 | m523x_uarts_init(); | 155 | m523x_uarts_init(); |
156 | m523x_fec_init(); | ||
106 | } | 157 | } |
107 | 158 | ||
108 | /***************************************************************************/ | 159 | /***************************************************************************/ |
diff --git a/arch/m68knommu/platform/5272/config.c b/arch/m68knommu/platform/5272/config.c index 230bae691a7f..e049245f4092 100644 --- a/arch/m68knommu/platform/5272/config.c +++ b/arch/m68knommu/platform/5272/config.c | |||
@@ -55,8 +55,39 @@ static struct platform_device m5272_uart = { | |||
55 | .dev.platform_data = m5272_uart_platform, | 55 | .dev.platform_data = m5272_uart_platform, |
56 | }; | 56 | }; |
57 | 57 | ||
58 | static struct resource m5272_fec_resources[] = { | ||
59 | { | ||
60 | .start = MCF_MBAR + 0x840, | ||
61 | .end = MCF_MBAR + 0x840 + 0x1cf, | ||
62 | .flags = IORESOURCE_MEM, | ||
63 | }, | ||
64 | { | ||
65 | .start = 86, | ||
66 | .end = 86, | ||
67 | .flags = IORESOURCE_IRQ, | ||
68 | }, | ||
69 | { | ||
70 | .start = 87, | ||
71 | .end = 87, | ||
72 | .flags = IORESOURCE_IRQ, | ||
73 | }, | ||
74 | { | ||
75 | .start = 88, | ||
76 | .end = 88, | ||
77 | .flags = IORESOURCE_IRQ, | ||
78 | }, | ||
79 | }; | ||
80 | |||
81 | static struct platform_device m5272_fec = { | ||
82 | .name = "fec", | ||
83 | .id = 0, | ||
84 | .num_resources = ARRAY_SIZE(m5272_fec_resources), | ||
85 | .resource = m5272_fec_resources, | ||
86 | }; | ||
87 | |||
58 | static struct platform_device *m5272_devices[] __initdata = { | 88 | static struct platform_device *m5272_devices[] __initdata = { |
59 | &m5272_uart, | 89 | &m5272_uart, |
90 | &m5272_fec, | ||
60 | }; | 91 | }; |
61 | 92 | ||
62 | /***************************************************************************/ | 93 | /***************************************************************************/ |
@@ -91,6 +122,22 @@ static void __init m5272_uarts_init(void) | |||
91 | 122 | ||
92 | /***************************************************************************/ | 123 | /***************************************************************************/ |
93 | 124 | ||
125 | static void __init m5272_fec_init(void) | ||
126 | { | ||
127 | u32 imr; | ||
128 | |||
129 | /* Unmask FEC interrupts at ColdFire interrupt controller */ | ||
130 | imr = readl(MCF_MBAR + MCFSIM_ICR3); | ||
131 | imr = (imr & ~0x00000fff) | 0x00000ddd; | ||
132 | writel(imr, MCF_MBAR + MCFSIM_ICR3); | ||
133 | |||
134 | imr = readl(MCF_MBAR + MCFSIM_ICR1); | ||
135 | imr = (imr & ~0x0f000000) | 0x0d000000; | ||
136 | writel(imr, MCF_MBAR + MCFSIM_ICR1); | ||
137 | } | ||
138 | |||
139 | /***************************************************************************/ | ||
140 | |||
94 | void mcf_disableall(void) | 141 | void mcf_disableall(void) |
95 | { | 142 | { |
96 | volatile unsigned long *icrp; | 143 | volatile unsigned long *icrp; |
@@ -155,6 +202,7 @@ void __init config_BSP(char *commandp, int size) | |||
155 | static int __init init_BSP(void) | 202 | static int __init init_BSP(void) |
156 | { | 203 | { |
157 | m5272_uarts_init(); | 204 | m5272_uarts_init(); |
205 | m5272_fec_init(); | ||
158 | platform_add_devices(m5272_devices, ARRAY_SIZE(m5272_devices)); | 206 | platform_add_devices(m5272_devices, ARRAY_SIZE(m5272_devices)); |
159 | return 0; | 207 | return 0; |
160 | } | 208 | } |
diff --git a/arch/m68knommu/platform/527x/config.c b/arch/m68knommu/platform/527x/config.c index 73cd1aef4a90..49343fb157b0 100644 --- a/arch/m68knommu/platform/527x/config.c +++ b/arch/m68knommu/platform/527x/config.c | |||
@@ -50,8 +50,73 @@ static struct platform_device m527x_uart = { | |||
50 | .dev.platform_data = m527x_uart_platform, | 50 | .dev.platform_data = m527x_uart_platform, |
51 | }; | 51 | }; |
52 | 52 | ||
53 | static struct resource m527x_fec0_resources[] = { | ||
54 | { | ||
55 | .start = MCF_MBAR + 0x1000, | ||
56 | .end = MCF_MBAR + 0x1000 + 0x7ff, | ||
57 | .flags = IORESOURCE_MEM, | ||
58 | }, | ||
59 | { | ||
60 | .start = 64 + 23, | ||
61 | .end = 64 + 23, | ||
62 | .flags = IORESOURCE_IRQ, | ||
63 | }, | ||
64 | { | ||
65 | .start = 64 + 27, | ||
66 | .end = 64 + 27, | ||
67 | .flags = IORESOURCE_IRQ, | ||
68 | }, | ||
69 | { | ||
70 | .start = 64 + 29, | ||
71 | .end = 64 + 29, | ||
72 | .flags = IORESOURCE_IRQ, | ||
73 | }, | ||
74 | }; | ||
75 | |||
76 | static struct resource m527x_fec1_resources[] = { | ||
77 | { | ||
78 | .start = MCF_MBAR + 0x1800, | ||
79 | .end = MCF_MBAR + 0x1800 + 0x7ff, | ||
80 | .flags = IORESOURCE_MEM, | ||
81 | }, | ||
82 | { | ||
83 | .start = 128 + 23, | ||
84 | .end = 128 + 23, | ||
85 | .flags = IORESOURCE_IRQ, | ||
86 | }, | ||
87 | { | ||
88 | .start = 128 + 27, | ||
89 | .end = 128 + 27, | ||
90 | .flags = IORESOURCE_IRQ, | ||
91 | }, | ||
92 | { | ||
93 | .start = 128 + 29, | ||
94 | .end = 128 + 29, | ||
95 | .flags = IORESOURCE_IRQ, | ||
96 | }, | ||
97 | }; | ||
98 | |||
99 | static struct platform_device m527x_fec[] = { | ||
100 | { | ||
101 | .name = "fec", | ||
102 | .id = 0, | ||
103 | .num_resources = ARRAY_SIZE(m527x_fec0_resources), | ||
104 | .resource = m527x_fec0_resources, | ||
105 | }, | ||
106 | { | ||
107 | .name = "fec", | ||
108 | .id = 1, | ||
109 | .num_resources = ARRAY_SIZE(m527x_fec1_resources), | ||
110 | .resource = m527x_fec1_resources, | ||
111 | }, | ||
112 | }; | ||
113 | |||
53 | static struct platform_device *m527x_devices[] __initdata = { | 114 | static struct platform_device *m527x_devices[] __initdata = { |
54 | &m527x_uart, | 115 | &m527x_uart, |
116 | &m527x_fec[0], | ||
117 | #ifdef CONFIG_FEC2 | ||
118 | &m527x_fec[1], | ||
119 | #endif | ||
55 | }; | 120 | }; |
56 | 121 | ||
57 | /***************************************************************************/ | 122 | /***************************************************************************/ |
@@ -97,6 +162,51 @@ static void __init m527x_uarts_init(void) | |||
97 | 162 | ||
98 | /***************************************************************************/ | 163 | /***************************************************************************/ |
99 | 164 | ||
165 | static void __init m527x_fec_irq_init(int nr) | ||
166 | { | ||
167 | unsigned long base; | ||
168 | u32 imr; | ||
169 | |||
170 | base = MCF_IPSBAR + (nr ? MCFICM_INTC1 : MCFICM_INTC0); | ||
171 | |||
172 | writeb(0x28, base + MCFINTC_ICR0 + 23); | ||
173 | writeb(0x27, base + MCFINTC_ICR0 + 27); | ||
174 | writeb(0x26, base + MCFINTC_ICR0 + 29); | ||
175 | |||
176 | imr = readl(base + MCFINTC_IMRH); | ||
177 | imr &= ~0xf; | ||
178 | writel(imr, base + MCFINTC_IMRH); | ||
179 | imr = readl(base + MCFINTC_IMRL); | ||
180 | imr &= ~0xff800001; | ||
181 | writel(imr, base + MCFINTC_IMRL); | ||
182 | } | ||
183 | |||
184 | static void __init m527x_fec_init(void) | ||
185 | { | ||
186 | u16 par; | ||
187 | u8 v; | ||
188 | |||
189 | m527x_fec_irq_init(0); | ||
190 | |||
191 | /* Set multi-function pins to ethernet mode for fec0 */ | ||
192 | par = readw(MCF_IPSBAR + 0x100082); | ||
193 | writew(par | 0xf00, MCF_IPSBAR + 0x100082); | ||
194 | v = readb(MCF_IPSBAR + 0x100078); | ||
195 | writeb(v | 0xc0, MCF_IPSBAR + 0x100078); | ||
196 | |||
197 | #ifdef CONFIG_FEC2 | ||
198 | m527x_fec_irq_init(1); | ||
199 | |||
200 | /* Set multi-function pins to ethernet mode for fec1 */ | ||
201 | par = readw(MCF_IPSBAR + 0x100082); | ||
202 | writew(par | 0xa0, MCF_IPSBAR + 0x100082); | ||
203 | v = readb(MCF_IPSBAR + 0x100079); | ||
204 | writeb(v | 0xc0, MCF_IPSBAR + 0x100079); | ||
205 | #endif | ||
206 | } | ||
207 | |||
208 | /***************************************************************************/ | ||
209 | |||
100 | void mcf_disableall(void) | 210 | void mcf_disableall(void) |
101 | { | 211 | { |
102 | *((volatile unsigned long *) (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH)) = 0xffffffff; | 212 | *((volatile unsigned long *) (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH)) = 0xffffffff; |
@@ -116,13 +226,14 @@ void __init config_BSP(char *commandp, int size) | |||
116 | { | 226 | { |
117 | mcf_disableall(); | 227 | mcf_disableall(); |
118 | mach_reset = coldfire_reset; | 228 | mach_reset = coldfire_reset; |
229 | m527x_uarts_init(); | ||
230 | m527x_fec_init(); | ||
119 | } | 231 | } |
120 | 232 | ||
121 | /***************************************************************************/ | 233 | /***************************************************************************/ |
122 | 234 | ||
123 | static int __init init_BSP(void) | 235 | static int __init init_BSP(void) |
124 | { | 236 | { |
125 | m527x_uarts_init(); | ||
126 | platform_add_devices(m527x_devices, ARRAY_SIZE(m527x_devices)); | 237 | platform_add_devices(m527x_devices, ARRAY_SIZE(m527x_devices)); |
127 | return 0; | 238 | return 0; |
128 | } | 239 | } |
diff --git a/arch/m68knommu/platform/528x/config.c b/arch/m68knommu/platform/528x/config.c index 44baeb225dc7..bee526f4d1af 100644 --- a/arch/m68knommu/platform/528x/config.c +++ b/arch/m68knommu/platform/528x/config.c | |||
@@ -57,8 +57,40 @@ static struct platform_device m528x_uart = { | |||
57 | .dev.platform_data = m528x_uart_platform, | 57 | .dev.platform_data = m528x_uart_platform, |
58 | }; | 58 | }; |
59 | 59 | ||
60 | static struct resource m528x_fec_resources[] = { | ||
61 | { | ||
62 | .start = MCF_MBAR + 0x1000, | ||
63 | .end = MCF_MBAR + 0x1000 + 0x7ff, | ||
64 | .flags = IORESOURCE_MEM, | ||
65 | }, | ||
66 | { | ||
67 | .start = 64 + 23, | ||
68 | .end = 64 + 23, | ||
69 | .flags = IORESOURCE_IRQ, | ||
70 | }, | ||
71 | { | ||
72 | .start = 64 + 27, | ||
73 | .end = 64 + 27, | ||
74 | .flags = IORESOURCE_IRQ, | ||
75 | }, | ||
76 | { | ||
77 | .start = 64 + 29, | ||
78 | .end = 64 + 29, | ||
79 | .flags = IORESOURCE_IRQ, | ||
80 | }, | ||
81 | }; | ||
82 | |||
83 | static struct platform_device m528x_fec = { | ||
84 | .name = "fec", | ||
85 | .id = 0, | ||
86 | .num_resources = ARRAY_SIZE(m528x_fec_resources), | ||
87 | .resource = m528x_fec_resources, | ||
88 | }; | ||
89 | |||
90 | |||
60 | static struct platform_device *m528x_devices[] __initdata = { | 91 | static struct platform_device *m528x_devices[] __initdata = { |
61 | &m528x_uart, | 92 | &m528x_uart, |
93 | &m528x_fec, | ||
62 | }; | 94 | }; |
63 | 95 | ||
64 | /***************************************************************************/ | 96 | /***************************************************************************/ |
@@ -99,6 +131,31 @@ static void __init m528x_uarts_init(void) | |||
99 | 131 | ||
100 | /***************************************************************************/ | 132 | /***************************************************************************/ |
101 | 133 | ||
134 | static void __init m528x_fec_init(void) | ||
135 | { | ||
136 | u32 imr; | ||
137 | u16 v16; | ||
138 | |||
139 | /* Unmask FEC interrupts at ColdFire interrupt controller */ | ||
140 | writeb(0x28, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 23); | ||
141 | writeb(0x27, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 27); | ||
142 | writeb(0x26, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_ICR0 + 29); | ||
143 | |||
144 | imr = readl(MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH); | ||
145 | imr &= ~0xf; | ||
146 | writel(imr, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH); | ||
147 | imr = readl(MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRL); | ||
148 | imr &= ~0xff800001; | ||
149 | writel(imr, MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRL); | ||
150 | |||
151 | /* Set multi-function pins to ethernet mode for fec0 */ | ||
152 | v16 = readw(MCF_IPSBAR + 0x100056); | ||
153 | writew(v16 | 0xf00, MCF_IPSBAR + 0x100056); | ||
154 | writeb(0xc0, MCF_IPSBAR + 0x100058); | ||
155 | } | ||
156 | |||
157 | /***************************************************************************/ | ||
158 | |||
102 | void mcf_disableall(void) | 159 | void mcf_disableall(void) |
103 | { | 160 | { |
104 | *((volatile unsigned long *) (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH)) = 0xffffffff; | 161 | *((volatile unsigned long *) (MCF_IPSBAR + MCFICM_INTC0 + MCFINTC_IMRH)) = 0xffffffff; |
@@ -158,6 +215,7 @@ void __init config_BSP(char *commandp, int size) | |||
158 | static int __init init_BSP(void) | 215 | static int __init init_BSP(void) |
159 | { | 216 | { |
160 | m528x_uarts_init(); | 217 | m528x_uarts_init(); |
218 | m528x_fec_init(); | ||
161 | platform_add_devices(m528x_devices, ARRAY_SIZE(m528x_devices)); | 219 | platform_add_devices(m528x_devices, ARRAY_SIZE(m528x_devices)); |
162 | return 0; | 220 | return 0; |
163 | } | 221 | } |
diff --git a/arch/m68knommu/platform/532x/config.c b/arch/m68knommu/platform/532x/config.c index a347623d6ee6..591f2f801134 100644 --- a/arch/m68knommu/platform/532x/config.c +++ b/arch/m68knommu/platform/532x/config.c | |||
@@ -61,8 +61,38 @@ static struct platform_device m532x_uart = { | |||
61 | .dev.platform_data = m532x_uart_platform, | 61 | .dev.platform_data = m532x_uart_platform, |
62 | }; | 62 | }; |
63 | 63 | ||
64 | static struct resource m532x_fec_resources[] = { | ||
65 | { | ||
66 | .start = 0xfc030000, | ||
67 | .end = 0xfc0307ff, | ||
68 | .flags = IORESOURCE_MEM, | ||
69 | }, | ||
70 | { | ||
71 | .start = 64 + 36, | ||
72 | .end = 64 + 36, | ||
73 | .flags = IORESOURCE_IRQ, | ||
74 | }, | ||
75 | { | ||
76 | .start = 64 + 40, | ||
77 | .end = 64 + 40, | ||
78 | .flags = IORESOURCE_IRQ, | ||
79 | }, | ||
80 | { | ||
81 | .start = 64 + 42, | ||
82 | .end = 64 + 42, | ||
83 | .flags = IORESOURCE_IRQ, | ||
84 | }, | ||
85 | }; | ||
86 | |||
87 | static struct platform_device m532x_fec = { | ||
88 | .name = "fec", | ||
89 | .id = 0, | ||
90 | .num_resources = ARRAY_SIZE(m532x_fec_resources), | ||
91 | .resource = m532x_fec_resources, | ||
92 | }; | ||
64 | static struct platform_device *m532x_devices[] __initdata = { | 93 | static struct platform_device *m532x_devices[] __initdata = { |
65 | &m532x_uart, | 94 | &m532x_uart, |
95 | &m532x_fec, | ||
66 | }; | 96 | }; |
67 | 97 | ||
68 | /***************************************************************************/ | 98 | /***************************************************************************/ |
@@ -93,6 +123,24 @@ static void __init m532x_uarts_init(void) | |||
93 | for (line = 0; (line < nrlines); line++) | 123 | for (line = 0; (line < nrlines); line++) |
94 | m532x_uart_init_line(line, m532x_uart_platform[line].irq); | 124 | m532x_uart_init_line(line, m532x_uart_platform[line].irq); |
95 | } | 125 | } |
126 | /***************************************************************************/ | ||
127 | |||
128 | static void __init m532x_fec_init(void) | ||
129 | { | ||
130 | /* Unmask FEC interrupts at ColdFire interrupt controller */ | ||
131 | MCF_INTC0_ICR36 = 0x2; | ||
132 | MCF_INTC0_ICR40 = 0x2; | ||
133 | MCF_INTC0_ICR42 = 0x2; | ||
134 | |||
135 | MCF_INTC0_IMRH &= ~(MCF_INTC_IMRH_INT_MASK36 | | ||
136 | MCF_INTC_IMRH_INT_MASK40 | MCF_INTC_IMRH_INT_MASK42); | ||
137 | |||
138 | /* Set multi-function pins to ethernet mode for fec0 */ | ||
139 | MCF_GPIO_PAR_FECI2C |= (MCF_GPIO_PAR_FECI2C_PAR_MDC_EMDC | | ||
140 | MCF_GPIO_PAR_FECI2C_PAR_MDIO_EMDIO); | ||
141 | MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC_PAR_FEC_7W_FEC | | ||
142 | MCF_GPIO_PAR_FEC_PAR_FEC_MII_FEC); | ||
143 | } | ||
96 | 144 | ||
97 | /***************************************************************************/ | 145 | /***************************************************************************/ |
98 | 146 | ||
@@ -150,6 +198,7 @@ void __init config_BSP(char *commandp, int size) | |||
150 | static int __init init_BSP(void) | 198 | static int __init init_BSP(void) |
151 | { | 199 | { |
152 | m532x_uarts_init(); | 200 | m532x_uarts_init(); |
201 | m532x_fec_init(); | ||
153 | platform_add_devices(m532x_devices, ARRAY_SIZE(m532x_devices)); | 202 | platform_add_devices(m532x_devices, ARRAY_SIZE(m532x_devices)); |
154 | return 0; | 203 | return 0; |
155 | } | 204 | } |
diff --git a/arch/mips/basler/excite/excite_iodev.c b/arch/mips/basler/excite/excite_iodev.c index a1e3526b4a94..dfbfd7e2ac08 100644 --- a/arch/mips/basler/excite/excite_iodev.c +++ b/arch/mips/basler/excite/excite_iodev.c | |||
@@ -33,8 +33,8 @@ | |||
33 | 33 | ||
34 | 34 | ||
35 | static const struct resource *iodev_get_resource(struct platform_device *, const char *, unsigned int); | 35 | static const struct resource *iodev_get_resource(struct platform_device *, const char *, unsigned int); |
36 | static int __init iodev_probe(struct device *); | 36 | static int __init iodev_probe(struct platform_device *); |
37 | static int __exit iodev_remove(struct device *); | 37 | static int __exit iodev_remove(struct platform_device *); |
38 | static int iodev_open(struct inode *, struct file *); | 38 | static int iodev_open(struct inode *, struct file *); |
39 | static int iodev_release(struct inode *, struct file *); | 39 | static int iodev_release(struct inode *, struct file *); |
40 | static ssize_t iodev_read(struct file *, char __user *, size_t s, loff_t *); | 40 | static ssize_t iodev_read(struct file *, char __user *, size_t s, loff_t *); |
@@ -65,13 +65,13 @@ static struct miscdevice miscdev = | |||
65 | .fops = &fops | 65 | .fops = &fops |
66 | }; | 66 | }; |
67 | 67 | ||
68 | static struct device_driver iodev_driver = | 68 | static struct platform_driver iodev_driver = { |
69 | { | 69 | .driver = { |
70 | .name = (char *) iodev_name, | 70 | .name = iodev_name, |
71 | .bus = &platform_bus_type, | 71 | .owner = THIS_MODULE, |
72 | .owner = THIS_MODULE, | 72 | }, |
73 | .probe = iodev_probe, | 73 | .probe = iodev_probe, |
74 | .remove = __exit_p(iodev_remove) | 74 | .remove = __devexit_p(iodev_remove), |
75 | }; | 75 | }; |
76 | 76 | ||
77 | 77 | ||
@@ -89,11 +89,10 @@ iodev_get_resource(struct platform_device *pdv, const char *name, | |||
89 | 89 | ||
90 | 90 | ||
91 | /* No hotplugging on the platform bus - use __init */ | 91 | /* No hotplugging on the platform bus - use __init */ |
92 | static int __init iodev_probe(struct device *dev) | 92 | static int __init iodev_probe(struct platform_device *dev) |
93 | { | 93 | { |
94 | struct platform_device * const pdv = to_platform_device(dev); | ||
95 | const struct resource * const ri = | 94 | const struct resource * const ri = |
96 | iodev_get_resource(pdv, IODEV_RESOURCE_IRQ, IORESOURCE_IRQ); | 95 | iodev_get_resource(dev, IODEV_RESOURCE_IRQ, IORESOURCE_IRQ); |
97 | 96 | ||
98 | if (unlikely(!ri)) | 97 | if (unlikely(!ri)) |
99 | return -ENXIO; | 98 | return -ENXIO; |
@@ -104,7 +103,7 @@ static int __init iodev_probe(struct device *dev) | |||
104 | 103 | ||
105 | 104 | ||
106 | 105 | ||
107 | static int __exit iodev_remove(struct device *dev) | 106 | static int __exit iodev_remove(struct platform_device *dev) |
108 | { | 107 | { |
109 | return misc_deregister(&miscdev); | 108 | return misc_deregister(&miscdev); |
110 | } | 109 | } |
@@ -160,14 +159,14 @@ static irqreturn_t iodev_irqhdl(int irq, void *ctxt) | |||
160 | 159 | ||
161 | static int __init iodev_init_module(void) | 160 | static int __init iodev_init_module(void) |
162 | { | 161 | { |
163 | return driver_register(&iodev_driver); | 162 | return platform_driver_register(&iodev_driver); |
164 | } | 163 | } |
165 | 164 | ||
166 | 165 | ||
167 | 166 | ||
168 | static void __exit iodev_cleanup_module(void) | 167 | static void __exit iodev_cleanup_module(void) |
169 | { | 168 | { |
170 | driver_unregister(&iodev_driver); | 169 | platform_driver_unregister(&iodev_driver); |
171 | } | 170 | } |
172 | 171 | ||
173 | module_init(iodev_init_module); | 172 | module_init(iodev_init_module); |
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 0417516503f6..526f327475ce 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
@@ -1391,11 +1391,11 @@ static inline void tlb_write_random(void) | |||
1391 | static inline unsigned int \ | 1391 | static inline unsigned int \ |
1392 | set_c0_##name(unsigned int set) \ | 1392 | set_c0_##name(unsigned int set) \ |
1393 | { \ | 1393 | { \ |
1394 | unsigned int res; \ | 1394 | unsigned int res, new; \ |
1395 | \ | 1395 | \ |
1396 | res = read_c0_##name(); \ | 1396 | res = read_c0_##name(); \ |
1397 | res |= set; \ | 1397 | new = res | set; \ |
1398 | write_c0_##name(res); \ | 1398 | write_c0_##name(new); \ |
1399 | \ | 1399 | \ |
1400 | return res; \ | 1400 | return res; \ |
1401 | } \ | 1401 | } \ |
@@ -1403,24 +1403,24 @@ set_c0_##name(unsigned int set) \ | |||
1403 | static inline unsigned int \ | 1403 | static inline unsigned int \ |
1404 | clear_c0_##name(unsigned int clear) \ | 1404 | clear_c0_##name(unsigned int clear) \ |
1405 | { \ | 1405 | { \ |
1406 | unsigned int res; \ | 1406 | unsigned int res, new; \ |
1407 | \ | 1407 | \ |
1408 | res = read_c0_##name(); \ | 1408 | res = read_c0_##name(); \ |
1409 | res &= ~clear; \ | 1409 | new = res & ~clear; \ |
1410 | write_c0_##name(res); \ | 1410 | write_c0_##name(new); \ |
1411 | \ | 1411 | \ |
1412 | return res; \ | 1412 | return res; \ |
1413 | } \ | 1413 | } \ |
1414 | \ | 1414 | \ |
1415 | static inline unsigned int \ | 1415 | static inline unsigned int \ |
1416 | change_c0_##name(unsigned int change, unsigned int new) \ | 1416 | change_c0_##name(unsigned int change, unsigned int val) \ |
1417 | { \ | 1417 | { \ |
1418 | unsigned int res; \ | 1418 | unsigned int res, new; \ |
1419 | \ | 1419 | \ |
1420 | res = read_c0_##name(); \ | 1420 | res = read_c0_##name(); \ |
1421 | res &= ~change; \ | 1421 | new = res & ~change; \ |
1422 | res |= (new & change); \ | 1422 | new |= (val & change); \ |
1423 | write_c0_##name(res); \ | 1423 | write_c0_##name(new); \ |
1424 | \ | 1424 | \ |
1425 | return res; \ | 1425 | return res; \ |
1426 | } | 1426 | } |
diff --git a/arch/mips/include/asm/socket.h b/arch/mips/include/asm/socket.h index facc2d7a87ca..2abca1780169 100644 --- a/arch/mips/include/asm/socket.h +++ b/arch/mips/include/asm/socket.h | |||
@@ -75,6 +75,9 @@ To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */ | |||
75 | 75 | ||
76 | #define SO_MARK 36 | 76 | #define SO_MARK 36 |
77 | 77 | ||
78 | #define SO_TIMESTAMPING 37 | ||
79 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
80 | |||
78 | #ifdef __KERNEL__ | 81 | #ifdef __KERNEL__ |
79 | 82 | ||
80 | /** sock_type - Socket types | 83 | /** sock_type - Socket types |
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c index 4b4007b3083a..7b845ba9dff4 100644 --- a/arch/mips/kernel/irq.c +++ b/arch/mips/kernel/irq.c | |||
@@ -108,7 +108,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
108 | seq_printf(p, "%10u ", kstat_irqs(i)); | 108 | seq_printf(p, "%10u ", kstat_irqs(i)); |
109 | #else | 109 | #else |
110 | for_each_online_cpu(j) | 110 | for_each_online_cpu(j) |
111 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 111 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
112 | #endif | 112 | #endif |
113 | seq_printf(p, " %14s", irq_desc[i].chip->name); | 113 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
114 | seq_printf(p, " %s", action->name); | 114 | seq_printf(p, " %s", action->name); |
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 1a86f84fa947..2a472713de8e 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
@@ -32,7 +32,6 @@ | |||
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/binfmts.h> | 33 | #include <linux/binfmts.h> |
34 | #include <linux/security.h> | 34 | #include <linux/security.h> |
35 | #include <linux/syscalls.h> | ||
36 | #include <linux/compat.h> | 35 | #include <linux/compat.h> |
37 | #include <linux/vfs.h> | 36 | #include <linux/vfs.h> |
38 | #include <linux/ipc.h> | 37 | #include <linux/ipc.h> |
@@ -356,40 +355,6 @@ SYSCALL_DEFINE1(32_personality, unsigned long, personality) | |||
356 | return ret; | 355 | return ret; |
357 | } | 356 | } |
358 | 357 | ||
359 | /* ustat compatibility */ | ||
360 | struct ustat32 { | ||
361 | compat_daddr_t f_tfree; | ||
362 | compat_ino_t f_tinode; | ||
363 | char f_fname[6]; | ||
364 | char f_fpack[6]; | ||
365 | }; | ||
366 | |||
367 | extern asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf); | ||
368 | |||
369 | SYSCALL_DEFINE2(32_ustat, dev_t, dev, struct ustat32 __user *, ubuf32) | ||
370 | { | ||
371 | int err; | ||
372 | struct ustat tmp; | ||
373 | struct ustat32 tmp32; | ||
374 | mm_segment_t old_fs = get_fs(); | ||
375 | |||
376 | set_fs(KERNEL_DS); | ||
377 | err = sys_ustat(dev, (struct ustat __user *)&tmp); | ||
378 | set_fs(old_fs); | ||
379 | |||
380 | if (err) | ||
381 | goto out; | ||
382 | |||
383 | memset(&tmp32, 0, sizeof(struct ustat32)); | ||
384 | tmp32.f_tfree = tmp.f_tfree; | ||
385 | tmp32.f_tinode = tmp.f_tinode; | ||
386 | |||
387 | err = copy_to_user(ubuf32, &tmp32, sizeof(struct ustat32)) ? -EFAULT : 0; | ||
388 | |||
389 | out: | ||
390 | return err; | ||
391 | } | ||
392 | |||
393 | SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd, | 358 | SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd, |
394 | compat_off_t __user *, offset, s32, count) | 359 | compat_off_t __user *, offset, s32, count) |
395 | { | 360 | { |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 7438e92f8a01..f61d6b0e5731 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -253,7 +253,7 @@ EXPORT(sysn32_call_table) | |||
253 | PTR compat_sys_utime /* 6130 */ | 253 | PTR compat_sys_utime /* 6130 */ |
254 | PTR sys_mknod | 254 | PTR sys_mknod |
255 | PTR sys_32_personality | 255 | PTR sys_32_personality |
256 | PTR sys_32_ustat | 256 | PTR compat_sys_ustat |
257 | PTR compat_sys_statfs | 257 | PTR compat_sys_statfs |
258 | PTR compat_sys_fstatfs /* 6135 */ | 258 | PTR compat_sys_fstatfs /* 6135 */ |
259 | PTR sys_sysfs | 259 | PTR sys_sysfs |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index b0fef4ff9827..60997f1f69d4 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -265,7 +265,7 @@ sys_call_table: | |||
265 | PTR sys_olduname | 265 | PTR sys_olduname |
266 | PTR sys_umask /* 4060 */ | 266 | PTR sys_umask /* 4060 */ |
267 | PTR sys_chroot | 267 | PTR sys_chroot |
268 | PTR sys_32_ustat | 268 | PTR compat_sys_ustat |
269 | PTR sys_dup2 | 269 | PTR sys_dup2 |
270 | PTR sys_getppid | 270 | PTR sys_getppid |
271 | PTR sys_getpgrp /* 4065 */ | 271 | PTR sys_getpgrp /* 4065 */ |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index b2d7041341b8..29fadaccecdd 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1520,7 +1520,9 @@ void __cpuinit per_cpu_trap_init(void) | |||
1520 | #endif /* CONFIG_MIPS_MT_SMTC */ | 1520 | #endif /* CONFIG_MIPS_MT_SMTC */ |
1521 | 1521 | ||
1522 | if (cpu_has_veic || cpu_has_vint) { | 1522 | if (cpu_has_veic || cpu_has_vint) { |
1523 | unsigned long sr = set_c0_status(ST0_BEV); | ||
1523 | write_c0_ebase(ebase); | 1524 | write_c0_ebase(ebase); |
1525 | write_c0_status(sr); | ||
1524 | /* Setting vector spacing enables EI/VI mode */ | 1526 | /* Setting vector spacing enables EI/VI mode */ |
1525 | change_c0_intctl(0x3e0, VECTORSPACING); | 1527 | change_c0_intctl(0x3e0, VECTORSPACING); |
1526 | } | 1528 | } |
@@ -1602,8 +1604,6 @@ void __cpuinit set_uncached_handler(unsigned long offset, void *addr, | |||
1602 | #ifdef CONFIG_64BIT | 1604 | #ifdef CONFIG_64BIT |
1603 | unsigned long uncached_ebase = TO_UNCAC(ebase); | 1605 | unsigned long uncached_ebase = TO_UNCAC(ebase); |
1604 | #endif | 1606 | #endif |
1605 | if (cpu_has_mips_r2) | ||
1606 | uncached_ebase += (read_c0_ebase() & 0x3ffff000); | ||
1607 | 1607 | ||
1608 | if (!addr) | 1608 | if (!addr) |
1609 | panic(panic_null_cerr); | 1609 | panic(panic_null_cerr); |
@@ -1635,9 +1635,11 @@ void __init trap_init(void) | |||
1635 | return; /* Already done */ | 1635 | return; /* Already done */ |
1636 | #endif | 1636 | #endif |
1637 | 1637 | ||
1638 | if (cpu_has_veic || cpu_has_vint) | 1638 | if (cpu_has_veic || cpu_has_vint) { |
1639 | ebase = (unsigned long) alloc_bootmem_low_pages(0x200 + VECTORSPACING*64); | 1639 | unsigned long size = 0x200 + VECTORSPACING*64; |
1640 | else { | 1640 | ebase = (unsigned long) |
1641 | __alloc_bootmem(size, 1 << fls(size), 0); | ||
1642 | } else { | ||
1641 | ebase = CAC_BASE; | 1643 | ebase = CAC_BASE; |
1642 | if (cpu_has_mips_r2) | 1644 | if (cpu_has_mips_r2) |
1643 | ebase += (read_c0_ebase() & 0x3ffff000); | 1645 | ebase += (read_c0_ebase() & 0x3ffff000); |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index c43f4b26a690..871e828bc62a 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -780,7 +780,7 @@ static void __cpuinit probe_pcache(void) | |||
780 | c->dcache.ways = 2; | 780 | c->dcache.ways = 2; |
781 | c->dcache.waybit = 0; | 781 | c->dcache.waybit = 0; |
782 | 782 | ||
783 | c->options |= MIPS_CPU_CACHE_CDEX_P; | 783 | c->options |= MIPS_CPU_CACHE_CDEX_P | MIPS_CPU_PREFETCH; |
784 | break; | 784 | break; |
785 | 785 | ||
786 | case CPU_TX49XX: | 786 | case CPU_TX49XX: |
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index 546e6977d4ff..bed56f1ac837 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c | |||
@@ -225,7 +225,7 @@ void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, | |||
225 | if (!plat_device_is_coherent(dev) && direction != DMA_TO_DEVICE) { | 225 | if (!plat_device_is_coherent(dev) && direction != DMA_TO_DEVICE) { |
226 | unsigned long addr; | 226 | unsigned long addr; |
227 | 227 | ||
228 | addr = plat_dma_addr_to_phys(dma_address); | 228 | addr = dma_addr_to_virt(dma_address); |
229 | dma_cache_wback_inv(addr, size); | 229 | dma_cache_wback_inv(addr, size); |
230 | } | 230 | } |
231 | 231 | ||
diff --git a/arch/mn10300/kernel/irq.c b/arch/mn10300/kernel/irq.c index 56c64ccc9c21..50fdb5c16e0c 100644 --- a/arch/mn10300/kernel/irq.c +++ b/arch/mn10300/kernel/irq.c | |||
@@ -221,7 +221,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
221 | if (action) { | 221 | if (action) { |
222 | seq_printf(p, "%3d: ", i); | 222 | seq_printf(p, "%3d: ", i); |
223 | for_each_present_cpu(cpu) | 223 | for_each_present_cpu(cpu) |
224 | seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]); | 224 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, cpu)); |
225 | seq_printf(p, " %14s.%u", irq_desc[i].chip->name, | 225 | seq_printf(p, " %14s.%u", irq_desc[i].chip->name, |
226 | (GxICR(i) & GxICR_LEVEL) >> | 226 | (GxICR(i) & GxICR_LEVEL) >> |
227 | GxICR_LEVEL_SHIFT); | 227 | GxICR_LEVEL_SHIFT); |
diff --git a/arch/parisc/include/asm/socket.h b/arch/parisc/include/asm/socket.h index fba402c95ac2..885472bf7b78 100644 --- a/arch/parisc/include/asm/socket.h +++ b/arch/parisc/include/asm/socket.h | |||
@@ -54,6 +54,9 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 0x401f | 55 | #define SO_MARK 0x401f |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 0x4020 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | /* O_NONBLOCK clashes with the bits used for socket types. Therefore we | 60 | /* O_NONBLOCK clashes with the bits used for socket types. Therefore we |
58 | * have to define SOCK_NONBLOCK to a different value here. | 61 | * have to define SOCK_NONBLOCK to a different value here. |
59 | */ | 62 | */ |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 2b5f5915dd1d..1c740f5cbd63 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -185,7 +185,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
185 | seq_printf(p, "%3d: ", i); | 185 | seq_printf(p, "%3d: ", i); |
186 | #ifdef CONFIG_SMP | 186 | #ifdef CONFIG_SMP |
187 | for_each_online_cpu(j) | 187 | for_each_online_cpu(j) |
188 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 188 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
189 | #else | 189 | #else |
190 | seq_printf(p, "%10u ", kstat_irqs(i)); | 190 | seq_printf(p, "%10u ", kstat_irqs(i)); |
191 | #endif | 191 | #endif |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 303d2b647e41..03b9a01bc16c 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -130,7 +130,7 @@ | |||
130 | ENTRY_OURS(newuname) | 130 | ENTRY_OURS(newuname) |
131 | ENTRY_SAME(umask) /* 60 */ | 131 | ENTRY_SAME(umask) /* 60 */ |
132 | ENTRY_SAME(chroot) | 132 | ENTRY_SAME(chroot) |
133 | ENTRY_SAME(ustat) | 133 | ENTRY_COMP(ustat) |
134 | ENTRY_SAME(dup2) | 134 | ENTRY_SAME(dup2) |
135 | ENTRY_SAME(getppid) | 135 | ENTRY_SAME(getppid) |
136 | ENTRY_SAME(getpgrp) /* 65 */ | 136 | ENTRY_SAME(getpgrp) /* 65 */ |
diff --git a/arch/powerpc/boot/dts/canyonlands.dts b/arch/powerpc/boot/dts/canyonlands.dts index 8b5ba8261a36..4447def69dc5 100644 --- a/arch/powerpc/boot/dts/canyonlands.dts +++ b/arch/powerpc/boot/dts/canyonlands.dts | |||
@@ -127,6 +127,13 @@ | |||
127 | dcr-reg = <0x010 0x002>; | 127 | dcr-reg = <0x010 0x002>; |
128 | }; | 128 | }; |
129 | 129 | ||
130 | CRYPTO: crypto@180000 { | ||
131 | compatible = "amcc,ppc460ex-crypto", "amcc,ppc4xx-crypto"; | ||
132 | reg = <4 0x00180000 0x80400>; | ||
133 | interrupt-parent = <&UIC0>; | ||
134 | interrupts = <0x1d 0x4>; | ||
135 | }; | ||
136 | |||
130 | MAL0: mcmal { | 137 | MAL0: mcmal { |
131 | compatible = "ibm,mcmal-460ex", "ibm,mcmal2"; | 138 | compatible = "ibm,mcmal-460ex", "ibm,mcmal2"; |
132 | dcr-reg = <0x180 0x062>; | 139 | dcr-reg = <0x180 0x062>; |
diff --git a/arch/powerpc/boot/dts/kilauea.dts b/arch/powerpc/boot/dts/kilauea.dts index 2804444812e5..5e6b08ff6f67 100644 --- a/arch/powerpc/boot/dts/kilauea.dts +++ b/arch/powerpc/boot/dts/kilauea.dts | |||
@@ -97,6 +97,13 @@ | |||
97 | 0x6 0x4>; /* ECC SEC Error */ | 97 | 0x6 0x4>; /* ECC SEC Error */ |
98 | }; | 98 | }; |
99 | 99 | ||
100 | CRYPTO: crypto@ef700000 { | ||
101 | compatible = "amcc,ppc405ex-crypto", "amcc,ppc4xx-crypto"; | ||
102 | reg = <0xef700000 0x80400>; | ||
103 | interrupt-parent = <&UIC0>; | ||
104 | interrupts = <0x17 0x2>; | ||
105 | }; | ||
106 | |||
100 | MAL0: mcmal { | 107 | MAL0: mcmal { |
101 | compatible = "ibm,mcmal-405ex", "ibm,mcmal2"; | 108 | compatible = "ibm,mcmal-405ex", "ibm,mcmal2"; |
102 | dcr-reg = <0x180 0x062>; | 109 | dcr-reg = <0x180 0x062>; |
diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h index 4e0cf65f7f5a..bb2de6aa5ce0 100644 --- a/arch/powerpc/include/asm/kvm.h +++ b/arch/powerpc/include/asm/kvm.h | |||
@@ -52,4 +52,11 @@ struct kvm_fpu { | |||
52 | __u64 fpr[32]; | 52 | __u64 fpr[32]; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | struct kvm_debug_exit_arch { | ||
56 | }; | ||
57 | |||
58 | /* for KVM_SET_GUEST_DEBUG */ | ||
59 | struct kvm_guest_debug_arch { | ||
60 | }; | ||
61 | |||
55 | #endif /* __LINUX_KVM_POWERPC_H */ | 62 | #endif /* __LINUX_KVM_POWERPC_H */ |
diff --git a/arch/powerpc/include/asm/kvm_44x.h b/arch/powerpc/include/asm/kvm_44x.h index f49031b632ca..d22d39942a92 100644 --- a/arch/powerpc/include/asm/kvm_44x.h +++ b/arch/powerpc/include/asm/kvm_44x.h | |||
@@ -28,6 +28,13 @@ | |||
28 | * need to find some way of advertising it. */ | 28 | * need to find some way of advertising it. */ |
29 | #define KVM44x_GUEST_TLB_SIZE 64 | 29 | #define KVM44x_GUEST_TLB_SIZE 64 |
30 | 30 | ||
31 | struct kvmppc_44x_tlbe { | ||
32 | u32 tid; /* Only the low 8 bits are used. */ | ||
33 | u32 word0; | ||
34 | u32 word1; | ||
35 | u32 word2; | ||
36 | }; | ||
37 | |||
31 | struct kvmppc_44x_shadow_ref { | 38 | struct kvmppc_44x_shadow_ref { |
32 | struct page *page; | 39 | struct page *page; |
33 | u16 gtlb_index; | 40 | u16 gtlb_index; |
diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h index 2197764796d9..56bfae59837f 100644 --- a/arch/powerpc/include/asm/kvm_asm.h +++ b/arch/powerpc/include/asm/kvm_asm.h | |||
@@ -42,7 +42,12 @@ | |||
42 | #define BOOKE_INTERRUPT_DTLB_MISS 13 | 42 | #define BOOKE_INTERRUPT_DTLB_MISS 13 |
43 | #define BOOKE_INTERRUPT_ITLB_MISS 14 | 43 | #define BOOKE_INTERRUPT_ITLB_MISS 14 |
44 | #define BOOKE_INTERRUPT_DEBUG 15 | 44 | #define BOOKE_INTERRUPT_DEBUG 15 |
45 | #define BOOKE_MAX_INTERRUPT 15 | 45 | |
46 | /* E500 */ | ||
47 | #define BOOKE_INTERRUPT_SPE_UNAVAIL 32 | ||
48 | #define BOOKE_INTERRUPT_SPE_FP_DATA 33 | ||
49 | #define BOOKE_INTERRUPT_SPE_FP_ROUND 34 | ||
50 | #define BOOKE_INTERRUPT_PERFORMANCE_MONITOR 35 | ||
46 | 51 | ||
47 | #define RESUME_FLAG_NV (1<<0) /* Reload guest nonvolatile state? */ | 52 | #define RESUME_FLAG_NV (1<<0) /* Reload guest nonvolatile state? */ |
48 | #define RESUME_FLAG_HOST (1<<1) /* Resume host? */ | 53 | #define RESUME_FLAG_HOST (1<<1) /* Resume host? */ |
diff --git a/arch/powerpc/include/asm/kvm_e500.h b/arch/powerpc/include/asm/kvm_e500.h new file mode 100644 index 000000000000..9d497ce49726 --- /dev/null +++ b/arch/powerpc/include/asm/kvm_e500.h | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. | ||
3 | * | ||
4 | * Author: Yu Liu, <yu.liu@freescale.com> | ||
5 | * | ||
6 | * Description: | ||
7 | * This file is derived from arch/powerpc/include/asm/kvm_44x.h, | ||
8 | * by Hollis Blanchard <hollisb@us.ibm.com>. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License, version 2, as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_KVM_E500_H__ | ||
16 | #define __ASM_KVM_E500_H__ | ||
17 | |||
18 | #include <linux/kvm_host.h> | ||
19 | |||
20 | #define BOOKE_INTERRUPT_SIZE 36 | ||
21 | |||
22 | #define E500_PID_NUM 3 | ||
23 | #define E500_TLB_NUM 2 | ||
24 | |||
25 | struct tlbe{ | ||
26 | u32 mas1; | ||
27 | u32 mas2; | ||
28 | u32 mas3; | ||
29 | u32 mas7; | ||
30 | }; | ||
31 | |||
32 | struct kvmppc_vcpu_e500 { | ||
33 | /* Unmodified copy of the guest's TLB. */ | ||
34 | struct tlbe *guest_tlb[E500_TLB_NUM]; | ||
35 | /* TLB that's actually used when the guest is running. */ | ||
36 | struct tlbe *shadow_tlb[E500_TLB_NUM]; | ||
37 | /* Pages which are referenced in the shadow TLB. */ | ||
38 | struct page **shadow_pages[E500_TLB_NUM]; | ||
39 | |||
40 | unsigned int guest_tlb_size[E500_TLB_NUM]; | ||
41 | unsigned int shadow_tlb_size[E500_TLB_NUM]; | ||
42 | unsigned int guest_tlb_nv[E500_TLB_NUM]; | ||
43 | |||
44 | u32 host_pid[E500_PID_NUM]; | ||
45 | u32 pid[E500_PID_NUM]; | ||
46 | |||
47 | u32 mas0; | ||
48 | u32 mas1; | ||
49 | u32 mas2; | ||
50 | u32 mas3; | ||
51 | u32 mas4; | ||
52 | u32 mas5; | ||
53 | u32 mas6; | ||
54 | u32 mas7; | ||
55 | u32 l1csr1; | ||
56 | u32 hid0; | ||
57 | u32 hid1; | ||
58 | |||
59 | struct kvm_vcpu vcpu; | ||
60 | }; | ||
61 | |||
62 | static inline struct kvmppc_vcpu_e500 *to_e500(struct kvm_vcpu *vcpu) | ||
63 | { | ||
64 | return container_of(vcpu, struct kvmppc_vcpu_e500, vcpu); | ||
65 | } | ||
66 | |||
67 | #endif /* __ASM_KVM_E500_H__ */ | ||
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index c1e436fe7738..dfdf13c9fefd 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
@@ -64,13 +64,6 @@ struct kvm_vcpu_stat { | |||
64 | u32 halt_wakeup; | 64 | u32 halt_wakeup; |
65 | }; | 65 | }; |
66 | 66 | ||
67 | struct kvmppc_44x_tlbe { | ||
68 | u32 tid; /* Only the low 8 bits are used. */ | ||
69 | u32 word0; | ||
70 | u32 word1; | ||
71 | u32 word2; | ||
72 | }; | ||
73 | |||
74 | enum kvm_exit_types { | 67 | enum kvm_exit_types { |
75 | MMIO_EXITS, | 68 | MMIO_EXITS, |
76 | DCR_EXITS, | 69 | DCR_EXITS, |
@@ -118,11 +111,6 @@ struct kvm_arch { | |||
118 | struct kvm_vcpu_arch { | 111 | struct kvm_vcpu_arch { |
119 | u32 host_stack; | 112 | u32 host_stack; |
120 | u32 host_pid; | 113 | u32 host_pid; |
121 | u32 host_dbcr0; | ||
122 | u32 host_dbcr1; | ||
123 | u32 host_dbcr2; | ||
124 | u32 host_iac[4]; | ||
125 | u32 host_msr; | ||
126 | 114 | ||
127 | u64 fpr[32]; | 115 | u64 fpr[32]; |
128 | ulong gpr[32]; | 116 | ulong gpr[32]; |
@@ -157,7 +145,7 @@ struct kvm_vcpu_arch { | |||
157 | u32 tbu; | 145 | u32 tbu; |
158 | u32 tcr; | 146 | u32 tcr; |
159 | u32 tsr; | 147 | u32 tsr; |
160 | u32 ivor[16]; | 148 | u32 ivor[64]; |
161 | ulong ivpr; | 149 | ulong ivpr; |
162 | u32 pir; | 150 | u32 pir; |
163 | 151 | ||
@@ -170,6 +158,7 @@ struct kvm_vcpu_arch { | |||
170 | u32 ccr1; | 158 | u32 ccr1; |
171 | u32 dbcr0; | 159 | u32 dbcr0; |
172 | u32 dbcr1; | 160 | u32 dbcr1; |
161 | u32 dbsr; | ||
173 | 162 | ||
174 | #ifdef CONFIG_KVM_EXIT_TIMING | 163 | #ifdef CONFIG_KVM_EXIT_TIMING |
175 | struct kvmppc_exit_timing timing_exit; | 164 | struct kvmppc_exit_timing timing_exit; |
@@ -200,10 +189,4 @@ struct kvm_vcpu_arch { | |||
200 | unsigned long pending_exceptions; | 189 | unsigned long pending_exceptions; |
201 | }; | 190 | }; |
202 | 191 | ||
203 | struct kvm_guest_debug { | ||
204 | int enabled; | ||
205 | unsigned long bp[4]; | ||
206 | int singlestep; | ||
207 | }; | ||
208 | |||
209 | #endif /* __POWERPC_KVM_HOST_H__ */ | 192 | #endif /* __POWERPC_KVM_HOST_H__ */ |
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 36d2a50a8487..2c6ee349df5e 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
@@ -52,13 +52,19 @@ extern int kvmppc_emulate_instruction(struct kvm_run *run, | |||
52 | extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu); | 52 | extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu); |
53 | extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu); | 53 | extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu); |
54 | 54 | ||
55 | /* Core-specific hooks */ | ||
56 | |||
55 | extern void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr, | 57 | extern void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr, |
56 | u64 asid, u32 flags, u32 max_bytes, | ||
57 | unsigned int gtlb_idx); | 58 | unsigned int gtlb_idx); |
58 | extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode); | 59 | extern void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode); |
59 | extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid); | 60 | extern void kvmppc_mmu_switch_pid(struct kvm_vcpu *vcpu, u32 pid); |
60 | 61 | extern void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu); | |
61 | /* Core-specific hooks */ | 62 | extern int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr); |
63 | extern int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr); | ||
64 | extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index, | ||
65 | gva_t eaddr); | ||
66 | extern void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu); | ||
67 | extern void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu); | ||
62 | 68 | ||
63 | extern struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, | 69 | extern struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, |
64 | unsigned int id); | 70 | unsigned int id); |
@@ -71,9 +77,6 @@ extern int kvmppc_core_vcpu_translate(struct kvm_vcpu *vcpu, | |||
71 | extern void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu); | 77 | extern void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu); |
72 | extern void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu); | 78 | extern void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu); |
73 | 79 | ||
74 | extern void kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu); | ||
75 | extern void kvmppc_core_load_host_debugstate(struct kvm_vcpu *vcpu); | ||
76 | |||
77 | extern void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu); | 80 | extern void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu); |
78 | extern int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu); | 81 | extern int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu); |
79 | extern void kvmppc_core_queue_program(struct kvm_vcpu *vcpu); | 82 | extern void kvmppc_core_queue_program(struct kvm_vcpu *vcpu); |
diff --git a/arch/powerpc/include/asm/mmu-fsl-booke.h b/arch/powerpc/include/asm/mmu-fsl-booke.h index 3f941c0f7e8e..4285b64a65e0 100644 --- a/arch/powerpc/include/asm/mmu-fsl-booke.h +++ b/arch/powerpc/include/asm/mmu-fsl-booke.h | |||
@@ -75,6 +75,8 @@ | |||
75 | 75 | ||
76 | #ifndef __ASSEMBLY__ | 76 | #ifndef __ASSEMBLY__ |
77 | 77 | ||
78 | extern unsigned int tlbcam_index; | ||
79 | |||
78 | typedef struct { | 80 | typedef struct { |
79 | unsigned int id; | 81 | unsigned int id; |
80 | unsigned int active; | 82 | unsigned int active; |
diff --git a/arch/powerpc/include/asm/socket.h b/arch/powerpc/include/asm/socket.h index f5a4e168e498..1e5cfad0e3f7 100644 --- a/arch/powerpc/include/asm/socket.h +++ b/arch/powerpc/include/asm/socket.h | |||
@@ -61,4 +61,7 @@ | |||
61 | 61 | ||
62 | #define SO_MARK 36 | 62 | #define SO_MARK 36 |
63 | 63 | ||
64 | #define SO_TIMESTAMPING 37 | ||
65 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
66 | |||
64 | #endif /* _ASM_POWERPC_SOCKET_H */ | 67 | #endif /* _ASM_POWERPC_SOCKET_H */ |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 72353f6070a4..fe166491e9dc 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -65,7 +65,7 @@ SYSCALL(ni_syscall) | |||
65 | SYSX(sys_ni_syscall,sys_olduname, sys_olduname) | 65 | SYSX(sys_ni_syscall,sys_olduname, sys_olduname) |
66 | COMPAT_SYS_SPU(umask) | 66 | COMPAT_SYS_SPU(umask) |
67 | SYSCALL_SPU(chroot) | 67 | SYSCALL_SPU(chroot) |
68 | SYSCALL(ustat) | 68 | COMPAT_SYS(ustat) |
69 | SYSCALL_SPU(dup2) | 69 | SYSCALL_SPU(dup2) |
70 | SYSCALL_SPU(getppid) | 70 | SYSCALL_SPU(getppid) |
71 | SYSCALL_SPU(getpgrp) | 71 | SYSCALL_SPU(getpgrp) |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 19ee491e9e23..42fe4da4e8ae 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -49,7 +49,7 @@ | |||
49 | #include <asm/iseries/alpaca.h> | 49 | #include <asm/iseries/alpaca.h> |
50 | #endif | 50 | #endif |
51 | #ifdef CONFIG_KVM | 51 | #ifdef CONFIG_KVM |
52 | #include <asm/kvm_44x.h> | 52 | #include <linux/kvm_host.h> |
53 | #endif | 53 | #endif |
54 | 54 | ||
55 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) | 55 | #if defined(CONFIG_BOOKE) || defined(CONFIG_40x) |
@@ -361,8 +361,6 @@ int main(void) | |||
361 | DEFINE(PTE_SIZE, sizeof(pte_t)); | 361 | DEFINE(PTE_SIZE, sizeof(pte_t)); |
362 | 362 | ||
363 | #ifdef CONFIG_KVM | 363 | #ifdef CONFIG_KVM |
364 | DEFINE(TLBE_BYTES, sizeof(struct kvmppc_44x_tlbe)); | ||
365 | |||
366 | DEFINE(VCPU_HOST_STACK, offsetof(struct kvm_vcpu, arch.host_stack)); | 364 | DEFINE(VCPU_HOST_STACK, offsetof(struct kvm_vcpu, arch.host_stack)); |
367 | DEFINE(VCPU_HOST_PID, offsetof(struct kvm_vcpu, arch.host_pid)); | 365 | DEFINE(VCPU_HOST_PID, offsetof(struct kvm_vcpu, arch.host_pid)); |
368 | DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr)); | 366 | DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr)); |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index ad1e5ac721d8..1b55ffdf0026 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -190,7 +190,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
190 | seq_printf(p, "%3d: ", i); | 190 | seq_printf(p, "%3d: ", i); |
191 | #ifdef CONFIG_SMP | 191 | #ifdef CONFIG_SMP |
192 | for_each_online_cpu(j) | 192 | for_each_online_cpu(j) |
193 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 193 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
194 | #else | 194 | #else |
195 | seq_printf(p, "%10u ", kstat_irqs(i)); | 195 | seq_printf(p, "%10u ", kstat_irqs(i)); |
196 | #endif /* CONFIG_SMP */ | 196 | #endif /* CONFIG_SMP */ |
diff --git a/arch/powerpc/kvm/44x.c b/arch/powerpc/kvm/44x.c index a66bec57265a..0cef809cec21 100644 --- a/arch/powerpc/kvm/44x.c +++ b/arch/powerpc/kvm/44x.c | |||
@@ -28,72 +28,6 @@ | |||
28 | 28 | ||
29 | #include "44x_tlb.h" | 29 | #include "44x_tlb.h" |
30 | 30 | ||
31 | /* Note: clearing MSR[DE] just means that the debug interrupt will not be | ||
32 | * delivered *immediately*. Instead, it simply sets the appropriate DBSR bits. | ||
33 | * If those DBSR bits are still set when MSR[DE] is re-enabled, the interrupt | ||
34 | * will be delivered as an "imprecise debug event" (which is indicated by | ||
35 | * DBSR[IDE]. | ||
36 | */ | ||
37 | static void kvm44x_disable_debug_interrupts(void) | ||
38 | { | ||
39 | mtmsr(mfmsr() & ~MSR_DE); | ||
40 | } | ||
41 | |||
42 | void kvmppc_core_load_host_debugstate(struct kvm_vcpu *vcpu) | ||
43 | { | ||
44 | kvm44x_disable_debug_interrupts(); | ||
45 | |||
46 | mtspr(SPRN_IAC1, vcpu->arch.host_iac[0]); | ||
47 | mtspr(SPRN_IAC2, vcpu->arch.host_iac[1]); | ||
48 | mtspr(SPRN_IAC3, vcpu->arch.host_iac[2]); | ||
49 | mtspr(SPRN_IAC4, vcpu->arch.host_iac[3]); | ||
50 | mtspr(SPRN_DBCR1, vcpu->arch.host_dbcr1); | ||
51 | mtspr(SPRN_DBCR2, vcpu->arch.host_dbcr2); | ||
52 | mtspr(SPRN_DBCR0, vcpu->arch.host_dbcr0); | ||
53 | mtmsr(vcpu->arch.host_msr); | ||
54 | } | ||
55 | |||
56 | void kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu) | ||
57 | { | ||
58 | struct kvm_guest_debug *dbg = &vcpu->guest_debug; | ||
59 | u32 dbcr0 = 0; | ||
60 | |||
61 | vcpu->arch.host_msr = mfmsr(); | ||
62 | kvm44x_disable_debug_interrupts(); | ||
63 | |||
64 | /* Save host debug register state. */ | ||
65 | vcpu->arch.host_iac[0] = mfspr(SPRN_IAC1); | ||
66 | vcpu->arch.host_iac[1] = mfspr(SPRN_IAC2); | ||
67 | vcpu->arch.host_iac[2] = mfspr(SPRN_IAC3); | ||
68 | vcpu->arch.host_iac[3] = mfspr(SPRN_IAC4); | ||
69 | vcpu->arch.host_dbcr0 = mfspr(SPRN_DBCR0); | ||
70 | vcpu->arch.host_dbcr1 = mfspr(SPRN_DBCR1); | ||
71 | vcpu->arch.host_dbcr2 = mfspr(SPRN_DBCR2); | ||
72 | |||
73 | /* set registers up for guest */ | ||
74 | |||
75 | if (dbg->bp[0]) { | ||
76 | mtspr(SPRN_IAC1, dbg->bp[0]); | ||
77 | dbcr0 |= DBCR0_IAC1 | DBCR0_IDM; | ||
78 | } | ||
79 | if (dbg->bp[1]) { | ||
80 | mtspr(SPRN_IAC2, dbg->bp[1]); | ||
81 | dbcr0 |= DBCR0_IAC2 | DBCR0_IDM; | ||
82 | } | ||
83 | if (dbg->bp[2]) { | ||
84 | mtspr(SPRN_IAC3, dbg->bp[2]); | ||
85 | dbcr0 |= DBCR0_IAC3 | DBCR0_IDM; | ||
86 | } | ||
87 | if (dbg->bp[3]) { | ||
88 | mtspr(SPRN_IAC4, dbg->bp[3]); | ||
89 | dbcr0 |= DBCR0_IAC4 | DBCR0_IDM; | ||
90 | } | ||
91 | |||
92 | mtspr(SPRN_DBCR0, dbcr0); | ||
93 | mtspr(SPRN_DBCR1, 0); | ||
94 | mtspr(SPRN_DBCR2, 0); | ||
95 | } | ||
96 | |||
97 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | 31 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
98 | { | 32 | { |
99 | kvmppc_44x_tlb_load(vcpu); | 33 | kvmppc_44x_tlb_load(vcpu); |
@@ -149,8 +83,6 @@ int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu) | |||
149 | int kvmppc_core_vcpu_translate(struct kvm_vcpu *vcpu, | 83 | int kvmppc_core_vcpu_translate(struct kvm_vcpu *vcpu, |
150 | struct kvm_translation *tr) | 84 | struct kvm_translation *tr) |
151 | { | 85 | { |
152 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | ||
153 | struct kvmppc_44x_tlbe *gtlbe; | ||
154 | int index; | 86 | int index; |
155 | gva_t eaddr; | 87 | gva_t eaddr; |
156 | u8 pid; | 88 | u8 pid; |
@@ -166,9 +98,7 @@ int kvmppc_core_vcpu_translate(struct kvm_vcpu *vcpu, | |||
166 | return 0; | 98 | return 0; |
167 | } | 99 | } |
168 | 100 | ||
169 | gtlbe = &vcpu_44x->guest_tlb[index]; | 101 | tr->physical_address = kvmppc_mmu_xlate(vcpu, index, eaddr); |
170 | |||
171 | tr->physical_address = tlb_xlate(gtlbe, eaddr); | ||
172 | /* XXX what does "writeable" and "usermode" even mean? */ | 102 | /* XXX what does "writeable" and "usermode" even mean? */ |
173 | tr->valid = 1; | 103 | tr->valid = 1; |
174 | 104 | ||
diff --git a/arch/powerpc/kvm/44x_emulate.c b/arch/powerpc/kvm/44x_emulate.c index 82489a743a6f..61af58fcecee 100644 --- a/arch/powerpc/kvm/44x_emulate.c +++ b/arch/powerpc/kvm/44x_emulate.c | |||
@@ -27,25 +27,12 @@ | |||
27 | #include "booke.h" | 27 | #include "booke.h" |
28 | #include "44x_tlb.h" | 28 | #include "44x_tlb.h" |
29 | 29 | ||
30 | #define OP_RFI 19 | ||
31 | |||
32 | #define XOP_RFI 50 | ||
33 | #define XOP_MFMSR 83 | ||
34 | #define XOP_WRTEE 131 | ||
35 | #define XOP_MTMSR 146 | ||
36 | #define XOP_WRTEEI 163 | ||
37 | #define XOP_MFDCR 323 | 30 | #define XOP_MFDCR 323 |
38 | #define XOP_MTDCR 451 | 31 | #define XOP_MTDCR 451 |
39 | #define XOP_TLBSX 914 | 32 | #define XOP_TLBSX 914 |
40 | #define XOP_ICCCI 966 | 33 | #define XOP_ICCCI 966 |
41 | #define XOP_TLBWE 978 | 34 | #define XOP_TLBWE 978 |
42 | 35 | ||
43 | static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu) | ||
44 | { | ||
45 | vcpu->arch.pc = vcpu->arch.srr0; | ||
46 | kvmppc_set_msr(vcpu, vcpu->arch.srr1); | ||
47 | } | ||
48 | |||
49 | int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | 36 | int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, |
50 | unsigned int inst, int *advance) | 37 | unsigned int inst, int *advance) |
51 | { | 38 | { |
@@ -59,48 +46,9 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
59 | int ws; | 46 | int ws; |
60 | 47 | ||
61 | switch (get_op(inst)) { | 48 | switch (get_op(inst)) { |
62 | case OP_RFI: | ||
63 | switch (get_xop(inst)) { | ||
64 | case XOP_RFI: | ||
65 | kvmppc_emul_rfi(vcpu); | ||
66 | kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS); | ||
67 | *advance = 0; | ||
68 | break; | ||
69 | |||
70 | default: | ||
71 | emulated = EMULATE_FAIL; | ||
72 | break; | ||
73 | } | ||
74 | break; | ||
75 | |||
76 | case 31: | 49 | case 31: |
77 | switch (get_xop(inst)) { | 50 | switch (get_xop(inst)) { |
78 | 51 | ||
79 | case XOP_MFMSR: | ||
80 | rt = get_rt(inst); | ||
81 | vcpu->arch.gpr[rt] = vcpu->arch.msr; | ||
82 | kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS); | ||
83 | break; | ||
84 | |||
85 | case XOP_MTMSR: | ||
86 | rs = get_rs(inst); | ||
87 | kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS); | ||
88 | kvmppc_set_msr(vcpu, vcpu->arch.gpr[rs]); | ||
89 | break; | ||
90 | |||
91 | case XOP_WRTEE: | ||
92 | rs = get_rs(inst); | ||
93 | vcpu->arch.msr = (vcpu->arch.msr & ~MSR_EE) | ||
94 | | (vcpu->arch.gpr[rs] & MSR_EE); | ||
95 | kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS); | ||
96 | break; | ||
97 | |||
98 | case XOP_WRTEEI: | ||
99 | vcpu->arch.msr = (vcpu->arch.msr & ~MSR_EE) | ||
100 | | (inst & MSR_EE); | ||
101 | kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS); | ||
102 | break; | ||
103 | |||
104 | case XOP_MFDCR: | 52 | case XOP_MFDCR: |
105 | dcrn = get_dcrn(inst); | 53 | dcrn = get_dcrn(inst); |
106 | rt = get_rt(inst); | 54 | rt = get_rt(inst); |
@@ -186,186 +134,51 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
186 | emulated = EMULATE_FAIL; | 134 | emulated = EMULATE_FAIL; |
187 | } | 135 | } |
188 | 136 | ||
137 | if (emulated == EMULATE_FAIL) | ||
138 | emulated = kvmppc_booke_emulate_op(run, vcpu, inst, advance); | ||
139 | |||
189 | return emulated; | 140 | return emulated; |
190 | } | 141 | } |
191 | 142 | ||
192 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | 143 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) |
193 | { | 144 | { |
145 | int emulated = EMULATE_DONE; | ||
146 | |||
194 | switch (sprn) { | 147 | switch (sprn) { |
195 | case SPRN_MMUCR: | ||
196 | vcpu->arch.mmucr = vcpu->arch.gpr[rs]; break; | ||
197 | case SPRN_PID: | 148 | case SPRN_PID: |
198 | kvmppc_set_pid(vcpu, vcpu->arch.gpr[rs]); break; | 149 | kvmppc_set_pid(vcpu, vcpu->arch.gpr[rs]); break; |
150 | case SPRN_MMUCR: | ||
151 | vcpu->arch.mmucr = vcpu->arch.gpr[rs]; break; | ||
199 | case SPRN_CCR0: | 152 | case SPRN_CCR0: |
200 | vcpu->arch.ccr0 = vcpu->arch.gpr[rs]; break; | 153 | vcpu->arch.ccr0 = vcpu->arch.gpr[rs]; break; |
201 | case SPRN_CCR1: | 154 | case SPRN_CCR1: |
202 | vcpu->arch.ccr1 = vcpu->arch.gpr[rs]; break; | 155 | vcpu->arch.ccr1 = vcpu->arch.gpr[rs]; break; |
203 | case SPRN_DEAR: | ||
204 | vcpu->arch.dear = vcpu->arch.gpr[rs]; break; | ||
205 | case SPRN_ESR: | ||
206 | vcpu->arch.esr = vcpu->arch.gpr[rs]; break; | ||
207 | case SPRN_DBCR0: | ||
208 | vcpu->arch.dbcr0 = vcpu->arch.gpr[rs]; break; | ||
209 | case SPRN_DBCR1: | ||
210 | vcpu->arch.dbcr1 = vcpu->arch.gpr[rs]; break; | ||
211 | case SPRN_TSR: | ||
212 | vcpu->arch.tsr &= ~vcpu->arch.gpr[rs]; break; | ||
213 | case SPRN_TCR: | ||
214 | vcpu->arch.tcr = vcpu->arch.gpr[rs]; | ||
215 | kvmppc_emulate_dec(vcpu); | ||
216 | break; | ||
217 | |||
218 | /* Note: SPRG4-7 are user-readable. These values are | ||
219 | * loaded into the real SPRGs when resuming the | ||
220 | * guest. */ | ||
221 | case SPRN_SPRG4: | ||
222 | vcpu->arch.sprg4 = vcpu->arch.gpr[rs]; break; | ||
223 | case SPRN_SPRG5: | ||
224 | vcpu->arch.sprg5 = vcpu->arch.gpr[rs]; break; | ||
225 | case SPRN_SPRG6: | ||
226 | vcpu->arch.sprg6 = vcpu->arch.gpr[rs]; break; | ||
227 | case SPRN_SPRG7: | ||
228 | vcpu->arch.sprg7 = vcpu->arch.gpr[rs]; break; | ||
229 | |||
230 | case SPRN_IVPR: | ||
231 | vcpu->arch.ivpr = vcpu->arch.gpr[rs]; | ||
232 | break; | ||
233 | case SPRN_IVOR0: | ||
234 | vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL] = vcpu->arch.gpr[rs]; | ||
235 | break; | ||
236 | case SPRN_IVOR1: | ||
237 | vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK] = vcpu->arch.gpr[rs]; | ||
238 | break; | ||
239 | case SPRN_IVOR2: | ||
240 | vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = vcpu->arch.gpr[rs]; | ||
241 | break; | ||
242 | case SPRN_IVOR3: | ||
243 | vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE] = vcpu->arch.gpr[rs]; | ||
244 | break; | ||
245 | case SPRN_IVOR4: | ||
246 | vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL] = vcpu->arch.gpr[rs]; | ||
247 | break; | ||
248 | case SPRN_IVOR5: | ||
249 | vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT] = vcpu->arch.gpr[rs]; | ||
250 | break; | ||
251 | case SPRN_IVOR6: | ||
252 | vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] = vcpu->arch.gpr[rs]; | ||
253 | break; | ||
254 | case SPRN_IVOR7: | ||
255 | vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL] = vcpu->arch.gpr[rs]; | ||
256 | break; | ||
257 | case SPRN_IVOR8: | ||
258 | vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = vcpu->arch.gpr[rs]; | ||
259 | break; | ||
260 | case SPRN_IVOR9: | ||
261 | vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = vcpu->arch.gpr[rs]; | ||
262 | break; | ||
263 | case SPRN_IVOR10: | ||
264 | vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER] = vcpu->arch.gpr[rs]; | ||
265 | break; | ||
266 | case SPRN_IVOR11: | ||
267 | vcpu->arch.ivor[BOOKE_IRQPRIO_FIT] = vcpu->arch.gpr[rs]; | ||
268 | break; | ||
269 | case SPRN_IVOR12: | ||
270 | vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG] = vcpu->arch.gpr[rs]; | ||
271 | break; | ||
272 | case SPRN_IVOR13: | ||
273 | vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS] = vcpu->arch.gpr[rs]; | ||
274 | break; | ||
275 | case SPRN_IVOR14: | ||
276 | vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS] = vcpu->arch.gpr[rs]; | ||
277 | break; | ||
278 | case SPRN_IVOR15: | ||
279 | vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG] = vcpu->arch.gpr[rs]; | ||
280 | break; | ||
281 | |||
282 | default: | 156 | default: |
283 | return EMULATE_FAIL; | 157 | emulated = kvmppc_booke_emulate_mtspr(vcpu, sprn, rs); |
284 | } | 158 | } |
285 | 159 | ||
286 | kvmppc_set_exit_type(vcpu, EMULATED_MTSPR_EXITS); | 160 | kvmppc_set_exit_type(vcpu, EMULATED_MTSPR_EXITS); |
287 | return EMULATE_DONE; | 161 | return emulated; |
288 | } | 162 | } |
289 | 163 | ||
290 | int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | 164 | int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) |
291 | { | 165 | { |
166 | int emulated = EMULATE_DONE; | ||
167 | |||
292 | switch (sprn) { | 168 | switch (sprn) { |
293 | /* 440 */ | 169 | case SPRN_PID: |
170 | vcpu->arch.gpr[rt] = vcpu->arch.pid; break; | ||
294 | case SPRN_MMUCR: | 171 | case SPRN_MMUCR: |
295 | vcpu->arch.gpr[rt] = vcpu->arch.mmucr; break; | 172 | vcpu->arch.gpr[rt] = vcpu->arch.mmucr; break; |
296 | case SPRN_CCR0: | 173 | case SPRN_CCR0: |
297 | vcpu->arch.gpr[rt] = vcpu->arch.ccr0; break; | 174 | vcpu->arch.gpr[rt] = vcpu->arch.ccr0; break; |
298 | case SPRN_CCR1: | 175 | case SPRN_CCR1: |
299 | vcpu->arch.gpr[rt] = vcpu->arch.ccr1; break; | 176 | vcpu->arch.gpr[rt] = vcpu->arch.ccr1; break; |
300 | |||
301 | /* Book E */ | ||
302 | case SPRN_PID: | ||
303 | vcpu->arch.gpr[rt] = vcpu->arch.pid; break; | ||
304 | case SPRN_IVPR: | ||
305 | vcpu->arch.gpr[rt] = vcpu->arch.ivpr; break; | ||
306 | case SPRN_DEAR: | ||
307 | vcpu->arch.gpr[rt] = vcpu->arch.dear; break; | ||
308 | case SPRN_ESR: | ||
309 | vcpu->arch.gpr[rt] = vcpu->arch.esr; break; | ||
310 | case SPRN_DBCR0: | ||
311 | vcpu->arch.gpr[rt] = vcpu->arch.dbcr0; break; | ||
312 | case SPRN_DBCR1: | ||
313 | vcpu->arch.gpr[rt] = vcpu->arch.dbcr1; break; | ||
314 | |||
315 | case SPRN_IVOR0: | ||
316 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL]; | ||
317 | break; | ||
318 | case SPRN_IVOR1: | ||
319 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK]; | ||
320 | break; | ||
321 | case SPRN_IVOR2: | ||
322 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE]; | ||
323 | break; | ||
324 | case SPRN_IVOR3: | ||
325 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE]; | ||
326 | break; | ||
327 | case SPRN_IVOR4: | ||
328 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL]; | ||
329 | break; | ||
330 | case SPRN_IVOR5: | ||
331 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT]; | ||
332 | break; | ||
333 | case SPRN_IVOR6: | ||
334 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM]; | ||
335 | break; | ||
336 | case SPRN_IVOR7: | ||
337 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL]; | ||
338 | break; | ||
339 | case SPRN_IVOR8: | ||
340 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL]; | ||
341 | break; | ||
342 | case SPRN_IVOR9: | ||
343 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL]; | ||
344 | break; | ||
345 | case SPRN_IVOR10: | ||
346 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER]; | ||
347 | break; | ||
348 | case SPRN_IVOR11: | ||
349 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT]; | ||
350 | break; | ||
351 | case SPRN_IVOR12: | ||
352 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG]; | ||
353 | break; | ||
354 | case SPRN_IVOR13: | ||
355 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS]; | ||
356 | break; | ||
357 | case SPRN_IVOR14: | ||
358 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS]; | ||
359 | break; | ||
360 | case SPRN_IVOR15: | ||
361 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG]; | ||
362 | break; | ||
363 | |||
364 | default: | 177 | default: |
365 | return EMULATE_FAIL; | 178 | emulated = kvmppc_booke_emulate_mfspr(vcpu, sprn, rt); |
366 | } | 179 | } |
367 | 180 | ||
368 | kvmppc_set_exit_type(vcpu, EMULATED_MFSPR_EXITS); | 181 | kvmppc_set_exit_type(vcpu, EMULATED_MFSPR_EXITS); |
369 | return EMULATE_DONE; | 182 | return emulated; |
370 | } | 183 | } |
371 | 184 | ||
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c index 9a34b8edb9e2..4a16f472cc18 100644 --- a/arch/powerpc/kvm/44x_tlb.c +++ b/arch/powerpc/kvm/44x_tlb.c | |||
@@ -208,20 +208,38 @@ int kvmppc_44x_tlb_index(struct kvm_vcpu *vcpu, gva_t eaddr, unsigned int pid, | |||
208 | return -1; | 208 | return -1; |
209 | } | 209 | } |
210 | 210 | ||
211 | int kvmppc_44x_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr) | 211 | gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index, |
212 | gva_t eaddr) | ||
213 | { | ||
214 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | ||
215 | struct kvmppc_44x_tlbe *gtlbe = &vcpu_44x->guest_tlb[gtlb_index]; | ||
216 | unsigned int pgmask = get_tlb_bytes(gtlbe) - 1; | ||
217 | |||
218 | return get_tlb_raddr(gtlbe) | (eaddr & pgmask); | ||
219 | } | ||
220 | |||
221 | int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr) | ||
212 | { | 222 | { |
213 | unsigned int as = !!(vcpu->arch.msr & MSR_IS); | 223 | unsigned int as = !!(vcpu->arch.msr & MSR_IS); |
214 | 224 | ||
215 | return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu->arch.pid, as); | 225 | return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu->arch.pid, as); |
216 | } | 226 | } |
217 | 227 | ||
218 | int kvmppc_44x_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr) | 228 | int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr) |
219 | { | 229 | { |
220 | unsigned int as = !!(vcpu->arch.msr & MSR_DS); | 230 | unsigned int as = !!(vcpu->arch.msr & MSR_DS); |
221 | 231 | ||
222 | return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu->arch.pid, as); | 232 | return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu->arch.pid, as); |
223 | } | 233 | } |
224 | 234 | ||
235 | void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu) | ||
236 | { | ||
237 | } | ||
238 | |||
239 | void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu) | ||
240 | { | ||
241 | } | ||
242 | |||
225 | static void kvmppc_44x_shadow_release(struct kvmppc_vcpu_44x *vcpu_44x, | 243 | static void kvmppc_44x_shadow_release(struct kvmppc_vcpu_44x *vcpu_44x, |
226 | unsigned int stlb_index) | 244 | unsigned int stlb_index) |
227 | { | 245 | { |
@@ -248,7 +266,7 @@ static void kvmppc_44x_shadow_release(struct kvmppc_vcpu_44x *vcpu_44x, | |||
248 | KVMTRACE_1D(STLB_INVAL, &vcpu_44x->vcpu, stlb_index, handler); | 266 | KVMTRACE_1D(STLB_INVAL, &vcpu_44x->vcpu, stlb_index, handler); |
249 | } | 267 | } |
250 | 268 | ||
251 | void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu) | 269 | void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu) |
252 | { | 270 | { |
253 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | 271 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); |
254 | int i; | 272 | int i; |
@@ -269,15 +287,19 @@ void kvmppc_core_destroy_mmu(struct kvm_vcpu *vcpu) | |||
269 | * Caller must ensure that the specified guest TLB entry is safe to insert into | 287 | * Caller must ensure that the specified guest TLB entry is safe to insert into |
270 | * the shadow TLB. | 288 | * the shadow TLB. |
271 | */ | 289 | */ |
272 | void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr, u64 asid, | 290 | void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr, |
273 | u32 flags, u32 max_bytes, unsigned int gtlb_index) | 291 | unsigned int gtlb_index) |
274 | { | 292 | { |
275 | struct kvmppc_44x_tlbe stlbe; | 293 | struct kvmppc_44x_tlbe stlbe; |
276 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | 294 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); |
295 | struct kvmppc_44x_tlbe *gtlbe = &vcpu_44x->guest_tlb[gtlb_index]; | ||
277 | struct kvmppc_44x_shadow_ref *ref; | 296 | struct kvmppc_44x_shadow_ref *ref; |
278 | struct page *new_page; | 297 | struct page *new_page; |
279 | hpa_t hpaddr; | 298 | hpa_t hpaddr; |
280 | gfn_t gfn; | 299 | gfn_t gfn; |
300 | u32 asid = gtlbe->tid; | ||
301 | u32 flags = gtlbe->word2; | ||
302 | u32 max_bytes = get_tlb_bytes(gtlbe); | ||
281 | unsigned int victim; | 303 | unsigned int victim; |
282 | 304 | ||
283 | /* Select TLB entry to clobber. Indirectly guard against races with the TLB | 305 | /* Select TLB entry to clobber. Indirectly guard against races with the TLB |
@@ -448,10 +470,8 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws) | |||
448 | } | 470 | } |
449 | 471 | ||
450 | if (tlbe_is_host_safe(vcpu, tlbe)) { | 472 | if (tlbe_is_host_safe(vcpu, tlbe)) { |
451 | u64 asid; | ||
452 | gva_t eaddr; | 473 | gva_t eaddr; |
453 | gpa_t gpaddr; | 474 | gpa_t gpaddr; |
454 | u32 flags; | ||
455 | u32 bytes; | 475 | u32 bytes; |
456 | 476 | ||
457 | eaddr = get_tlb_eaddr(tlbe); | 477 | eaddr = get_tlb_eaddr(tlbe); |
@@ -462,10 +482,7 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws) | |||
462 | eaddr &= ~(bytes - 1); | 482 | eaddr &= ~(bytes - 1); |
463 | gpaddr &= ~(bytes - 1); | 483 | gpaddr &= ~(bytes - 1); |
464 | 484 | ||
465 | asid = (tlbe->word0 & PPC44x_TLB_TS) | tlbe->tid; | 485 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index); |
466 | flags = tlbe->word2 & 0xffff; | ||
467 | |||
468 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, asid, flags, bytes, gtlb_index); | ||
469 | } | 486 | } |
470 | 487 | ||
471 | KVMTRACE_5D(GTLB_WRITE, vcpu, gtlb_index, tlbe->tid, tlbe->word0, | 488 | KVMTRACE_5D(GTLB_WRITE, vcpu, gtlb_index, tlbe->tid, tlbe->word0, |
diff --git a/arch/powerpc/kvm/44x_tlb.h b/arch/powerpc/kvm/44x_tlb.h index 772191f29e62..a9ff80e51526 100644 --- a/arch/powerpc/kvm/44x_tlb.h +++ b/arch/powerpc/kvm/44x_tlb.h | |||
@@ -25,8 +25,6 @@ | |||
25 | 25 | ||
26 | extern int kvmppc_44x_tlb_index(struct kvm_vcpu *vcpu, gva_t eaddr, | 26 | extern int kvmppc_44x_tlb_index(struct kvm_vcpu *vcpu, gva_t eaddr, |
27 | unsigned int pid, unsigned int as); | 27 | unsigned int pid, unsigned int as); |
28 | extern int kvmppc_44x_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr); | ||
29 | extern int kvmppc_44x_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr); | ||
30 | 28 | ||
31 | extern int kvmppc_44x_emul_tlbsx(struct kvm_vcpu *vcpu, u8 rt, u8 ra, u8 rb, | 29 | extern int kvmppc_44x_emul_tlbsx(struct kvm_vcpu *vcpu, u8 rt, u8 ra, u8 rb, |
32 | u8 rc); | 30 | u8 rc); |
@@ -85,11 +83,4 @@ static inline unsigned int get_mmucr_sts(const struct kvm_vcpu *vcpu) | |||
85 | return (vcpu->arch.mmucr >> 16) & 0x1; | 83 | return (vcpu->arch.mmucr >> 16) & 0x1; |
86 | } | 84 | } |
87 | 85 | ||
88 | static inline gpa_t tlb_xlate(struct kvmppc_44x_tlbe *tlbe, gva_t eaddr) | ||
89 | { | ||
90 | unsigned int pgmask = get_tlb_bytes(tlbe) - 1; | ||
91 | |||
92 | return get_tlb_raddr(tlbe) | (eaddr & pgmask); | ||
93 | } | ||
94 | |||
95 | #endif /* __KVM_POWERPC_TLB_H__ */ | 86 | #endif /* __KVM_POWERPC_TLB_H__ */ |
diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 6dbdc4817d80..5a152a52796f 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig | |||
@@ -2,6 +2,9 @@ | |||
2 | # KVM configuration | 2 | # KVM configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | config HAVE_KVM_IRQCHIP | ||
6 | bool | ||
7 | |||
5 | menuconfig VIRTUALIZATION | 8 | menuconfig VIRTUALIZATION |
6 | bool "Virtualization" | 9 | bool "Virtualization" |
7 | ---help--- | 10 | ---help--- |
@@ -43,6 +46,19 @@ config KVM_EXIT_TIMING | |||
43 | 46 | ||
44 | If unsure, say N. | 47 | If unsure, say N. |
45 | 48 | ||
49 | config KVM_E500 | ||
50 | bool "KVM support for PowerPC E500 processors" | ||
51 | depends on EXPERIMENTAL && E500 | ||
52 | select KVM | ||
53 | ---help--- | ||
54 | Support running unmodified E500 guest kernels in virtual machines on | ||
55 | E500 host processors. | ||
56 | |||
57 | This module provides access to the hardware capabilities through | ||
58 | a character device node named /dev/kvm. | ||
59 | |||
60 | If unsure, say N. | ||
61 | |||
46 | config KVM_TRACE | 62 | config KVM_TRACE |
47 | bool "KVM trace support" | 63 | bool "KVM trace support" |
48 | depends on KVM && MARKERS && SYSFS | 64 | depends on KVM && MARKERS && SYSFS |
diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile index df7ba59e6d53..4b2df66c79d8 100644 --- a/arch/powerpc/kvm/Makefile +++ b/arch/powerpc/kvm/Makefile | |||
@@ -16,8 +16,18 @@ AFLAGS_booke_interrupts.o := -I$(obj) | |||
16 | 16 | ||
17 | kvm-440-objs := \ | 17 | kvm-440-objs := \ |
18 | booke.o \ | 18 | booke.o \ |
19 | booke_emulate.o \ | ||
19 | booke_interrupts.o \ | 20 | booke_interrupts.o \ |
20 | 44x.o \ | 21 | 44x.o \ |
21 | 44x_tlb.o \ | 22 | 44x_tlb.o \ |
22 | 44x_emulate.o | 23 | 44x_emulate.o |
23 | obj-$(CONFIG_KVM_440) += kvm-440.o | 24 | obj-$(CONFIG_KVM_440) += kvm-440.o |
25 | |||
26 | kvm-e500-objs := \ | ||
27 | booke.o \ | ||
28 | booke_emulate.o \ | ||
29 | booke_interrupts.o \ | ||
30 | e500.o \ | ||
31 | e500_tlb.o \ | ||
32 | e500_emulate.o | ||
33 | obj-$(CONFIG_KVM_E500) += kvm-e500.o | ||
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 35485dd6927e..642e4204cf25 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -30,10 +30,8 @@ | |||
30 | #include <asm/kvm_ppc.h> | 30 | #include <asm/kvm_ppc.h> |
31 | #include "timing.h" | 31 | #include "timing.h" |
32 | #include <asm/cacheflush.h> | 32 | #include <asm/cacheflush.h> |
33 | #include <asm/kvm_44x.h> | ||
34 | 33 | ||
35 | #include "booke.h" | 34 | #include "booke.h" |
36 | #include "44x_tlb.h" | ||
37 | 35 | ||
38 | unsigned long kvmppc_booke_handlers; | 36 | unsigned long kvmppc_booke_handlers; |
39 | 37 | ||
@@ -120,6 +118,9 @@ static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu, | |||
120 | case BOOKE_IRQPRIO_DATA_STORAGE: | 118 | case BOOKE_IRQPRIO_DATA_STORAGE: |
121 | case BOOKE_IRQPRIO_INST_STORAGE: | 119 | case BOOKE_IRQPRIO_INST_STORAGE: |
122 | case BOOKE_IRQPRIO_FP_UNAVAIL: | 120 | case BOOKE_IRQPRIO_FP_UNAVAIL: |
121 | case BOOKE_IRQPRIO_SPE_UNAVAIL: | ||
122 | case BOOKE_IRQPRIO_SPE_FP_DATA: | ||
123 | case BOOKE_IRQPRIO_SPE_FP_ROUND: | ||
123 | case BOOKE_IRQPRIO_AP_UNAVAIL: | 124 | case BOOKE_IRQPRIO_AP_UNAVAIL: |
124 | case BOOKE_IRQPRIO_ALIGNMENT: | 125 | case BOOKE_IRQPRIO_ALIGNMENT: |
125 | allowed = 1; | 126 | allowed = 1; |
@@ -165,7 +166,7 @@ void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu) | |||
165 | unsigned int priority; | 166 | unsigned int priority; |
166 | 167 | ||
167 | priority = __ffs(*pending); | 168 | priority = __ffs(*pending); |
168 | while (priority <= BOOKE_MAX_INTERRUPT) { | 169 | while (priority <= BOOKE_IRQPRIO_MAX) { |
169 | if (kvmppc_booke_irqprio_deliver(vcpu, priority)) | 170 | if (kvmppc_booke_irqprio_deliver(vcpu, priority)) |
170 | break; | 171 | break; |
171 | 172 | ||
@@ -263,6 +264,21 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
263 | r = RESUME_GUEST; | 264 | r = RESUME_GUEST; |
264 | break; | 265 | break; |
265 | 266 | ||
267 | case BOOKE_INTERRUPT_SPE_UNAVAIL: | ||
268 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_SPE_UNAVAIL); | ||
269 | r = RESUME_GUEST; | ||
270 | break; | ||
271 | |||
272 | case BOOKE_INTERRUPT_SPE_FP_DATA: | ||
273 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_SPE_FP_DATA); | ||
274 | r = RESUME_GUEST; | ||
275 | break; | ||
276 | |||
277 | case BOOKE_INTERRUPT_SPE_FP_ROUND: | ||
278 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_SPE_FP_ROUND); | ||
279 | r = RESUME_GUEST; | ||
280 | break; | ||
281 | |||
266 | case BOOKE_INTERRUPT_DATA_STORAGE: | 282 | case BOOKE_INTERRUPT_DATA_STORAGE: |
267 | vcpu->arch.dear = vcpu->arch.fault_dear; | 283 | vcpu->arch.dear = vcpu->arch.fault_dear; |
268 | vcpu->arch.esr = vcpu->arch.fault_esr; | 284 | vcpu->arch.esr = vcpu->arch.fault_esr; |
@@ -284,29 +300,27 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
284 | r = RESUME_GUEST; | 300 | r = RESUME_GUEST; |
285 | break; | 301 | break; |
286 | 302 | ||
287 | /* XXX move to a 440-specific file. */ | ||
288 | case BOOKE_INTERRUPT_DTLB_MISS: { | 303 | case BOOKE_INTERRUPT_DTLB_MISS: { |
289 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | ||
290 | struct kvmppc_44x_tlbe *gtlbe; | ||
291 | unsigned long eaddr = vcpu->arch.fault_dear; | 304 | unsigned long eaddr = vcpu->arch.fault_dear; |
292 | int gtlb_index; | 305 | int gtlb_index; |
306 | gpa_t gpaddr; | ||
293 | gfn_t gfn; | 307 | gfn_t gfn; |
294 | 308 | ||
295 | /* Check the guest TLB. */ | 309 | /* Check the guest TLB. */ |
296 | gtlb_index = kvmppc_44x_dtlb_index(vcpu, eaddr); | 310 | gtlb_index = kvmppc_mmu_dtlb_index(vcpu, eaddr); |
297 | if (gtlb_index < 0) { | 311 | if (gtlb_index < 0) { |
298 | /* The guest didn't have a mapping for it. */ | 312 | /* The guest didn't have a mapping for it. */ |
299 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_DTLB_MISS); | 313 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_DTLB_MISS); |
300 | vcpu->arch.dear = vcpu->arch.fault_dear; | 314 | vcpu->arch.dear = vcpu->arch.fault_dear; |
301 | vcpu->arch.esr = vcpu->arch.fault_esr; | 315 | vcpu->arch.esr = vcpu->arch.fault_esr; |
316 | kvmppc_mmu_dtlb_miss(vcpu); | ||
302 | kvmppc_account_exit(vcpu, DTLB_REAL_MISS_EXITS); | 317 | kvmppc_account_exit(vcpu, DTLB_REAL_MISS_EXITS); |
303 | r = RESUME_GUEST; | 318 | r = RESUME_GUEST; |
304 | break; | 319 | break; |
305 | } | 320 | } |
306 | 321 | ||
307 | gtlbe = &vcpu_44x->guest_tlb[gtlb_index]; | 322 | gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr); |
308 | vcpu->arch.paddr_accessed = tlb_xlate(gtlbe, eaddr); | 323 | gfn = gpaddr >> PAGE_SHIFT; |
309 | gfn = vcpu->arch.paddr_accessed >> PAGE_SHIFT; | ||
310 | 324 | ||
311 | if (kvm_is_visible_gfn(vcpu->kvm, gfn)) { | 325 | if (kvm_is_visible_gfn(vcpu->kvm, gfn)) { |
312 | /* The guest TLB had a mapping, but the shadow TLB | 326 | /* The guest TLB had a mapping, but the shadow TLB |
@@ -315,13 +329,13 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
315 | * b) the guest used a large mapping which we're faking | 329 | * b) the guest used a large mapping which we're faking |
316 | * Either way, we need to satisfy the fault without | 330 | * Either way, we need to satisfy the fault without |
317 | * invoking the guest. */ | 331 | * invoking the guest. */ |
318 | kvmppc_mmu_map(vcpu, eaddr, vcpu->arch.paddr_accessed, gtlbe->tid, | 332 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index); |
319 | gtlbe->word2, get_tlb_bytes(gtlbe), gtlb_index); | ||
320 | kvmppc_account_exit(vcpu, DTLB_VIRT_MISS_EXITS); | 333 | kvmppc_account_exit(vcpu, DTLB_VIRT_MISS_EXITS); |
321 | r = RESUME_GUEST; | 334 | r = RESUME_GUEST; |
322 | } else { | 335 | } else { |
323 | /* Guest has mapped and accessed a page which is not | 336 | /* Guest has mapped and accessed a page which is not |
324 | * actually RAM. */ | 337 | * actually RAM. */ |
338 | vcpu->arch.paddr_accessed = gpaddr; | ||
325 | r = kvmppc_emulate_mmio(run, vcpu); | 339 | r = kvmppc_emulate_mmio(run, vcpu); |
326 | kvmppc_account_exit(vcpu, MMIO_EXITS); | 340 | kvmppc_account_exit(vcpu, MMIO_EXITS); |
327 | } | 341 | } |
@@ -329,10 +343,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
329 | break; | 343 | break; |
330 | } | 344 | } |
331 | 345 | ||
332 | /* XXX move to a 440-specific file. */ | ||
333 | case BOOKE_INTERRUPT_ITLB_MISS: { | 346 | case BOOKE_INTERRUPT_ITLB_MISS: { |
334 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | ||
335 | struct kvmppc_44x_tlbe *gtlbe; | ||
336 | unsigned long eaddr = vcpu->arch.pc; | 347 | unsigned long eaddr = vcpu->arch.pc; |
337 | gpa_t gpaddr; | 348 | gpa_t gpaddr; |
338 | gfn_t gfn; | 349 | gfn_t gfn; |
@@ -341,18 +352,18 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
341 | r = RESUME_GUEST; | 352 | r = RESUME_GUEST; |
342 | 353 | ||
343 | /* Check the guest TLB. */ | 354 | /* Check the guest TLB. */ |
344 | gtlb_index = kvmppc_44x_itlb_index(vcpu, eaddr); | 355 | gtlb_index = kvmppc_mmu_itlb_index(vcpu, eaddr); |
345 | if (gtlb_index < 0) { | 356 | if (gtlb_index < 0) { |
346 | /* The guest didn't have a mapping for it. */ | 357 | /* The guest didn't have a mapping for it. */ |
347 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_ITLB_MISS); | 358 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_ITLB_MISS); |
359 | kvmppc_mmu_itlb_miss(vcpu); | ||
348 | kvmppc_account_exit(vcpu, ITLB_REAL_MISS_EXITS); | 360 | kvmppc_account_exit(vcpu, ITLB_REAL_MISS_EXITS); |
349 | break; | 361 | break; |
350 | } | 362 | } |
351 | 363 | ||
352 | kvmppc_account_exit(vcpu, ITLB_VIRT_MISS_EXITS); | 364 | kvmppc_account_exit(vcpu, ITLB_VIRT_MISS_EXITS); |
353 | 365 | ||
354 | gtlbe = &vcpu_44x->guest_tlb[gtlb_index]; | 366 | gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr); |
355 | gpaddr = tlb_xlate(gtlbe, eaddr); | ||
356 | gfn = gpaddr >> PAGE_SHIFT; | 367 | gfn = gpaddr >> PAGE_SHIFT; |
357 | 368 | ||
358 | if (kvm_is_visible_gfn(vcpu->kvm, gfn)) { | 369 | if (kvm_is_visible_gfn(vcpu->kvm, gfn)) { |
@@ -362,8 +373,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
362 | * b) the guest used a large mapping which we're faking | 373 | * b) the guest used a large mapping which we're faking |
363 | * Either way, we need to satisfy the fault without | 374 | * Either way, we need to satisfy the fault without |
364 | * invoking the guest. */ | 375 | * invoking the guest. */ |
365 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlbe->tid, | 376 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index); |
366 | gtlbe->word2, get_tlb_bytes(gtlbe), gtlb_index); | ||
367 | } else { | 377 | } else { |
368 | /* Guest mapped and leaped at non-RAM! */ | 378 | /* Guest mapped and leaped at non-RAM! */ |
369 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_MACHINE_CHECK); | 379 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_MACHINE_CHECK); |
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h index cf7c94ca24bf..d59bcca1f9d8 100644 --- a/arch/powerpc/kvm/booke.h +++ b/arch/powerpc/kvm/booke.h | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
24 | #include <linux/kvm_host.h> | 24 | #include <linux/kvm_host.h> |
25 | #include <asm/kvm_ppc.h> | ||
25 | #include "timing.h" | 26 | #include "timing.h" |
26 | 27 | ||
27 | /* interrupt priortity ordering */ | 28 | /* interrupt priortity ordering */ |
@@ -30,17 +31,24 @@ | |||
30 | #define BOOKE_IRQPRIO_ALIGNMENT 2 | 31 | #define BOOKE_IRQPRIO_ALIGNMENT 2 |
31 | #define BOOKE_IRQPRIO_PROGRAM 3 | 32 | #define BOOKE_IRQPRIO_PROGRAM 3 |
32 | #define BOOKE_IRQPRIO_FP_UNAVAIL 4 | 33 | #define BOOKE_IRQPRIO_FP_UNAVAIL 4 |
33 | #define BOOKE_IRQPRIO_SYSCALL 5 | 34 | #define BOOKE_IRQPRIO_SPE_UNAVAIL 5 |
34 | #define BOOKE_IRQPRIO_AP_UNAVAIL 6 | 35 | #define BOOKE_IRQPRIO_SPE_FP_DATA 6 |
35 | #define BOOKE_IRQPRIO_DTLB_MISS 7 | 36 | #define BOOKE_IRQPRIO_SPE_FP_ROUND 7 |
36 | #define BOOKE_IRQPRIO_ITLB_MISS 8 | 37 | #define BOOKE_IRQPRIO_SYSCALL 8 |
37 | #define BOOKE_IRQPRIO_MACHINE_CHECK 9 | 38 | #define BOOKE_IRQPRIO_AP_UNAVAIL 9 |
38 | #define BOOKE_IRQPRIO_DEBUG 10 | 39 | #define BOOKE_IRQPRIO_DTLB_MISS 10 |
39 | #define BOOKE_IRQPRIO_CRITICAL 11 | 40 | #define BOOKE_IRQPRIO_ITLB_MISS 11 |
40 | #define BOOKE_IRQPRIO_WATCHDOG 12 | 41 | #define BOOKE_IRQPRIO_MACHINE_CHECK 12 |
41 | #define BOOKE_IRQPRIO_EXTERNAL 13 | 42 | #define BOOKE_IRQPRIO_DEBUG 13 |
42 | #define BOOKE_IRQPRIO_FIT 14 | 43 | #define BOOKE_IRQPRIO_CRITICAL 14 |
43 | #define BOOKE_IRQPRIO_DECREMENTER 15 | 44 | #define BOOKE_IRQPRIO_WATCHDOG 15 |
45 | #define BOOKE_IRQPRIO_EXTERNAL 16 | ||
46 | #define BOOKE_IRQPRIO_FIT 17 | ||
47 | #define BOOKE_IRQPRIO_DECREMENTER 18 | ||
48 | #define BOOKE_IRQPRIO_PERFORMANCE_MONITOR 19 | ||
49 | #define BOOKE_IRQPRIO_MAX 19 | ||
50 | |||
51 | extern unsigned long kvmppc_booke_handlers; | ||
44 | 52 | ||
45 | /* Helper function for "full" MSR writes. No need to call this if only EE is | 53 | /* Helper function for "full" MSR writes. No need to call this if only EE is |
46 | * changing. */ | 54 | * changing. */ |
@@ -57,4 +65,9 @@ static inline void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr) | |||
57 | }; | 65 | }; |
58 | } | 66 | } |
59 | 67 | ||
68 | int kvmppc_booke_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
69 | unsigned int inst, int *advance); | ||
70 | int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt); | ||
71 | int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs); | ||
72 | |||
60 | #endif /* __KVM_BOOKE_H__ */ | 73 | #endif /* __KVM_BOOKE_H__ */ |
diff --git a/arch/powerpc/kvm/booke_emulate.c b/arch/powerpc/kvm/booke_emulate.c new file mode 100644 index 000000000000..aebc65e93f4b --- /dev/null +++ b/arch/powerpc/kvm/booke_emulate.c | |||
@@ -0,0 +1,266 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License, version 2, as | ||
4 | * published by the Free Software Foundation. | ||
5 | * | ||
6 | * This program is distributed in the hope that it will be useful, | ||
7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
9 | * GNU General Public License for more details. | ||
10 | * | ||
11 | * You should have received a copy of the GNU General Public License | ||
12 | * along with this program; if not, write to the Free Software | ||
13 | * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
14 | * | ||
15 | * Copyright IBM Corp. 2008 | ||
16 | * | ||
17 | * Authors: Hollis Blanchard <hollisb@us.ibm.com> | ||
18 | */ | ||
19 | |||
20 | #include <linux/kvm_host.h> | ||
21 | #include <asm/disassemble.h> | ||
22 | |||
23 | #include "booke.h" | ||
24 | |||
25 | #define OP_19_XOP_RFI 50 | ||
26 | |||
27 | #define OP_31_XOP_MFMSR 83 | ||
28 | #define OP_31_XOP_WRTEE 131 | ||
29 | #define OP_31_XOP_MTMSR 146 | ||
30 | #define OP_31_XOP_WRTEEI 163 | ||
31 | |||
32 | static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu) | ||
33 | { | ||
34 | vcpu->arch.pc = vcpu->arch.srr0; | ||
35 | kvmppc_set_msr(vcpu, vcpu->arch.srr1); | ||
36 | } | ||
37 | |||
38 | int kvmppc_booke_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
39 | unsigned int inst, int *advance) | ||
40 | { | ||
41 | int emulated = EMULATE_DONE; | ||
42 | int rs; | ||
43 | int rt; | ||
44 | |||
45 | switch (get_op(inst)) { | ||
46 | case 19: | ||
47 | switch (get_xop(inst)) { | ||
48 | case OP_19_XOP_RFI: | ||
49 | kvmppc_emul_rfi(vcpu); | ||
50 | kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS); | ||
51 | *advance = 0; | ||
52 | break; | ||
53 | |||
54 | default: | ||
55 | emulated = EMULATE_FAIL; | ||
56 | break; | ||
57 | } | ||
58 | break; | ||
59 | |||
60 | case 31: | ||
61 | switch (get_xop(inst)) { | ||
62 | |||
63 | case OP_31_XOP_MFMSR: | ||
64 | rt = get_rt(inst); | ||
65 | vcpu->arch.gpr[rt] = vcpu->arch.msr; | ||
66 | kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS); | ||
67 | break; | ||
68 | |||
69 | case OP_31_XOP_MTMSR: | ||
70 | rs = get_rs(inst); | ||
71 | kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS); | ||
72 | kvmppc_set_msr(vcpu, vcpu->arch.gpr[rs]); | ||
73 | break; | ||
74 | |||
75 | case OP_31_XOP_WRTEE: | ||
76 | rs = get_rs(inst); | ||
77 | vcpu->arch.msr = (vcpu->arch.msr & ~MSR_EE) | ||
78 | | (vcpu->arch.gpr[rs] & MSR_EE); | ||
79 | kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS); | ||
80 | break; | ||
81 | |||
82 | case OP_31_XOP_WRTEEI: | ||
83 | vcpu->arch.msr = (vcpu->arch.msr & ~MSR_EE) | ||
84 | | (inst & MSR_EE); | ||
85 | kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS); | ||
86 | break; | ||
87 | |||
88 | default: | ||
89 | emulated = EMULATE_FAIL; | ||
90 | } | ||
91 | |||
92 | break; | ||
93 | |||
94 | default: | ||
95 | emulated = EMULATE_FAIL; | ||
96 | } | ||
97 | |||
98 | return emulated; | ||
99 | } | ||
100 | |||
101 | int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | ||
102 | { | ||
103 | int emulated = EMULATE_DONE; | ||
104 | |||
105 | switch (sprn) { | ||
106 | case SPRN_DEAR: | ||
107 | vcpu->arch.dear = vcpu->arch.gpr[rs]; break; | ||
108 | case SPRN_ESR: | ||
109 | vcpu->arch.esr = vcpu->arch.gpr[rs]; break; | ||
110 | case SPRN_DBCR0: | ||
111 | vcpu->arch.dbcr0 = vcpu->arch.gpr[rs]; break; | ||
112 | case SPRN_DBCR1: | ||
113 | vcpu->arch.dbcr1 = vcpu->arch.gpr[rs]; break; | ||
114 | case SPRN_DBSR: | ||
115 | vcpu->arch.dbsr &= ~vcpu->arch.gpr[rs]; break; | ||
116 | case SPRN_TSR: | ||
117 | vcpu->arch.tsr &= ~vcpu->arch.gpr[rs]; break; | ||
118 | case SPRN_TCR: | ||
119 | vcpu->arch.tcr = vcpu->arch.gpr[rs]; | ||
120 | kvmppc_emulate_dec(vcpu); | ||
121 | break; | ||
122 | |||
123 | /* Note: SPRG4-7 are user-readable. These values are | ||
124 | * loaded into the real SPRGs when resuming the | ||
125 | * guest. */ | ||
126 | case SPRN_SPRG4: | ||
127 | vcpu->arch.sprg4 = vcpu->arch.gpr[rs]; break; | ||
128 | case SPRN_SPRG5: | ||
129 | vcpu->arch.sprg5 = vcpu->arch.gpr[rs]; break; | ||
130 | case SPRN_SPRG6: | ||
131 | vcpu->arch.sprg6 = vcpu->arch.gpr[rs]; break; | ||
132 | case SPRN_SPRG7: | ||
133 | vcpu->arch.sprg7 = vcpu->arch.gpr[rs]; break; | ||
134 | |||
135 | case SPRN_IVPR: | ||
136 | vcpu->arch.ivpr = vcpu->arch.gpr[rs]; | ||
137 | break; | ||
138 | case SPRN_IVOR0: | ||
139 | vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL] = vcpu->arch.gpr[rs]; | ||
140 | break; | ||
141 | case SPRN_IVOR1: | ||
142 | vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK] = vcpu->arch.gpr[rs]; | ||
143 | break; | ||
144 | case SPRN_IVOR2: | ||
145 | vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = vcpu->arch.gpr[rs]; | ||
146 | break; | ||
147 | case SPRN_IVOR3: | ||
148 | vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE] = vcpu->arch.gpr[rs]; | ||
149 | break; | ||
150 | case SPRN_IVOR4: | ||
151 | vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL] = vcpu->arch.gpr[rs]; | ||
152 | break; | ||
153 | case SPRN_IVOR5: | ||
154 | vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT] = vcpu->arch.gpr[rs]; | ||
155 | break; | ||
156 | case SPRN_IVOR6: | ||
157 | vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] = vcpu->arch.gpr[rs]; | ||
158 | break; | ||
159 | case SPRN_IVOR7: | ||
160 | vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL] = vcpu->arch.gpr[rs]; | ||
161 | break; | ||
162 | case SPRN_IVOR8: | ||
163 | vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = vcpu->arch.gpr[rs]; | ||
164 | break; | ||
165 | case SPRN_IVOR9: | ||
166 | vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = vcpu->arch.gpr[rs]; | ||
167 | break; | ||
168 | case SPRN_IVOR10: | ||
169 | vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER] = vcpu->arch.gpr[rs]; | ||
170 | break; | ||
171 | case SPRN_IVOR11: | ||
172 | vcpu->arch.ivor[BOOKE_IRQPRIO_FIT] = vcpu->arch.gpr[rs]; | ||
173 | break; | ||
174 | case SPRN_IVOR12: | ||
175 | vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG] = vcpu->arch.gpr[rs]; | ||
176 | break; | ||
177 | case SPRN_IVOR13: | ||
178 | vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS] = vcpu->arch.gpr[rs]; | ||
179 | break; | ||
180 | case SPRN_IVOR14: | ||
181 | vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS] = vcpu->arch.gpr[rs]; | ||
182 | break; | ||
183 | case SPRN_IVOR15: | ||
184 | vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG] = vcpu->arch.gpr[rs]; | ||
185 | break; | ||
186 | |||
187 | default: | ||
188 | emulated = EMULATE_FAIL; | ||
189 | } | ||
190 | |||
191 | return emulated; | ||
192 | } | ||
193 | |||
194 | int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | ||
195 | { | ||
196 | int emulated = EMULATE_DONE; | ||
197 | |||
198 | switch (sprn) { | ||
199 | case SPRN_IVPR: | ||
200 | vcpu->arch.gpr[rt] = vcpu->arch.ivpr; break; | ||
201 | case SPRN_DEAR: | ||
202 | vcpu->arch.gpr[rt] = vcpu->arch.dear; break; | ||
203 | case SPRN_ESR: | ||
204 | vcpu->arch.gpr[rt] = vcpu->arch.esr; break; | ||
205 | case SPRN_DBCR0: | ||
206 | vcpu->arch.gpr[rt] = vcpu->arch.dbcr0; break; | ||
207 | case SPRN_DBCR1: | ||
208 | vcpu->arch.gpr[rt] = vcpu->arch.dbcr1; break; | ||
209 | case SPRN_DBSR: | ||
210 | vcpu->arch.gpr[rt] = vcpu->arch.dbsr; break; | ||
211 | |||
212 | case SPRN_IVOR0: | ||
213 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL]; | ||
214 | break; | ||
215 | case SPRN_IVOR1: | ||
216 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK]; | ||
217 | break; | ||
218 | case SPRN_IVOR2: | ||
219 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE]; | ||
220 | break; | ||
221 | case SPRN_IVOR3: | ||
222 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE]; | ||
223 | break; | ||
224 | case SPRN_IVOR4: | ||
225 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL]; | ||
226 | break; | ||
227 | case SPRN_IVOR5: | ||
228 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT]; | ||
229 | break; | ||
230 | case SPRN_IVOR6: | ||
231 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM]; | ||
232 | break; | ||
233 | case SPRN_IVOR7: | ||
234 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL]; | ||
235 | break; | ||
236 | case SPRN_IVOR8: | ||
237 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL]; | ||
238 | break; | ||
239 | case SPRN_IVOR9: | ||
240 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL]; | ||
241 | break; | ||
242 | case SPRN_IVOR10: | ||
243 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER]; | ||
244 | break; | ||
245 | case SPRN_IVOR11: | ||
246 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT]; | ||
247 | break; | ||
248 | case SPRN_IVOR12: | ||
249 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG]; | ||
250 | break; | ||
251 | case SPRN_IVOR13: | ||
252 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS]; | ||
253 | break; | ||
254 | case SPRN_IVOR14: | ||
255 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS]; | ||
256 | break; | ||
257 | case SPRN_IVOR15: | ||
258 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG]; | ||
259 | break; | ||
260 | |||
261 | default: | ||
262 | emulated = EMULATE_FAIL; | ||
263 | } | ||
264 | |||
265 | return emulated; | ||
266 | } | ||
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S index 084ebcd7dd83..d0c6f841bbd1 100644 --- a/arch/powerpc/kvm/booke_interrupts.S +++ b/arch/powerpc/kvm/booke_interrupts.S | |||
@@ -86,6 +86,9 @@ KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG | |||
86 | KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS | 86 | KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS |
87 | KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS | 87 | KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS |
88 | KVM_HANDLER BOOKE_INTERRUPT_DEBUG | 88 | KVM_HANDLER BOOKE_INTERRUPT_DEBUG |
89 | KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL | ||
90 | KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA | ||
91 | KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND | ||
89 | 92 | ||
90 | _GLOBAL(kvmppc_handler_len) | 93 | _GLOBAL(kvmppc_handler_len) |
91 | .long kvmppc_handler_1 - kvmppc_handler_0 | 94 | .long kvmppc_handler_1 - kvmppc_handler_0 |
@@ -347,7 +350,9 @@ lightweight_exit: | |||
347 | lwz r3, VCPU_SHADOW_PID(r4) | 350 | lwz r3, VCPU_SHADOW_PID(r4) |
348 | mtspr SPRN_PID, r3 | 351 | mtspr SPRN_PID, r3 |
349 | 352 | ||
353 | #ifdef CONFIG_44x | ||
350 | iccci 0, 0 /* XXX hack */ | 354 | iccci 0, 0 /* XXX hack */ |
355 | #endif | ||
351 | 356 | ||
352 | /* Load some guest volatiles. */ | 357 | /* Load some guest volatiles. */ |
353 | lwz r0, VCPU_GPR(r0)(r4) | 358 | lwz r0, VCPU_GPR(r0)(r4) |
diff --git a/arch/powerpc/kvm/e500.c b/arch/powerpc/kvm/e500.c new file mode 100644 index 000000000000..d8067fd81cdd --- /dev/null +++ b/arch/powerpc/kvm/e500.c | |||
@@ -0,0 +1,169 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. | ||
3 | * | ||
4 | * Author: Yu Liu, <yu.liu@freescale.com> | ||
5 | * | ||
6 | * Description: | ||
7 | * This file is derived from arch/powerpc/kvm/44x.c, | ||
8 | * by Hollis Blanchard <hollisb@us.ibm.com>. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License, version 2, as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/kvm_host.h> | ||
16 | #include <linux/err.h> | ||
17 | |||
18 | #include <asm/reg.h> | ||
19 | #include <asm/cputable.h> | ||
20 | #include <asm/tlbflush.h> | ||
21 | #include <asm/kvm_e500.h> | ||
22 | #include <asm/kvm_ppc.h> | ||
23 | |||
24 | #include "booke.h" | ||
25 | #include "e500_tlb.h" | ||
26 | |||
27 | void kvmppc_core_load_host_debugstate(struct kvm_vcpu *vcpu) | ||
28 | { | ||
29 | } | ||
30 | |||
31 | void kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu) | ||
32 | { | ||
33 | } | ||
34 | |||
35 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | ||
36 | { | ||
37 | kvmppc_e500_tlb_load(vcpu, cpu); | ||
38 | } | ||
39 | |||
40 | void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) | ||
41 | { | ||
42 | kvmppc_e500_tlb_put(vcpu); | ||
43 | } | ||
44 | |||
45 | int kvmppc_core_check_processor_compat(void) | ||
46 | { | ||
47 | int r; | ||
48 | |||
49 | if (strcmp(cur_cpu_spec->cpu_name, "e500v2") == 0) | ||
50 | r = 0; | ||
51 | else | ||
52 | r = -ENOTSUPP; | ||
53 | |||
54 | return r; | ||
55 | } | ||
56 | |||
57 | int kvmppc_core_vcpu_setup(struct kvm_vcpu *vcpu) | ||
58 | { | ||
59 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
60 | |||
61 | kvmppc_e500_tlb_setup(vcpu_e500); | ||
62 | |||
63 | /* Use the same core vertion as host's */ | ||
64 | vcpu->arch.pvr = mfspr(SPRN_PVR); | ||
65 | |||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | /* 'linear_address' is actually an encoding of AS|PID|EADDR . */ | ||
70 | int kvmppc_core_vcpu_translate(struct kvm_vcpu *vcpu, | ||
71 | struct kvm_translation *tr) | ||
72 | { | ||
73 | int index; | ||
74 | gva_t eaddr; | ||
75 | u8 pid; | ||
76 | u8 as; | ||
77 | |||
78 | eaddr = tr->linear_address; | ||
79 | pid = (tr->linear_address >> 32) & 0xff; | ||
80 | as = (tr->linear_address >> 40) & 0x1; | ||
81 | |||
82 | index = kvmppc_e500_tlb_search(vcpu, eaddr, pid, as); | ||
83 | if (index < 0) { | ||
84 | tr->valid = 0; | ||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | tr->physical_address = kvmppc_mmu_xlate(vcpu, index, eaddr); | ||
89 | /* XXX what does "writeable" and "usermode" even mean? */ | ||
90 | tr->valid = 1; | ||
91 | |||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm, unsigned int id) | ||
96 | { | ||
97 | struct kvmppc_vcpu_e500 *vcpu_e500; | ||
98 | struct kvm_vcpu *vcpu; | ||
99 | int err; | ||
100 | |||
101 | vcpu_e500 = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL); | ||
102 | if (!vcpu_e500) { | ||
103 | err = -ENOMEM; | ||
104 | goto out; | ||
105 | } | ||
106 | |||
107 | vcpu = &vcpu_e500->vcpu; | ||
108 | err = kvm_vcpu_init(vcpu, kvm, id); | ||
109 | if (err) | ||
110 | goto free_vcpu; | ||
111 | |||
112 | err = kvmppc_e500_tlb_init(vcpu_e500); | ||
113 | if (err) | ||
114 | goto uninit_vcpu; | ||
115 | |||
116 | return vcpu; | ||
117 | |||
118 | uninit_vcpu: | ||
119 | kvm_vcpu_uninit(vcpu); | ||
120 | free_vcpu: | ||
121 | kmem_cache_free(kvm_vcpu_cache, vcpu_e500); | ||
122 | out: | ||
123 | return ERR_PTR(err); | ||
124 | } | ||
125 | |||
126 | void kvmppc_core_vcpu_free(struct kvm_vcpu *vcpu) | ||
127 | { | ||
128 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
129 | |||
130 | kvmppc_e500_tlb_uninit(vcpu_e500); | ||
131 | kvm_vcpu_uninit(vcpu); | ||
132 | kmem_cache_free(kvm_vcpu_cache, vcpu_e500); | ||
133 | } | ||
134 | |||
135 | static int kvmppc_e500_init(void) | ||
136 | { | ||
137 | int r, i; | ||
138 | unsigned long ivor[3]; | ||
139 | unsigned long max_ivor = 0; | ||
140 | |||
141 | r = kvmppc_booke_init(); | ||
142 | if (r) | ||
143 | return r; | ||
144 | |||
145 | /* copy extra E500 exception handlers */ | ||
146 | ivor[0] = mfspr(SPRN_IVOR32); | ||
147 | ivor[1] = mfspr(SPRN_IVOR33); | ||
148 | ivor[2] = mfspr(SPRN_IVOR34); | ||
149 | for (i = 0; i < 3; i++) { | ||
150 | if (ivor[i] > max_ivor) | ||
151 | max_ivor = ivor[i]; | ||
152 | |||
153 | memcpy((void *)kvmppc_booke_handlers + ivor[i], | ||
154 | kvmppc_handlers_start + (i + 16) * kvmppc_handler_len, | ||
155 | kvmppc_handler_len); | ||
156 | } | ||
157 | flush_icache_range(kvmppc_booke_handlers, | ||
158 | kvmppc_booke_handlers + max_ivor + kvmppc_handler_len); | ||
159 | |||
160 | return kvm_init(NULL, sizeof(struct kvmppc_vcpu_e500), THIS_MODULE); | ||
161 | } | ||
162 | |||
163 | static void kvmppc_e500_exit(void) | ||
164 | { | ||
165 | kvmppc_booke_exit(); | ||
166 | } | ||
167 | |||
168 | module_init(kvmppc_e500_init); | ||
169 | module_exit(kvmppc_e500_exit); | ||
diff --git a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c new file mode 100644 index 000000000000..3f760414b9f8 --- /dev/null +++ b/arch/powerpc/kvm/e500_emulate.c | |||
@@ -0,0 +1,202 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. | ||
3 | * | ||
4 | * Author: Yu Liu, <yu.liu@freescale.com> | ||
5 | * | ||
6 | * Description: | ||
7 | * This file is derived from arch/powerpc/kvm/44x_emulate.c, | ||
8 | * by Hollis Blanchard <hollisb@us.ibm.com>. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License, version 2, as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <asm/kvm_ppc.h> | ||
16 | #include <asm/disassemble.h> | ||
17 | #include <asm/kvm_e500.h> | ||
18 | |||
19 | #include "booke.h" | ||
20 | #include "e500_tlb.h" | ||
21 | |||
22 | #define XOP_TLBIVAX 786 | ||
23 | #define XOP_TLBSX 914 | ||
24 | #define XOP_TLBRE 946 | ||
25 | #define XOP_TLBWE 978 | ||
26 | |||
27 | int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
28 | unsigned int inst, int *advance) | ||
29 | { | ||
30 | int emulated = EMULATE_DONE; | ||
31 | int ra; | ||
32 | int rb; | ||
33 | |||
34 | switch (get_op(inst)) { | ||
35 | case 31: | ||
36 | switch (get_xop(inst)) { | ||
37 | |||
38 | case XOP_TLBRE: | ||
39 | emulated = kvmppc_e500_emul_tlbre(vcpu); | ||
40 | break; | ||
41 | |||
42 | case XOP_TLBWE: | ||
43 | emulated = kvmppc_e500_emul_tlbwe(vcpu); | ||
44 | break; | ||
45 | |||
46 | case XOP_TLBSX: | ||
47 | rb = get_rb(inst); | ||
48 | emulated = kvmppc_e500_emul_tlbsx(vcpu,rb); | ||
49 | break; | ||
50 | |||
51 | case XOP_TLBIVAX: | ||
52 | ra = get_ra(inst); | ||
53 | rb = get_rb(inst); | ||
54 | emulated = kvmppc_e500_emul_tlbivax(vcpu, ra, rb); | ||
55 | break; | ||
56 | |||
57 | default: | ||
58 | emulated = EMULATE_FAIL; | ||
59 | } | ||
60 | |||
61 | break; | ||
62 | |||
63 | default: | ||
64 | emulated = EMULATE_FAIL; | ||
65 | } | ||
66 | |||
67 | if (emulated == EMULATE_FAIL) | ||
68 | emulated = kvmppc_booke_emulate_op(run, vcpu, inst, advance); | ||
69 | |||
70 | return emulated; | ||
71 | } | ||
72 | |||
73 | int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs) | ||
74 | { | ||
75 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
76 | int emulated = EMULATE_DONE; | ||
77 | |||
78 | switch (sprn) { | ||
79 | case SPRN_PID: | ||
80 | vcpu_e500->pid[0] = vcpu->arch.shadow_pid = | ||
81 | vcpu->arch.pid = vcpu->arch.gpr[rs]; | ||
82 | break; | ||
83 | case SPRN_PID1: | ||
84 | vcpu_e500->pid[1] = vcpu->arch.gpr[rs]; break; | ||
85 | case SPRN_PID2: | ||
86 | vcpu_e500->pid[2] = vcpu->arch.gpr[rs]; break; | ||
87 | case SPRN_MAS0: | ||
88 | vcpu_e500->mas0 = vcpu->arch.gpr[rs]; break; | ||
89 | case SPRN_MAS1: | ||
90 | vcpu_e500->mas1 = vcpu->arch.gpr[rs]; break; | ||
91 | case SPRN_MAS2: | ||
92 | vcpu_e500->mas2 = vcpu->arch.gpr[rs]; break; | ||
93 | case SPRN_MAS3: | ||
94 | vcpu_e500->mas3 = vcpu->arch.gpr[rs]; break; | ||
95 | case SPRN_MAS4: | ||
96 | vcpu_e500->mas4 = vcpu->arch.gpr[rs]; break; | ||
97 | case SPRN_MAS6: | ||
98 | vcpu_e500->mas6 = vcpu->arch.gpr[rs]; break; | ||
99 | case SPRN_MAS7: | ||
100 | vcpu_e500->mas7 = vcpu->arch.gpr[rs]; break; | ||
101 | case SPRN_L1CSR1: | ||
102 | vcpu_e500->l1csr1 = vcpu->arch.gpr[rs]; break; | ||
103 | case SPRN_HID0: | ||
104 | vcpu_e500->hid0 = vcpu->arch.gpr[rs]; break; | ||
105 | case SPRN_HID1: | ||
106 | vcpu_e500->hid1 = vcpu->arch.gpr[rs]; break; | ||
107 | |||
108 | case SPRN_MMUCSR0: | ||
109 | emulated = kvmppc_e500_emul_mt_mmucsr0(vcpu_e500, | ||
110 | vcpu->arch.gpr[rs]); | ||
111 | break; | ||
112 | |||
113 | /* extra exceptions */ | ||
114 | case SPRN_IVOR32: | ||
115 | vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_UNAVAIL] = vcpu->arch.gpr[rs]; | ||
116 | break; | ||
117 | case SPRN_IVOR33: | ||
118 | vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_FP_DATA] = vcpu->arch.gpr[rs]; | ||
119 | break; | ||
120 | case SPRN_IVOR34: | ||
121 | vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_FP_ROUND] = vcpu->arch.gpr[rs]; | ||
122 | break; | ||
123 | case SPRN_IVOR35: | ||
124 | vcpu->arch.ivor[BOOKE_IRQPRIO_PERFORMANCE_MONITOR] = vcpu->arch.gpr[rs]; | ||
125 | break; | ||
126 | |||
127 | default: | ||
128 | emulated = kvmppc_booke_emulate_mtspr(vcpu, sprn, rs); | ||
129 | } | ||
130 | |||
131 | return emulated; | ||
132 | } | ||
133 | |||
134 | int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt) | ||
135 | { | ||
136 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
137 | int emulated = EMULATE_DONE; | ||
138 | |||
139 | switch (sprn) { | ||
140 | case SPRN_PID: | ||
141 | vcpu->arch.gpr[rt] = vcpu_e500->pid[0]; break; | ||
142 | case SPRN_PID1: | ||
143 | vcpu->arch.gpr[rt] = vcpu_e500->pid[1]; break; | ||
144 | case SPRN_PID2: | ||
145 | vcpu->arch.gpr[rt] = vcpu_e500->pid[2]; break; | ||
146 | case SPRN_MAS0: | ||
147 | vcpu->arch.gpr[rt] = vcpu_e500->mas0; break; | ||
148 | case SPRN_MAS1: | ||
149 | vcpu->arch.gpr[rt] = vcpu_e500->mas1; break; | ||
150 | case SPRN_MAS2: | ||
151 | vcpu->arch.gpr[rt] = vcpu_e500->mas2; break; | ||
152 | case SPRN_MAS3: | ||
153 | vcpu->arch.gpr[rt] = vcpu_e500->mas3; break; | ||
154 | case SPRN_MAS4: | ||
155 | vcpu->arch.gpr[rt] = vcpu_e500->mas4; break; | ||
156 | case SPRN_MAS6: | ||
157 | vcpu->arch.gpr[rt] = vcpu_e500->mas6; break; | ||
158 | case SPRN_MAS7: | ||
159 | vcpu->arch.gpr[rt] = vcpu_e500->mas7; break; | ||
160 | |||
161 | case SPRN_TLB0CFG: | ||
162 | vcpu->arch.gpr[rt] = mfspr(SPRN_TLB0CFG); | ||
163 | vcpu->arch.gpr[rt] &= ~0xfffUL; | ||
164 | vcpu->arch.gpr[rt] |= vcpu_e500->guest_tlb_size[0]; | ||
165 | break; | ||
166 | |||
167 | case SPRN_TLB1CFG: | ||
168 | vcpu->arch.gpr[rt] = mfspr(SPRN_TLB1CFG); | ||
169 | vcpu->arch.gpr[rt] &= ~0xfffUL; | ||
170 | vcpu->arch.gpr[rt] |= vcpu_e500->guest_tlb_size[1]; | ||
171 | break; | ||
172 | |||
173 | case SPRN_L1CSR1: | ||
174 | vcpu->arch.gpr[rt] = vcpu_e500->l1csr1; break; | ||
175 | case SPRN_HID0: | ||
176 | vcpu->arch.gpr[rt] = vcpu_e500->hid0; break; | ||
177 | case SPRN_HID1: | ||
178 | vcpu->arch.gpr[rt] = vcpu_e500->hid1; break; | ||
179 | |||
180 | case SPRN_MMUCSR0: | ||
181 | vcpu->arch.gpr[rt] = 0; break; | ||
182 | |||
183 | /* extra exceptions */ | ||
184 | case SPRN_IVOR32: | ||
185 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_UNAVAIL]; | ||
186 | break; | ||
187 | case SPRN_IVOR33: | ||
188 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_FP_DATA]; | ||
189 | break; | ||
190 | case SPRN_IVOR34: | ||
191 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_FP_ROUND]; | ||
192 | break; | ||
193 | case SPRN_IVOR35: | ||
194 | vcpu->arch.gpr[rt] = vcpu->arch.ivor[BOOKE_IRQPRIO_PERFORMANCE_MONITOR]; | ||
195 | break; | ||
196 | default: | ||
197 | emulated = kvmppc_booke_emulate_mfspr(vcpu, sprn, rt); | ||
198 | } | ||
199 | |||
200 | return emulated; | ||
201 | } | ||
202 | |||
diff --git a/arch/powerpc/kvm/e500_tlb.c b/arch/powerpc/kvm/e500_tlb.c new file mode 100644 index 000000000000..0e773fc2d5e4 --- /dev/null +++ b/arch/powerpc/kvm/e500_tlb.c | |||
@@ -0,0 +1,757 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. | ||
3 | * | ||
4 | * Author: Yu Liu, yu.liu@freescale.com | ||
5 | * | ||
6 | * Description: | ||
7 | * This file is based on arch/powerpc/kvm/44x_tlb.c, | ||
8 | * by Hollis Blanchard <hollisb@us.ibm.com>. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License, version 2, as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/types.h> | ||
16 | #include <linux/string.h> | ||
17 | #include <linux/kvm.h> | ||
18 | #include <linux/kvm_host.h> | ||
19 | #include <linux/highmem.h> | ||
20 | #include <asm/kvm_ppc.h> | ||
21 | #include <asm/kvm_e500.h> | ||
22 | |||
23 | #include "../mm/mmu_decl.h" | ||
24 | #include "e500_tlb.h" | ||
25 | |||
26 | #define to_htlb1_esel(esel) (tlb1_entry_num - (esel) - 1) | ||
27 | |||
28 | static unsigned int tlb1_entry_num; | ||
29 | |||
30 | void kvmppc_dump_tlbs(struct kvm_vcpu *vcpu) | ||
31 | { | ||
32 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
33 | struct tlbe *tlbe; | ||
34 | int i, tlbsel; | ||
35 | |||
36 | printk("| %8s | %8s | %8s | %8s | %8s |\n", | ||
37 | "nr", "mas1", "mas2", "mas3", "mas7"); | ||
38 | |||
39 | for (tlbsel = 0; tlbsel < 2; tlbsel++) { | ||
40 | printk("Guest TLB%d:\n", tlbsel); | ||
41 | for (i = 0; i < vcpu_e500->guest_tlb_size[tlbsel]; i++) { | ||
42 | tlbe = &vcpu_e500->guest_tlb[tlbsel][i]; | ||
43 | if (tlbe->mas1 & MAS1_VALID) | ||
44 | printk(" G[%d][%3d] | %08X | %08X | %08X | %08X |\n", | ||
45 | tlbsel, i, tlbe->mas1, tlbe->mas2, | ||
46 | tlbe->mas3, tlbe->mas7); | ||
47 | } | ||
48 | } | ||
49 | |||
50 | for (tlbsel = 0; tlbsel < 2; tlbsel++) { | ||
51 | printk("Shadow TLB%d:\n", tlbsel); | ||
52 | for (i = 0; i < vcpu_e500->shadow_tlb_size[tlbsel]; i++) { | ||
53 | tlbe = &vcpu_e500->shadow_tlb[tlbsel][i]; | ||
54 | if (tlbe->mas1 & MAS1_VALID) | ||
55 | printk(" S[%d][%3d] | %08X | %08X | %08X | %08X |\n", | ||
56 | tlbsel, i, tlbe->mas1, tlbe->mas2, | ||
57 | tlbe->mas3, tlbe->mas7); | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | |||
62 | static inline unsigned int tlb0_get_next_victim( | ||
63 | struct kvmppc_vcpu_e500 *vcpu_e500) | ||
64 | { | ||
65 | unsigned int victim; | ||
66 | |||
67 | victim = vcpu_e500->guest_tlb_nv[0]++; | ||
68 | if (unlikely(vcpu_e500->guest_tlb_nv[0] >= KVM_E500_TLB0_WAY_NUM)) | ||
69 | vcpu_e500->guest_tlb_nv[0] = 0; | ||
70 | |||
71 | return victim; | ||
72 | } | ||
73 | |||
74 | static inline unsigned int tlb1_max_shadow_size(void) | ||
75 | { | ||
76 | return tlb1_entry_num - tlbcam_index; | ||
77 | } | ||
78 | |||
79 | static inline int tlbe_is_writable(struct tlbe *tlbe) | ||
80 | { | ||
81 | return tlbe->mas3 & (MAS3_SW|MAS3_UW); | ||
82 | } | ||
83 | |||
84 | static inline u32 e500_shadow_mas3_attrib(u32 mas3, int usermode) | ||
85 | { | ||
86 | /* Mask off reserved bits. */ | ||
87 | mas3 &= MAS3_ATTRIB_MASK; | ||
88 | |||
89 | if (!usermode) { | ||
90 | /* Guest is in supervisor mode, | ||
91 | * so we need to translate guest | ||
92 | * supervisor permissions into user permissions. */ | ||
93 | mas3 &= ~E500_TLB_USER_PERM_MASK; | ||
94 | mas3 |= (mas3 & E500_TLB_SUPER_PERM_MASK) << 1; | ||
95 | } | ||
96 | |||
97 | return mas3 | E500_TLB_SUPER_PERM_MASK; | ||
98 | } | ||
99 | |||
100 | static inline u32 e500_shadow_mas2_attrib(u32 mas2, int usermode) | ||
101 | { | ||
102 | #ifdef CONFIG_SMP | ||
103 | return (mas2 & MAS2_ATTRIB_MASK) | MAS2_M; | ||
104 | #else | ||
105 | return mas2 & MAS2_ATTRIB_MASK; | ||
106 | #endif | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * writing shadow tlb entry to host TLB | ||
111 | */ | ||
112 | static inline void __write_host_tlbe(struct tlbe *stlbe) | ||
113 | { | ||
114 | mtspr(SPRN_MAS1, stlbe->mas1); | ||
115 | mtspr(SPRN_MAS2, stlbe->mas2); | ||
116 | mtspr(SPRN_MAS3, stlbe->mas3); | ||
117 | mtspr(SPRN_MAS7, stlbe->mas7); | ||
118 | __asm__ __volatile__ ("tlbwe\n" : : ); | ||
119 | } | ||
120 | |||
121 | static inline void write_host_tlbe(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
122 | int tlbsel, int esel) | ||
123 | { | ||
124 | struct tlbe *stlbe = &vcpu_e500->shadow_tlb[tlbsel][esel]; | ||
125 | |||
126 | local_irq_disable(); | ||
127 | if (tlbsel == 0) { | ||
128 | __write_host_tlbe(stlbe); | ||
129 | } else { | ||
130 | unsigned register mas0; | ||
131 | |||
132 | mas0 = mfspr(SPRN_MAS0); | ||
133 | |||
134 | mtspr(SPRN_MAS0, MAS0_TLBSEL(1) | MAS0_ESEL(to_htlb1_esel(esel))); | ||
135 | __write_host_tlbe(stlbe); | ||
136 | |||
137 | mtspr(SPRN_MAS0, mas0); | ||
138 | } | ||
139 | local_irq_enable(); | ||
140 | } | ||
141 | |||
142 | void kvmppc_e500_tlb_load(struct kvm_vcpu *vcpu, int cpu) | ||
143 | { | ||
144 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
145 | int i; | ||
146 | unsigned register mas0; | ||
147 | |||
148 | /* Load all valid TLB1 entries to reduce guest tlb miss fault */ | ||
149 | local_irq_disable(); | ||
150 | mas0 = mfspr(SPRN_MAS0); | ||
151 | for (i = 0; i < tlb1_max_shadow_size(); i++) { | ||
152 | struct tlbe *stlbe = &vcpu_e500->shadow_tlb[1][i]; | ||
153 | |||
154 | if (get_tlb_v(stlbe)) { | ||
155 | mtspr(SPRN_MAS0, MAS0_TLBSEL(1) | ||
156 | | MAS0_ESEL(to_htlb1_esel(i))); | ||
157 | __write_host_tlbe(stlbe); | ||
158 | } | ||
159 | } | ||
160 | mtspr(SPRN_MAS0, mas0); | ||
161 | local_irq_enable(); | ||
162 | } | ||
163 | |||
164 | void kvmppc_e500_tlb_put(struct kvm_vcpu *vcpu) | ||
165 | { | ||
166 | _tlbil_all(); | ||
167 | } | ||
168 | |||
169 | /* Search the guest TLB for a matching entry. */ | ||
170 | static int kvmppc_e500_tlb_index(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
171 | gva_t eaddr, int tlbsel, unsigned int pid, int as) | ||
172 | { | ||
173 | int i; | ||
174 | |||
175 | /* XXX Replace loop with fancy data structures. */ | ||
176 | for (i = 0; i < vcpu_e500->guest_tlb_size[tlbsel]; i++) { | ||
177 | struct tlbe *tlbe = &vcpu_e500->guest_tlb[tlbsel][i]; | ||
178 | unsigned int tid; | ||
179 | |||
180 | if (eaddr < get_tlb_eaddr(tlbe)) | ||
181 | continue; | ||
182 | |||
183 | if (eaddr > get_tlb_end(tlbe)) | ||
184 | continue; | ||
185 | |||
186 | tid = get_tlb_tid(tlbe); | ||
187 | if (tid && (tid != pid)) | ||
188 | continue; | ||
189 | |||
190 | if (!get_tlb_v(tlbe)) | ||
191 | continue; | ||
192 | |||
193 | if (get_tlb_ts(tlbe) != as && as != -1) | ||
194 | continue; | ||
195 | |||
196 | return i; | ||
197 | } | ||
198 | |||
199 | return -1; | ||
200 | } | ||
201 | |||
202 | static void kvmppc_e500_shadow_release(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
203 | int tlbsel, int esel) | ||
204 | { | ||
205 | struct tlbe *stlbe = &vcpu_e500->shadow_tlb[tlbsel][esel]; | ||
206 | struct page *page = vcpu_e500->shadow_pages[tlbsel][esel]; | ||
207 | |||
208 | if (page) { | ||
209 | vcpu_e500->shadow_pages[tlbsel][esel] = NULL; | ||
210 | |||
211 | if (get_tlb_v(stlbe)) { | ||
212 | if (tlbe_is_writable(stlbe)) | ||
213 | kvm_release_page_dirty(page); | ||
214 | else | ||
215 | kvm_release_page_clean(page); | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | |||
220 | static void kvmppc_e500_stlbe_invalidate(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
221 | int tlbsel, int esel) | ||
222 | { | ||
223 | struct tlbe *stlbe = &vcpu_e500->shadow_tlb[tlbsel][esel]; | ||
224 | |||
225 | kvmppc_e500_shadow_release(vcpu_e500, tlbsel, esel); | ||
226 | stlbe->mas1 = 0; | ||
227 | KVMTRACE_5D(STLB_INVAL, &vcpu_e500->vcpu, index_of(tlbsel, esel), | ||
228 | stlbe->mas1, stlbe->mas2, stlbe->mas3, stlbe->mas7, | ||
229 | handler); | ||
230 | } | ||
231 | |||
232 | static void kvmppc_e500_tlb1_invalidate(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
233 | gva_t eaddr, gva_t eend, u32 tid) | ||
234 | { | ||
235 | unsigned int pid = tid & 0xff; | ||
236 | unsigned int i; | ||
237 | |||
238 | /* XXX Replace loop with fancy data structures. */ | ||
239 | for (i = 0; i < vcpu_e500->guest_tlb_size[1]; i++) { | ||
240 | struct tlbe *stlbe = &vcpu_e500->shadow_tlb[1][i]; | ||
241 | unsigned int tid; | ||
242 | |||
243 | if (!get_tlb_v(stlbe)) | ||
244 | continue; | ||
245 | |||
246 | if (eend < get_tlb_eaddr(stlbe)) | ||
247 | continue; | ||
248 | |||
249 | if (eaddr > get_tlb_end(stlbe)) | ||
250 | continue; | ||
251 | |||
252 | tid = get_tlb_tid(stlbe); | ||
253 | if (tid && (tid != pid)) | ||
254 | continue; | ||
255 | |||
256 | kvmppc_e500_stlbe_invalidate(vcpu_e500, 1, i); | ||
257 | write_host_tlbe(vcpu_e500, 1, i); | ||
258 | } | ||
259 | } | ||
260 | |||
261 | static inline void kvmppc_e500_deliver_tlb_miss(struct kvm_vcpu *vcpu, | ||
262 | unsigned int eaddr, int as) | ||
263 | { | ||
264 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
265 | unsigned int victim, pidsel, tsized; | ||
266 | int tlbsel; | ||
267 | |||
268 | /* since we only have two TLBs, only lower bit is used. */ | ||
269 | tlbsel = (vcpu_e500->mas4 >> 28) & 0x1; | ||
270 | victim = (tlbsel == 0) ? tlb0_get_next_victim(vcpu_e500) : 0; | ||
271 | pidsel = (vcpu_e500->mas4 >> 16) & 0xf; | ||
272 | tsized = (vcpu_e500->mas4 >> 8) & 0xf; | ||
273 | |||
274 | vcpu_e500->mas0 = MAS0_TLBSEL(tlbsel) | MAS0_ESEL(victim) | ||
275 | | MAS0_NV(vcpu_e500->guest_tlb_nv[tlbsel]); | ||
276 | vcpu_e500->mas1 = MAS1_VALID | (as ? MAS1_TS : 0) | ||
277 | | MAS1_TID(vcpu_e500->pid[pidsel]) | ||
278 | | MAS1_TSIZE(tsized); | ||
279 | vcpu_e500->mas2 = (eaddr & MAS2_EPN) | ||
280 | | (vcpu_e500->mas4 & MAS2_ATTRIB_MASK); | ||
281 | vcpu_e500->mas3 &= MAS3_U0 | MAS3_U1 | MAS3_U2 | MAS3_U3; | ||
282 | vcpu_e500->mas6 = (vcpu_e500->mas6 & MAS6_SPID1) | ||
283 | | (get_cur_pid(vcpu) << 16) | ||
284 | | (as ? MAS6_SAS : 0); | ||
285 | vcpu_e500->mas7 = 0; | ||
286 | } | ||
287 | |||
288 | static inline void kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
289 | u64 gvaddr, gfn_t gfn, struct tlbe *gtlbe, int tlbsel, int esel) | ||
290 | { | ||
291 | struct page *new_page; | ||
292 | struct tlbe *stlbe; | ||
293 | hpa_t hpaddr; | ||
294 | |||
295 | stlbe = &vcpu_e500->shadow_tlb[tlbsel][esel]; | ||
296 | |||
297 | /* Get reference to new page. */ | ||
298 | new_page = gfn_to_page(vcpu_e500->vcpu.kvm, gfn); | ||
299 | if (is_error_page(new_page)) { | ||
300 | printk(KERN_ERR "Couldn't get guest page for gfn %lx!\n", gfn); | ||
301 | kvm_release_page_clean(new_page); | ||
302 | return; | ||
303 | } | ||
304 | hpaddr = page_to_phys(new_page); | ||
305 | |||
306 | /* Drop reference to old page. */ | ||
307 | kvmppc_e500_shadow_release(vcpu_e500, tlbsel, esel); | ||
308 | |||
309 | vcpu_e500->shadow_pages[tlbsel][esel] = new_page; | ||
310 | |||
311 | /* Force TS=1 IPROT=0 TSIZE=4KB for all guest mappings. */ | ||
312 | stlbe->mas1 = MAS1_TSIZE(BOOKE_PAGESZ_4K) | ||
313 | | MAS1_TID(get_tlb_tid(gtlbe)) | MAS1_TS | MAS1_VALID; | ||
314 | stlbe->mas2 = (gvaddr & MAS2_EPN) | ||
315 | | e500_shadow_mas2_attrib(gtlbe->mas2, | ||
316 | vcpu_e500->vcpu.arch.msr & MSR_PR); | ||
317 | stlbe->mas3 = (hpaddr & MAS3_RPN) | ||
318 | | e500_shadow_mas3_attrib(gtlbe->mas3, | ||
319 | vcpu_e500->vcpu.arch.msr & MSR_PR); | ||
320 | stlbe->mas7 = (hpaddr >> 32) & MAS7_RPN; | ||
321 | |||
322 | KVMTRACE_5D(STLB_WRITE, &vcpu_e500->vcpu, index_of(tlbsel, esel), | ||
323 | stlbe->mas1, stlbe->mas2, stlbe->mas3, stlbe->mas7, | ||
324 | handler); | ||
325 | } | ||
326 | |||
327 | /* XXX only map the one-one case, for now use TLB0 */ | ||
328 | static int kvmppc_e500_stlbe_map(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
329 | int tlbsel, int esel) | ||
330 | { | ||
331 | struct tlbe *gtlbe; | ||
332 | |||
333 | gtlbe = &vcpu_e500->guest_tlb[tlbsel][esel]; | ||
334 | |||
335 | kvmppc_e500_shadow_map(vcpu_e500, get_tlb_eaddr(gtlbe), | ||
336 | get_tlb_raddr(gtlbe) >> PAGE_SHIFT, | ||
337 | gtlbe, tlbsel, esel); | ||
338 | |||
339 | return esel; | ||
340 | } | ||
341 | |||
342 | /* Caller must ensure that the specified guest TLB entry is safe to insert into | ||
343 | * the shadow TLB. */ | ||
344 | /* XXX for both one-one and one-to-many , for now use TLB1 */ | ||
345 | static int kvmppc_e500_tlb1_map(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
346 | u64 gvaddr, gfn_t gfn, struct tlbe *gtlbe) | ||
347 | { | ||
348 | unsigned int victim; | ||
349 | |||
350 | victim = vcpu_e500->guest_tlb_nv[1]++; | ||
351 | |||
352 | if (unlikely(vcpu_e500->guest_tlb_nv[1] >= tlb1_max_shadow_size())) | ||
353 | vcpu_e500->guest_tlb_nv[1] = 0; | ||
354 | |||
355 | kvmppc_e500_shadow_map(vcpu_e500, gvaddr, gfn, gtlbe, 1, victim); | ||
356 | |||
357 | return victim; | ||
358 | } | ||
359 | |||
360 | /* Invalidate all guest kernel mappings when enter usermode, | ||
361 | * so that when they fault back in they will get the | ||
362 | * proper permission bits. */ | ||
363 | void kvmppc_mmu_priv_switch(struct kvm_vcpu *vcpu, int usermode) | ||
364 | { | ||
365 | if (usermode) { | ||
366 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
367 | int i; | ||
368 | |||
369 | /* XXX Replace loop with fancy data structures. */ | ||
370 | for (i = 0; i < tlb1_max_shadow_size(); i++) | ||
371 | kvmppc_e500_stlbe_invalidate(vcpu_e500, 1, i); | ||
372 | |||
373 | _tlbil_all(); | ||
374 | } | ||
375 | } | ||
376 | |||
377 | static int kvmppc_e500_gtlbe_invalidate(struct kvmppc_vcpu_e500 *vcpu_e500, | ||
378 | int tlbsel, int esel) | ||
379 | { | ||
380 | struct tlbe *gtlbe = &vcpu_e500->guest_tlb[tlbsel][esel]; | ||
381 | |||
382 | if (unlikely(get_tlb_iprot(gtlbe))) | ||
383 | return -1; | ||
384 | |||
385 | if (tlbsel == 1) { | ||
386 | kvmppc_e500_tlb1_invalidate(vcpu_e500, get_tlb_eaddr(gtlbe), | ||
387 | get_tlb_end(gtlbe), | ||
388 | get_tlb_tid(gtlbe)); | ||
389 | } else { | ||
390 | kvmppc_e500_stlbe_invalidate(vcpu_e500, tlbsel, esel); | ||
391 | } | ||
392 | |||
393 | gtlbe->mas1 = 0; | ||
394 | |||
395 | return 0; | ||
396 | } | ||
397 | |||
398 | int kvmppc_e500_emul_mt_mmucsr0(struct kvmppc_vcpu_e500 *vcpu_e500, ulong value) | ||
399 | { | ||
400 | int esel; | ||
401 | |||
402 | if (value & MMUCSR0_TLB0FI) | ||
403 | for (esel = 0; esel < vcpu_e500->guest_tlb_size[0]; esel++) | ||
404 | kvmppc_e500_gtlbe_invalidate(vcpu_e500, 0, esel); | ||
405 | if (value & MMUCSR0_TLB1FI) | ||
406 | for (esel = 0; esel < vcpu_e500->guest_tlb_size[1]; esel++) | ||
407 | kvmppc_e500_gtlbe_invalidate(vcpu_e500, 1, esel); | ||
408 | |||
409 | _tlbil_all(); | ||
410 | |||
411 | return EMULATE_DONE; | ||
412 | } | ||
413 | |||
414 | int kvmppc_e500_emul_tlbivax(struct kvm_vcpu *vcpu, int ra, int rb) | ||
415 | { | ||
416 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
417 | unsigned int ia; | ||
418 | int esel, tlbsel; | ||
419 | gva_t ea; | ||
420 | |||
421 | ea = ((ra) ? vcpu->arch.gpr[ra] : 0) + vcpu->arch.gpr[rb]; | ||
422 | |||
423 | ia = (ea >> 2) & 0x1; | ||
424 | |||
425 | /* since we only have two TLBs, only lower bit is used. */ | ||
426 | tlbsel = (ea >> 3) & 0x1; | ||
427 | |||
428 | if (ia) { | ||
429 | /* invalidate all entries */ | ||
430 | for (esel = 0; esel < vcpu_e500->guest_tlb_size[tlbsel]; esel++) | ||
431 | kvmppc_e500_gtlbe_invalidate(vcpu_e500, tlbsel, esel); | ||
432 | } else { | ||
433 | ea &= 0xfffff000; | ||
434 | esel = kvmppc_e500_tlb_index(vcpu_e500, ea, tlbsel, | ||
435 | get_cur_pid(vcpu), -1); | ||
436 | if (esel >= 0) | ||
437 | kvmppc_e500_gtlbe_invalidate(vcpu_e500, tlbsel, esel); | ||
438 | } | ||
439 | |||
440 | _tlbil_all(); | ||
441 | |||
442 | return EMULATE_DONE; | ||
443 | } | ||
444 | |||
445 | int kvmppc_e500_emul_tlbre(struct kvm_vcpu *vcpu) | ||
446 | { | ||
447 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
448 | int tlbsel, esel; | ||
449 | struct tlbe *gtlbe; | ||
450 | |||
451 | tlbsel = get_tlb_tlbsel(vcpu_e500); | ||
452 | esel = get_tlb_esel(vcpu_e500, tlbsel); | ||
453 | |||
454 | gtlbe = &vcpu_e500->guest_tlb[tlbsel][esel]; | ||
455 | vcpu_e500->mas0 &= ~MAS0_NV(~0); | ||
456 | vcpu_e500->mas0 |= MAS0_NV(vcpu_e500->guest_tlb_nv[tlbsel]); | ||
457 | vcpu_e500->mas1 = gtlbe->mas1; | ||
458 | vcpu_e500->mas2 = gtlbe->mas2; | ||
459 | vcpu_e500->mas3 = gtlbe->mas3; | ||
460 | vcpu_e500->mas7 = gtlbe->mas7; | ||
461 | |||
462 | return EMULATE_DONE; | ||
463 | } | ||
464 | |||
465 | int kvmppc_e500_emul_tlbsx(struct kvm_vcpu *vcpu, int rb) | ||
466 | { | ||
467 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
468 | int as = !!get_cur_sas(vcpu_e500); | ||
469 | unsigned int pid = get_cur_spid(vcpu_e500); | ||
470 | int esel, tlbsel; | ||
471 | struct tlbe *gtlbe = NULL; | ||
472 | gva_t ea; | ||
473 | |||
474 | ea = vcpu->arch.gpr[rb]; | ||
475 | |||
476 | for (tlbsel = 0; tlbsel < 2; tlbsel++) { | ||
477 | esel = kvmppc_e500_tlb_index(vcpu_e500, ea, tlbsel, pid, as); | ||
478 | if (esel >= 0) { | ||
479 | gtlbe = &vcpu_e500->guest_tlb[tlbsel][esel]; | ||
480 | break; | ||
481 | } | ||
482 | } | ||
483 | |||
484 | if (gtlbe) { | ||
485 | vcpu_e500->mas0 = MAS0_TLBSEL(tlbsel) | MAS0_ESEL(esel) | ||
486 | | MAS0_NV(vcpu_e500->guest_tlb_nv[tlbsel]); | ||
487 | vcpu_e500->mas1 = gtlbe->mas1; | ||
488 | vcpu_e500->mas2 = gtlbe->mas2; | ||
489 | vcpu_e500->mas3 = gtlbe->mas3; | ||
490 | vcpu_e500->mas7 = gtlbe->mas7; | ||
491 | } else { | ||
492 | int victim; | ||
493 | |||
494 | /* since we only have two TLBs, only lower bit is used. */ | ||
495 | tlbsel = vcpu_e500->mas4 >> 28 & 0x1; | ||
496 | victim = (tlbsel == 0) ? tlb0_get_next_victim(vcpu_e500) : 0; | ||
497 | |||
498 | vcpu_e500->mas0 = MAS0_TLBSEL(tlbsel) | MAS0_ESEL(victim) | ||
499 | | MAS0_NV(vcpu_e500->guest_tlb_nv[tlbsel]); | ||
500 | vcpu_e500->mas1 = (vcpu_e500->mas6 & MAS6_SPID0) | ||
501 | | (vcpu_e500->mas6 & (MAS6_SAS ? MAS1_TS : 0)) | ||
502 | | (vcpu_e500->mas4 & MAS4_TSIZED(~0)); | ||
503 | vcpu_e500->mas2 &= MAS2_EPN; | ||
504 | vcpu_e500->mas2 |= vcpu_e500->mas4 & MAS2_ATTRIB_MASK; | ||
505 | vcpu_e500->mas3 &= MAS3_U0 | MAS3_U1 | MAS3_U2 | MAS3_U3; | ||
506 | vcpu_e500->mas7 = 0; | ||
507 | } | ||
508 | |||
509 | return EMULATE_DONE; | ||
510 | } | ||
511 | |||
512 | int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu) | ||
513 | { | ||
514 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
515 | u64 eaddr; | ||
516 | u64 raddr; | ||
517 | u32 tid; | ||
518 | struct tlbe *gtlbe; | ||
519 | int tlbsel, esel, stlbsel, sesel; | ||
520 | |||
521 | tlbsel = get_tlb_tlbsel(vcpu_e500); | ||
522 | esel = get_tlb_esel(vcpu_e500, tlbsel); | ||
523 | |||
524 | gtlbe = &vcpu_e500->guest_tlb[tlbsel][esel]; | ||
525 | |||
526 | if (get_tlb_v(gtlbe) && tlbsel == 1) { | ||
527 | eaddr = get_tlb_eaddr(gtlbe); | ||
528 | tid = get_tlb_tid(gtlbe); | ||
529 | kvmppc_e500_tlb1_invalidate(vcpu_e500, eaddr, | ||
530 | get_tlb_end(gtlbe), tid); | ||
531 | } | ||
532 | |||
533 | gtlbe->mas1 = vcpu_e500->mas1; | ||
534 | gtlbe->mas2 = vcpu_e500->mas2; | ||
535 | gtlbe->mas3 = vcpu_e500->mas3; | ||
536 | gtlbe->mas7 = vcpu_e500->mas7; | ||
537 | |||
538 | KVMTRACE_5D(GTLB_WRITE, vcpu, vcpu_e500->mas0, | ||
539 | gtlbe->mas1, gtlbe->mas2, gtlbe->mas3, gtlbe->mas7, | ||
540 | handler); | ||
541 | |||
542 | /* Invalidate shadow mappings for the about-to-be-clobbered TLBE. */ | ||
543 | if (tlbe_is_host_safe(vcpu, gtlbe)) { | ||
544 | switch (tlbsel) { | ||
545 | case 0: | ||
546 | /* TLB0 */ | ||
547 | gtlbe->mas1 &= ~MAS1_TSIZE(~0); | ||
548 | gtlbe->mas1 |= MAS1_TSIZE(BOOKE_PAGESZ_4K); | ||
549 | |||
550 | stlbsel = 0; | ||
551 | sesel = kvmppc_e500_stlbe_map(vcpu_e500, 0, esel); | ||
552 | |||
553 | break; | ||
554 | |||
555 | case 1: | ||
556 | /* TLB1 */ | ||
557 | eaddr = get_tlb_eaddr(gtlbe); | ||
558 | raddr = get_tlb_raddr(gtlbe); | ||
559 | |||
560 | /* Create a 4KB mapping on the host. | ||
561 | * If the guest wanted a large page, | ||
562 | * only the first 4KB is mapped here and the rest | ||
563 | * are mapped on the fly. */ | ||
564 | stlbsel = 1; | ||
565 | sesel = kvmppc_e500_tlb1_map(vcpu_e500, eaddr, | ||
566 | raddr >> PAGE_SHIFT, gtlbe); | ||
567 | break; | ||
568 | |||
569 | default: | ||
570 | BUG(); | ||
571 | } | ||
572 | write_host_tlbe(vcpu_e500, stlbsel, sesel); | ||
573 | } | ||
574 | |||
575 | return EMULATE_DONE; | ||
576 | } | ||
577 | |||
578 | int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr) | ||
579 | { | ||
580 | unsigned int as = !!(vcpu->arch.msr & MSR_IS); | ||
581 | |||
582 | return kvmppc_e500_tlb_search(vcpu, eaddr, get_cur_pid(vcpu), as); | ||
583 | } | ||
584 | |||
585 | int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t eaddr) | ||
586 | { | ||
587 | unsigned int as = !!(vcpu->arch.msr & MSR_DS); | ||
588 | |||
589 | return kvmppc_e500_tlb_search(vcpu, eaddr, get_cur_pid(vcpu), as); | ||
590 | } | ||
591 | |||
592 | void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu) | ||
593 | { | ||
594 | unsigned int as = !!(vcpu->arch.msr & MSR_IS); | ||
595 | |||
596 | kvmppc_e500_deliver_tlb_miss(vcpu, vcpu->arch.pc, as); | ||
597 | } | ||
598 | |||
599 | void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu) | ||
600 | { | ||
601 | unsigned int as = !!(vcpu->arch.msr & MSR_DS); | ||
602 | |||
603 | kvmppc_e500_deliver_tlb_miss(vcpu, vcpu->arch.fault_dear, as); | ||
604 | } | ||
605 | |||
606 | gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int index, | ||
607 | gva_t eaddr) | ||
608 | { | ||
609 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
610 | struct tlbe *gtlbe = | ||
611 | &vcpu_e500->guest_tlb[tlbsel_of(index)][esel_of(index)]; | ||
612 | u64 pgmask = get_tlb_bytes(gtlbe) - 1; | ||
613 | |||
614 | return get_tlb_raddr(gtlbe) | (eaddr & pgmask); | ||
615 | } | ||
616 | |||
617 | void kvmppc_mmu_destroy(struct kvm_vcpu *vcpu) | ||
618 | { | ||
619 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
620 | int tlbsel, i; | ||
621 | |||
622 | for (tlbsel = 0; tlbsel < 2; tlbsel++) | ||
623 | for (i = 0; i < vcpu_e500->guest_tlb_size[tlbsel]; i++) | ||
624 | kvmppc_e500_shadow_release(vcpu_e500, tlbsel, i); | ||
625 | |||
626 | /* discard all guest mapping */ | ||
627 | _tlbil_all(); | ||
628 | } | ||
629 | |||
630 | void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 eaddr, gpa_t gpaddr, | ||
631 | unsigned int index) | ||
632 | { | ||
633 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
634 | int tlbsel = tlbsel_of(index); | ||
635 | int esel = esel_of(index); | ||
636 | int stlbsel, sesel; | ||
637 | |||
638 | switch (tlbsel) { | ||
639 | case 0: | ||
640 | stlbsel = 0; | ||
641 | sesel = esel; | ||
642 | break; | ||
643 | |||
644 | case 1: { | ||
645 | gfn_t gfn = gpaddr >> PAGE_SHIFT; | ||
646 | struct tlbe *gtlbe | ||
647 | = &vcpu_e500->guest_tlb[tlbsel][esel]; | ||
648 | |||
649 | stlbsel = 1; | ||
650 | sesel = kvmppc_e500_tlb1_map(vcpu_e500, eaddr, gfn, gtlbe); | ||
651 | break; | ||
652 | } | ||
653 | |||
654 | default: | ||
655 | BUG(); | ||
656 | break; | ||
657 | } | ||
658 | write_host_tlbe(vcpu_e500, stlbsel, sesel); | ||
659 | } | ||
660 | |||
661 | int kvmppc_e500_tlb_search(struct kvm_vcpu *vcpu, | ||
662 | gva_t eaddr, unsigned int pid, int as) | ||
663 | { | ||
664 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
665 | int esel, tlbsel; | ||
666 | |||
667 | for (tlbsel = 0; tlbsel < 2; tlbsel++) { | ||
668 | esel = kvmppc_e500_tlb_index(vcpu_e500, eaddr, tlbsel, pid, as); | ||
669 | if (esel >= 0) | ||
670 | return index_of(tlbsel, esel); | ||
671 | } | ||
672 | |||
673 | return -1; | ||
674 | } | ||
675 | |||
676 | void kvmppc_e500_tlb_setup(struct kvmppc_vcpu_e500 *vcpu_e500) | ||
677 | { | ||
678 | struct tlbe *tlbe; | ||
679 | |||
680 | /* Insert large initial mapping for guest. */ | ||
681 | tlbe = &vcpu_e500->guest_tlb[1][0]; | ||
682 | tlbe->mas1 = MAS1_VALID | MAS1_TSIZE(BOOKE_PAGESZ_256M); | ||
683 | tlbe->mas2 = 0; | ||
684 | tlbe->mas3 = E500_TLB_SUPER_PERM_MASK; | ||
685 | tlbe->mas7 = 0; | ||
686 | |||
687 | /* 4K map for serial output. Used by kernel wrapper. */ | ||
688 | tlbe = &vcpu_e500->guest_tlb[1][1]; | ||
689 | tlbe->mas1 = MAS1_VALID | MAS1_TSIZE(BOOKE_PAGESZ_4K); | ||
690 | tlbe->mas2 = (0xe0004500 & 0xFFFFF000) | MAS2_I | MAS2_G; | ||
691 | tlbe->mas3 = (0xe0004500 & 0xFFFFF000) | E500_TLB_SUPER_PERM_MASK; | ||
692 | tlbe->mas7 = 0; | ||
693 | } | ||
694 | |||
695 | int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500) | ||
696 | { | ||
697 | tlb1_entry_num = mfspr(SPRN_TLB1CFG) & 0xFFF; | ||
698 | |||
699 | vcpu_e500->guest_tlb_size[0] = KVM_E500_TLB0_SIZE; | ||
700 | vcpu_e500->guest_tlb[0] = | ||
701 | kzalloc(sizeof(struct tlbe) * KVM_E500_TLB0_SIZE, GFP_KERNEL); | ||
702 | if (vcpu_e500->guest_tlb[0] == NULL) | ||
703 | goto err_out; | ||
704 | |||
705 | vcpu_e500->shadow_tlb_size[0] = KVM_E500_TLB0_SIZE; | ||
706 | vcpu_e500->shadow_tlb[0] = | ||
707 | kzalloc(sizeof(struct tlbe) * KVM_E500_TLB0_SIZE, GFP_KERNEL); | ||
708 | if (vcpu_e500->shadow_tlb[0] == NULL) | ||
709 | goto err_out_guest0; | ||
710 | |||
711 | vcpu_e500->guest_tlb_size[1] = KVM_E500_TLB1_SIZE; | ||
712 | vcpu_e500->guest_tlb[1] = | ||
713 | kzalloc(sizeof(struct tlbe) * KVM_E500_TLB1_SIZE, GFP_KERNEL); | ||
714 | if (vcpu_e500->guest_tlb[1] == NULL) | ||
715 | goto err_out_shadow0; | ||
716 | |||
717 | vcpu_e500->shadow_tlb_size[1] = tlb1_entry_num; | ||
718 | vcpu_e500->shadow_tlb[1] = | ||
719 | kzalloc(sizeof(struct tlbe) * tlb1_entry_num, GFP_KERNEL); | ||
720 | if (vcpu_e500->shadow_tlb[1] == NULL) | ||
721 | goto err_out_guest1; | ||
722 | |||
723 | vcpu_e500->shadow_pages[0] = (struct page **) | ||
724 | kzalloc(sizeof(struct page *) * KVM_E500_TLB0_SIZE, GFP_KERNEL); | ||
725 | if (vcpu_e500->shadow_pages[0] == NULL) | ||
726 | goto err_out_shadow1; | ||
727 | |||
728 | vcpu_e500->shadow_pages[1] = (struct page **) | ||
729 | kzalloc(sizeof(struct page *) * tlb1_entry_num, GFP_KERNEL); | ||
730 | if (vcpu_e500->shadow_pages[1] == NULL) | ||
731 | goto err_out_page0; | ||
732 | |||
733 | return 0; | ||
734 | |||
735 | err_out_page0: | ||
736 | kfree(vcpu_e500->shadow_pages[0]); | ||
737 | err_out_shadow1: | ||
738 | kfree(vcpu_e500->shadow_tlb[1]); | ||
739 | err_out_guest1: | ||
740 | kfree(vcpu_e500->guest_tlb[1]); | ||
741 | err_out_shadow0: | ||
742 | kfree(vcpu_e500->shadow_tlb[0]); | ||
743 | err_out_guest0: | ||
744 | kfree(vcpu_e500->guest_tlb[0]); | ||
745 | err_out: | ||
746 | return -1; | ||
747 | } | ||
748 | |||
749 | void kvmppc_e500_tlb_uninit(struct kvmppc_vcpu_e500 *vcpu_e500) | ||
750 | { | ||
751 | kfree(vcpu_e500->shadow_pages[1]); | ||
752 | kfree(vcpu_e500->shadow_pages[0]); | ||
753 | kfree(vcpu_e500->shadow_tlb[1]); | ||
754 | kfree(vcpu_e500->guest_tlb[1]); | ||
755 | kfree(vcpu_e500->shadow_tlb[0]); | ||
756 | kfree(vcpu_e500->guest_tlb[0]); | ||
757 | } | ||
diff --git a/arch/powerpc/kvm/e500_tlb.h b/arch/powerpc/kvm/e500_tlb.h new file mode 100644 index 000000000000..45b064b76906 --- /dev/null +++ b/arch/powerpc/kvm/e500_tlb.h | |||
@@ -0,0 +1,185 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved. | ||
3 | * | ||
4 | * Author: Yu Liu, yu.liu@freescale.com | ||
5 | * | ||
6 | * Description: | ||
7 | * This file is based on arch/powerpc/kvm/44x_tlb.h, | ||
8 | * by Hollis Blanchard <hollisb@us.ibm.com>. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License, version 2, as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __KVM_E500_TLB_H__ | ||
16 | #define __KVM_E500_TLB_H__ | ||
17 | |||
18 | #include <linux/kvm_host.h> | ||
19 | #include <asm/mmu-fsl-booke.h> | ||
20 | #include <asm/tlb.h> | ||
21 | #include <asm/kvm_e500.h> | ||
22 | |||
23 | #define KVM_E500_TLB0_WAY_SIZE_BIT 7 /* Fixed */ | ||
24 | #define KVM_E500_TLB0_WAY_SIZE (1UL << KVM_E500_TLB0_WAY_SIZE_BIT) | ||
25 | #define KVM_E500_TLB0_WAY_SIZE_MASK (KVM_E500_TLB0_WAY_SIZE - 1) | ||
26 | |||
27 | #define KVM_E500_TLB0_WAY_NUM_BIT 1 /* No greater than 7 */ | ||
28 | #define KVM_E500_TLB0_WAY_NUM (1UL << KVM_E500_TLB0_WAY_NUM_BIT) | ||
29 | #define KVM_E500_TLB0_WAY_NUM_MASK (KVM_E500_TLB0_WAY_NUM - 1) | ||
30 | |||
31 | #define KVM_E500_TLB0_SIZE (KVM_E500_TLB0_WAY_SIZE * KVM_E500_TLB0_WAY_NUM) | ||
32 | #define KVM_E500_TLB1_SIZE 16 | ||
33 | |||
34 | #define index_of(tlbsel, esel) (((tlbsel) << 16) | ((esel) & 0xFFFF)) | ||
35 | #define tlbsel_of(index) ((index) >> 16) | ||
36 | #define esel_of(index) ((index) & 0xFFFF) | ||
37 | |||
38 | #define E500_TLB_USER_PERM_MASK (MAS3_UX|MAS3_UR|MAS3_UW) | ||
39 | #define E500_TLB_SUPER_PERM_MASK (MAS3_SX|MAS3_SR|MAS3_SW) | ||
40 | #define MAS2_ATTRIB_MASK \ | ||
41 | (MAS2_X0 | MAS2_X1) | ||
42 | #define MAS3_ATTRIB_MASK \ | ||
43 | (MAS3_U0 | MAS3_U1 | MAS3_U2 | MAS3_U3 \ | ||
44 | | E500_TLB_USER_PERM_MASK | E500_TLB_SUPER_PERM_MASK) | ||
45 | |||
46 | extern void kvmppc_dump_tlbs(struct kvm_vcpu *); | ||
47 | extern int kvmppc_e500_emul_mt_mmucsr0(struct kvmppc_vcpu_e500 *, ulong); | ||
48 | extern int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *); | ||
49 | extern int kvmppc_e500_emul_tlbre(struct kvm_vcpu *); | ||
50 | extern int kvmppc_e500_emul_tlbivax(struct kvm_vcpu *, int, int); | ||
51 | extern int kvmppc_e500_emul_tlbsx(struct kvm_vcpu *, int); | ||
52 | extern int kvmppc_e500_tlb_search(struct kvm_vcpu *, gva_t, unsigned int, int); | ||
53 | extern void kvmppc_e500_tlb_put(struct kvm_vcpu *); | ||
54 | extern void kvmppc_e500_tlb_load(struct kvm_vcpu *, int); | ||
55 | extern int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *); | ||
56 | extern void kvmppc_e500_tlb_uninit(struct kvmppc_vcpu_e500 *); | ||
57 | extern void kvmppc_e500_tlb_setup(struct kvmppc_vcpu_e500 *); | ||
58 | |||
59 | /* TLB helper functions */ | ||
60 | static inline unsigned int get_tlb_size(const struct tlbe *tlbe) | ||
61 | { | ||
62 | return (tlbe->mas1 >> 8) & 0xf; | ||
63 | } | ||
64 | |||
65 | static inline gva_t get_tlb_eaddr(const struct tlbe *tlbe) | ||
66 | { | ||
67 | return tlbe->mas2 & 0xfffff000; | ||
68 | } | ||
69 | |||
70 | static inline u64 get_tlb_bytes(const struct tlbe *tlbe) | ||
71 | { | ||
72 | unsigned int pgsize = get_tlb_size(tlbe); | ||
73 | return 1ULL << 10 << (pgsize << 1); | ||
74 | } | ||
75 | |||
76 | static inline gva_t get_tlb_end(const struct tlbe *tlbe) | ||
77 | { | ||
78 | u64 bytes = get_tlb_bytes(tlbe); | ||
79 | return get_tlb_eaddr(tlbe) + bytes - 1; | ||
80 | } | ||
81 | |||
82 | static inline u64 get_tlb_raddr(const struct tlbe *tlbe) | ||
83 | { | ||
84 | u64 rpn = tlbe->mas7; | ||
85 | return (rpn << 32) | (tlbe->mas3 & 0xfffff000); | ||
86 | } | ||
87 | |||
88 | static inline unsigned int get_tlb_tid(const struct tlbe *tlbe) | ||
89 | { | ||
90 | return (tlbe->mas1 >> 16) & 0xff; | ||
91 | } | ||
92 | |||
93 | static inline unsigned int get_tlb_ts(const struct tlbe *tlbe) | ||
94 | { | ||
95 | return (tlbe->mas1 >> 12) & 0x1; | ||
96 | } | ||
97 | |||
98 | static inline unsigned int get_tlb_v(const struct tlbe *tlbe) | ||
99 | { | ||
100 | return (tlbe->mas1 >> 31) & 0x1; | ||
101 | } | ||
102 | |||
103 | static inline unsigned int get_tlb_iprot(const struct tlbe *tlbe) | ||
104 | { | ||
105 | return (tlbe->mas1 >> 30) & 0x1; | ||
106 | } | ||
107 | |||
108 | static inline unsigned int get_cur_pid(struct kvm_vcpu *vcpu) | ||
109 | { | ||
110 | return vcpu->arch.pid & 0xff; | ||
111 | } | ||
112 | |||
113 | static inline unsigned int get_cur_spid( | ||
114 | const struct kvmppc_vcpu_e500 *vcpu_e500) | ||
115 | { | ||
116 | return (vcpu_e500->mas6 >> 16) & 0xff; | ||
117 | } | ||
118 | |||
119 | static inline unsigned int get_cur_sas( | ||
120 | const struct kvmppc_vcpu_e500 *vcpu_e500) | ||
121 | { | ||
122 | return vcpu_e500->mas6 & 0x1; | ||
123 | } | ||
124 | |||
125 | static inline unsigned int get_tlb_tlbsel( | ||
126 | const struct kvmppc_vcpu_e500 *vcpu_e500) | ||
127 | { | ||
128 | /* | ||
129 | * Manual says that tlbsel has 2 bits wide. | ||
130 | * Since we only have two TLBs, only lower bit is used. | ||
131 | */ | ||
132 | return (vcpu_e500->mas0 >> 28) & 0x1; | ||
133 | } | ||
134 | |||
135 | static inline unsigned int get_tlb_nv_bit( | ||
136 | const struct kvmppc_vcpu_e500 *vcpu_e500) | ||
137 | { | ||
138 | return vcpu_e500->mas0 & 0xfff; | ||
139 | } | ||
140 | |||
141 | static inline unsigned int get_tlb_esel_bit( | ||
142 | const struct kvmppc_vcpu_e500 *vcpu_e500) | ||
143 | { | ||
144 | return (vcpu_e500->mas0 >> 16) & 0xfff; | ||
145 | } | ||
146 | |||
147 | static inline unsigned int get_tlb_esel( | ||
148 | const struct kvmppc_vcpu_e500 *vcpu_e500, | ||
149 | int tlbsel) | ||
150 | { | ||
151 | unsigned int esel = get_tlb_esel_bit(vcpu_e500); | ||
152 | |||
153 | if (tlbsel == 0) { | ||
154 | esel &= KVM_E500_TLB0_WAY_NUM_MASK; | ||
155 | esel |= ((vcpu_e500->mas2 >> 12) & KVM_E500_TLB0_WAY_SIZE_MASK) | ||
156 | << KVM_E500_TLB0_WAY_NUM_BIT; | ||
157 | } else { | ||
158 | esel &= KVM_E500_TLB1_SIZE - 1; | ||
159 | } | ||
160 | |||
161 | return esel; | ||
162 | } | ||
163 | |||
164 | static inline int tlbe_is_host_safe(const struct kvm_vcpu *vcpu, | ||
165 | const struct tlbe *tlbe) | ||
166 | { | ||
167 | gpa_t gpa; | ||
168 | |||
169 | if (!get_tlb_v(tlbe)) | ||
170 | return 0; | ||
171 | |||
172 | /* Does it match current guest AS? */ | ||
173 | /* XXX what about IS != DS? */ | ||
174 | if (get_tlb_ts(tlbe) != !!(vcpu->arch.msr & MSR_IS)) | ||
175 | return 0; | ||
176 | |||
177 | gpa = get_tlb_raddr(tlbe); | ||
178 | if (!gfn_to_memslot(vcpu->kvm, gpa >> PAGE_SHIFT)) | ||
179 | /* Mapping is not for RAM. */ | ||
180 | return 0; | ||
181 | |||
182 | return 1; | ||
183 | } | ||
184 | |||
185 | #endif /* __KVM_E500_TLB_H__ */ | ||
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c index d1d38daa93fb..a561d6e8da1c 100644 --- a/arch/powerpc/kvm/emulate.c +++ b/arch/powerpc/kvm/emulate.c | |||
@@ -30,6 +30,39 @@ | |||
30 | #include <asm/disassemble.h> | 30 | #include <asm/disassemble.h> |
31 | #include "timing.h" | 31 | #include "timing.h" |
32 | 32 | ||
33 | #define OP_TRAP 3 | ||
34 | |||
35 | #define OP_31_XOP_LWZX 23 | ||
36 | #define OP_31_XOP_LBZX 87 | ||
37 | #define OP_31_XOP_STWX 151 | ||
38 | #define OP_31_XOP_STBX 215 | ||
39 | #define OP_31_XOP_STBUX 247 | ||
40 | #define OP_31_XOP_LHZX 279 | ||
41 | #define OP_31_XOP_LHZUX 311 | ||
42 | #define OP_31_XOP_MFSPR 339 | ||
43 | #define OP_31_XOP_STHX 407 | ||
44 | #define OP_31_XOP_STHUX 439 | ||
45 | #define OP_31_XOP_MTSPR 467 | ||
46 | #define OP_31_XOP_DCBI 470 | ||
47 | #define OP_31_XOP_LWBRX 534 | ||
48 | #define OP_31_XOP_TLBSYNC 566 | ||
49 | #define OP_31_XOP_STWBRX 662 | ||
50 | #define OP_31_XOP_LHBRX 790 | ||
51 | #define OP_31_XOP_STHBRX 918 | ||
52 | |||
53 | #define OP_LWZ 32 | ||
54 | #define OP_LWZU 33 | ||
55 | #define OP_LBZ 34 | ||
56 | #define OP_LBZU 35 | ||
57 | #define OP_STW 36 | ||
58 | #define OP_STWU 37 | ||
59 | #define OP_STB 38 | ||
60 | #define OP_STBU 39 | ||
61 | #define OP_LHZ 40 | ||
62 | #define OP_LHZU 41 | ||
63 | #define OP_STH 44 | ||
64 | #define OP_STHU 45 | ||
65 | |||
33 | void kvmppc_emulate_dec(struct kvm_vcpu *vcpu) | 66 | void kvmppc_emulate_dec(struct kvm_vcpu *vcpu) |
34 | { | 67 | { |
35 | if (vcpu->arch.tcr & TCR_DIE) { | 68 | if (vcpu->arch.tcr & TCR_DIE) { |
@@ -78,7 +111,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
78 | kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS); | 111 | kvmppc_set_exit_type(vcpu, EMULATED_INST_EXITS); |
79 | 112 | ||
80 | switch (get_op(inst)) { | 113 | switch (get_op(inst)) { |
81 | case 3: /* trap */ | 114 | case OP_TRAP: |
82 | vcpu->arch.esr |= ESR_PTR; | 115 | vcpu->arch.esr |= ESR_PTR; |
83 | kvmppc_core_queue_program(vcpu); | 116 | kvmppc_core_queue_program(vcpu); |
84 | advance = 0; | 117 | advance = 0; |
@@ -87,31 +120,31 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
87 | case 31: | 120 | case 31: |
88 | switch (get_xop(inst)) { | 121 | switch (get_xop(inst)) { |
89 | 122 | ||
90 | case 23: /* lwzx */ | 123 | case OP_31_XOP_LWZX: |
91 | rt = get_rt(inst); | 124 | rt = get_rt(inst); |
92 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1); | 125 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1); |
93 | break; | 126 | break; |
94 | 127 | ||
95 | case 87: /* lbzx */ | 128 | case OP_31_XOP_LBZX: |
96 | rt = get_rt(inst); | 129 | rt = get_rt(inst); |
97 | emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1); | 130 | emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1); |
98 | break; | 131 | break; |
99 | 132 | ||
100 | case 151: /* stwx */ | 133 | case OP_31_XOP_STWX: |
101 | rs = get_rs(inst); | 134 | rs = get_rs(inst); |
102 | emulated = kvmppc_handle_store(run, vcpu, | 135 | emulated = kvmppc_handle_store(run, vcpu, |
103 | vcpu->arch.gpr[rs], | 136 | vcpu->arch.gpr[rs], |
104 | 4, 1); | 137 | 4, 1); |
105 | break; | 138 | break; |
106 | 139 | ||
107 | case 215: /* stbx */ | 140 | case OP_31_XOP_STBX: |
108 | rs = get_rs(inst); | 141 | rs = get_rs(inst); |
109 | emulated = kvmppc_handle_store(run, vcpu, | 142 | emulated = kvmppc_handle_store(run, vcpu, |
110 | vcpu->arch.gpr[rs], | 143 | vcpu->arch.gpr[rs], |
111 | 1, 1); | 144 | 1, 1); |
112 | break; | 145 | break; |
113 | 146 | ||
114 | case 247: /* stbux */ | 147 | case OP_31_XOP_STBUX: |
115 | rs = get_rs(inst); | 148 | rs = get_rs(inst); |
116 | ra = get_ra(inst); | 149 | ra = get_ra(inst); |
117 | rb = get_rb(inst); | 150 | rb = get_rb(inst); |
@@ -126,12 +159,12 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
126 | vcpu->arch.gpr[rs] = ea; | 159 | vcpu->arch.gpr[rs] = ea; |
127 | break; | 160 | break; |
128 | 161 | ||
129 | case 279: /* lhzx */ | 162 | case OP_31_XOP_LHZX: |
130 | rt = get_rt(inst); | 163 | rt = get_rt(inst); |
131 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1); | 164 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1); |
132 | break; | 165 | break; |
133 | 166 | ||
134 | case 311: /* lhzux */ | 167 | case OP_31_XOP_LHZUX: |
135 | rt = get_rt(inst); | 168 | rt = get_rt(inst); |
136 | ra = get_ra(inst); | 169 | ra = get_ra(inst); |
137 | rb = get_rb(inst); | 170 | rb = get_rb(inst); |
@@ -144,7 +177,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
144 | vcpu->arch.gpr[ra] = ea; | 177 | vcpu->arch.gpr[ra] = ea; |
145 | break; | 178 | break; |
146 | 179 | ||
147 | case 339: /* mfspr */ | 180 | case OP_31_XOP_MFSPR: |
148 | sprn = get_sprn(inst); | 181 | sprn = get_sprn(inst); |
149 | rt = get_rt(inst); | 182 | rt = get_rt(inst); |
150 | 183 | ||
@@ -185,7 +218,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
185 | } | 218 | } |
186 | break; | 219 | break; |
187 | 220 | ||
188 | case 407: /* sthx */ | 221 | case OP_31_XOP_STHX: |
189 | rs = get_rs(inst); | 222 | rs = get_rs(inst); |
190 | ra = get_ra(inst); | 223 | ra = get_ra(inst); |
191 | rb = get_rb(inst); | 224 | rb = get_rb(inst); |
@@ -195,7 +228,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
195 | 2, 1); | 228 | 2, 1); |
196 | break; | 229 | break; |
197 | 230 | ||
198 | case 439: /* sthux */ | 231 | case OP_31_XOP_STHUX: |
199 | rs = get_rs(inst); | 232 | rs = get_rs(inst); |
200 | ra = get_ra(inst); | 233 | ra = get_ra(inst); |
201 | rb = get_rb(inst); | 234 | rb = get_rb(inst); |
@@ -210,7 +243,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
210 | vcpu->arch.gpr[ra] = ea; | 243 | vcpu->arch.gpr[ra] = ea; |
211 | break; | 244 | break; |
212 | 245 | ||
213 | case 467: /* mtspr */ | 246 | case OP_31_XOP_MTSPR: |
214 | sprn = get_sprn(inst); | 247 | sprn = get_sprn(inst); |
215 | rs = get_rs(inst); | 248 | rs = get_rs(inst); |
216 | switch (sprn) { | 249 | switch (sprn) { |
@@ -246,7 +279,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
246 | } | 279 | } |
247 | break; | 280 | break; |
248 | 281 | ||
249 | case 470: /* dcbi */ | 282 | case OP_31_XOP_DCBI: |
250 | /* Do nothing. The guest is performing dcbi because | 283 | /* Do nothing. The guest is performing dcbi because |
251 | * hardware DMA is not snooped by the dcache, but | 284 | * hardware DMA is not snooped by the dcache, but |
252 | * emulated DMA either goes through the dcache as | 285 | * emulated DMA either goes through the dcache as |
@@ -254,15 +287,15 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
254 | * coherence. */ | 287 | * coherence. */ |
255 | break; | 288 | break; |
256 | 289 | ||
257 | case 534: /* lwbrx */ | 290 | case OP_31_XOP_LWBRX: |
258 | rt = get_rt(inst); | 291 | rt = get_rt(inst); |
259 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 0); | 292 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 0); |
260 | break; | 293 | break; |
261 | 294 | ||
262 | case 566: /* tlbsync */ | 295 | case OP_31_XOP_TLBSYNC: |
263 | break; | 296 | break; |
264 | 297 | ||
265 | case 662: /* stwbrx */ | 298 | case OP_31_XOP_STWBRX: |
266 | rs = get_rs(inst); | 299 | rs = get_rs(inst); |
267 | ra = get_ra(inst); | 300 | ra = get_ra(inst); |
268 | rb = get_rb(inst); | 301 | rb = get_rb(inst); |
@@ -272,12 +305,12 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
272 | 4, 0); | 305 | 4, 0); |
273 | break; | 306 | break; |
274 | 307 | ||
275 | case 790: /* lhbrx */ | 308 | case OP_31_XOP_LHBRX: |
276 | rt = get_rt(inst); | 309 | rt = get_rt(inst); |
277 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 0); | 310 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 0); |
278 | break; | 311 | break; |
279 | 312 | ||
280 | case 918: /* sthbrx */ | 313 | case OP_31_XOP_STHBRX: |
281 | rs = get_rs(inst); | 314 | rs = get_rs(inst); |
282 | ra = get_ra(inst); | 315 | ra = get_ra(inst); |
283 | rb = get_rb(inst); | 316 | rb = get_rb(inst); |
@@ -293,37 +326,37 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
293 | } | 326 | } |
294 | break; | 327 | break; |
295 | 328 | ||
296 | case 32: /* lwz */ | 329 | case OP_LWZ: |
297 | rt = get_rt(inst); | 330 | rt = get_rt(inst); |
298 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1); | 331 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1); |
299 | break; | 332 | break; |
300 | 333 | ||
301 | case 33: /* lwzu */ | 334 | case OP_LWZU: |
302 | ra = get_ra(inst); | 335 | ra = get_ra(inst); |
303 | rt = get_rt(inst); | 336 | rt = get_rt(inst); |
304 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1); | 337 | emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1); |
305 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; | 338 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; |
306 | break; | 339 | break; |
307 | 340 | ||
308 | case 34: /* lbz */ | 341 | case OP_LBZ: |
309 | rt = get_rt(inst); | 342 | rt = get_rt(inst); |
310 | emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1); | 343 | emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1); |
311 | break; | 344 | break; |
312 | 345 | ||
313 | case 35: /* lbzu */ | 346 | case OP_LBZU: |
314 | ra = get_ra(inst); | 347 | ra = get_ra(inst); |
315 | rt = get_rt(inst); | 348 | rt = get_rt(inst); |
316 | emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1); | 349 | emulated = kvmppc_handle_load(run, vcpu, rt, 1, 1); |
317 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; | 350 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; |
318 | break; | 351 | break; |
319 | 352 | ||
320 | case 36: /* stw */ | 353 | case OP_STW: |
321 | rs = get_rs(inst); | 354 | rs = get_rs(inst); |
322 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], | 355 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], |
323 | 4, 1); | 356 | 4, 1); |
324 | break; | 357 | break; |
325 | 358 | ||
326 | case 37: /* stwu */ | 359 | case OP_STWU: |
327 | ra = get_ra(inst); | 360 | ra = get_ra(inst); |
328 | rs = get_rs(inst); | 361 | rs = get_rs(inst); |
329 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], | 362 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], |
@@ -331,13 +364,13 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
331 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; | 364 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; |
332 | break; | 365 | break; |
333 | 366 | ||
334 | case 38: /* stb */ | 367 | case OP_STB: |
335 | rs = get_rs(inst); | 368 | rs = get_rs(inst); |
336 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], | 369 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], |
337 | 1, 1); | 370 | 1, 1); |
338 | break; | 371 | break; |
339 | 372 | ||
340 | case 39: /* stbu */ | 373 | case OP_STBU: |
341 | ra = get_ra(inst); | 374 | ra = get_ra(inst); |
342 | rs = get_rs(inst); | 375 | rs = get_rs(inst); |
343 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], | 376 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], |
@@ -345,25 +378,25 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
345 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; | 378 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; |
346 | break; | 379 | break; |
347 | 380 | ||
348 | case 40: /* lhz */ | 381 | case OP_LHZ: |
349 | rt = get_rt(inst); | 382 | rt = get_rt(inst); |
350 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1); | 383 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1); |
351 | break; | 384 | break; |
352 | 385 | ||
353 | case 41: /* lhzu */ | 386 | case OP_LHZU: |
354 | ra = get_ra(inst); | 387 | ra = get_ra(inst); |
355 | rt = get_rt(inst); | 388 | rt = get_rt(inst); |
356 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1); | 389 | emulated = kvmppc_handle_load(run, vcpu, rt, 2, 1); |
357 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; | 390 | vcpu->arch.gpr[ra] = vcpu->arch.paddr_accessed; |
358 | break; | 391 | break; |
359 | 392 | ||
360 | case 44: /* sth */ | 393 | case OP_STH: |
361 | rs = get_rs(inst); | 394 | rs = get_rs(inst); |
362 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], | 395 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], |
363 | 2, 1); | 396 | 2, 1); |
364 | break; | 397 | break; |
365 | 398 | ||
366 | case 45: /* sthu */ | 399 | case OP_STHU: |
367 | ra = get_ra(inst); | 400 | ra = get_ra(inst); |
368 | rs = get_rs(inst); | 401 | rs = get_rs(inst); |
369 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], | 402 | emulated = kvmppc_handle_store(run, vcpu, vcpu->arch.gpr[rs], |
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 5f81256287f5..9057335fdc61 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c | |||
@@ -216,46 +216,23 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | |||
216 | 216 | ||
217 | void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) | 217 | void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) |
218 | { | 218 | { |
219 | kvmppc_core_destroy_mmu(vcpu); | 219 | kvmppc_mmu_destroy(vcpu); |
220 | } | 220 | } |
221 | 221 | ||
222 | void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | 222 | void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
223 | { | 223 | { |
224 | if (vcpu->guest_debug.enabled) | ||
225 | kvmppc_core_load_guest_debugstate(vcpu); | ||
226 | |||
227 | kvmppc_core_vcpu_load(vcpu, cpu); | 224 | kvmppc_core_vcpu_load(vcpu, cpu); |
228 | } | 225 | } |
229 | 226 | ||
230 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) | 227 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) |
231 | { | 228 | { |
232 | if (vcpu->guest_debug.enabled) | ||
233 | kvmppc_core_load_host_debugstate(vcpu); | ||
234 | |||
235 | /* Don't leave guest TLB entries resident when being de-scheduled. */ | ||
236 | /* XXX It would be nice to differentiate between heavyweight exit and | ||
237 | * sched_out here, since we could avoid the TLB flush for heavyweight | ||
238 | * exits. */ | ||
239 | _tlbil_all(); | ||
240 | kvmppc_core_vcpu_put(vcpu); | 229 | kvmppc_core_vcpu_put(vcpu); |
241 | } | 230 | } |
242 | 231 | ||
243 | int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, | 232 | int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, |
244 | struct kvm_debug_guest *dbg) | 233 | struct kvm_guest_debug *dbg) |
245 | { | 234 | { |
246 | int i; | 235 | return -EINVAL; |
247 | |||
248 | vcpu->guest_debug.enabled = dbg->enabled; | ||
249 | if (vcpu->guest_debug.enabled) { | ||
250 | for (i=0; i < ARRAY_SIZE(vcpu->guest_debug.bp); i++) { | ||
251 | if (dbg->breakpoints[i].enabled) | ||
252 | vcpu->guest_debug.bp[i] = dbg->breakpoints[i].address; | ||
253 | else | ||
254 | vcpu->guest_debug.bp[i] = 0; | ||
255 | } | ||
256 | } | ||
257 | |||
258 | return 0; | ||
259 | } | 236 | } |
260 | 237 | ||
261 | static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu, | 238 | static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu, |
diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c index 28c04dab2633..882e47080e74 100644 --- a/arch/powerpc/platforms/cell/interrupt.c +++ b/arch/powerpc/platforms/cell/interrupt.c | |||
@@ -237,8 +237,6 @@ extern int noirqdebug; | |||
237 | 237 | ||
238 | static void handle_iic_irq(unsigned int irq, struct irq_desc *desc) | 238 | static void handle_iic_irq(unsigned int irq, struct irq_desc *desc) |
239 | { | 239 | { |
240 | const unsigned int cpu = smp_processor_id(); | ||
241 | |||
242 | spin_lock(&desc->lock); | 240 | spin_lock(&desc->lock); |
243 | 241 | ||
244 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); | 242 | desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); |
@@ -254,7 +252,7 @@ static void handle_iic_irq(unsigned int irq, struct irq_desc *desc) | |||
254 | goto out_eoi; | 252 | goto out_eoi; |
255 | } | 253 | } |
256 | 254 | ||
257 | kstat_cpu(cpu).irqs[irq]++; | 255 | kstat_incr_irqs_this_cpu(irq, desc); |
258 | 256 | ||
259 | /* Mark the IRQ currently in progress.*/ | 257 | /* Mark the IRQ currently in progress.*/ |
260 | desc->status |= IRQ_INPROGRESS; | 258 | desc->status |= IRQ_INPROGRESS; |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 6a0ad196aeb3..f085369301b1 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -508,7 +508,7 @@ static void __spu_add_to_rq(struct spu_context *ctx) | |||
508 | list_add_tail(&ctx->rq, &spu_prio->runq[ctx->prio]); | 508 | list_add_tail(&ctx->rq, &spu_prio->runq[ctx->prio]); |
509 | set_bit(ctx->prio, spu_prio->bitmap); | 509 | set_bit(ctx->prio, spu_prio->bitmap); |
510 | if (!spu_prio->nr_waiting++) | 510 | if (!spu_prio->nr_waiting++) |
511 | __mod_timer(&spusched_timer, jiffies + SPUSCHED_TICK); | 511 | mod_timer(&spusched_timer, jiffies + SPUSCHED_TICK); |
512 | } | 512 | } |
513 | } | 513 | } |
514 | 514 | ||
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 58311a867851..a705fffbb498 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c | |||
@@ -376,7 +376,7 @@ static int ps3_system_bus_probe(struct device *_dev) | |||
376 | struct ps3_system_bus_driver *drv; | 376 | struct ps3_system_bus_driver *drv; |
377 | 377 | ||
378 | BUG_ON(!dev); | 378 | BUG_ON(!dev); |
379 | pr_debug(" -> %s:%d: %s\n", __func__, __LINE__, _dev->bus_id); | 379 | dev_dbg(_dev, "%s:%d\n", __func__, __LINE__); |
380 | 380 | ||
381 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); | 381 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); |
382 | BUG_ON(!drv); | 382 | BUG_ON(!drv); |
@@ -398,7 +398,7 @@ static int ps3_system_bus_remove(struct device *_dev) | |||
398 | struct ps3_system_bus_driver *drv; | 398 | struct ps3_system_bus_driver *drv; |
399 | 399 | ||
400 | BUG_ON(!dev); | 400 | BUG_ON(!dev); |
401 | pr_debug(" -> %s:%d: %s\n", __func__, __LINE__, _dev->bus_id); | 401 | dev_dbg(_dev, "%s:%d\n", __func__, __LINE__); |
402 | 402 | ||
403 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); | 403 | drv = ps3_system_bus_dev_to_system_bus_drv(dev); |
404 | BUG_ON(!drv); | 404 | BUG_ON(!drv); |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 6b0a3538dc63..2a8af5e16345 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -343,13 +343,6 @@ source "mm/Kconfig" | |||
343 | 343 | ||
344 | comment "I/O subsystem configuration" | 344 | comment "I/O subsystem configuration" |
345 | 345 | ||
346 | config MACHCHK_WARNING | ||
347 | bool "Process warning machine checks" | ||
348 | help | ||
349 | Select this option if you want the machine check handler on IBM S/390 or | ||
350 | zSeries to process warning machine checks (e.g. on power failures). | ||
351 | If unsure, say "Y". | ||
352 | |||
353 | config QDIO | 346 | config QDIO |
354 | tristate "QDIO support" | 347 | tristate "QDIO support" |
355 | ---help--- | 348 | ---help--- |
@@ -521,7 +514,7 @@ config APPLDATA_OS | |||
521 | 514 | ||
522 | config APPLDATA_NET_SUM | 515 | config APPLDATA_NET_SUM |
523 | tristate "Monitor overall network statistics" | 516 | tristate "Monitor overall network statistics" |
524 | depends on APPLDATA_BASE | 517 | depends on APPLDATA_BASE && NET |
525 | help | 518 | help |
526 | This provides network related data to the Linux - VM Monitor Stream, | 519 | This provides network related data to the Linux - VM Monitor Stream, |
527 | currently there is only a total sum of network I/O statistics, no | 520 | currently there is only a total sum of network I/O statistics, no |
@@ -552,7 +545,7 @@ config KEXEC | |||
552 | but is independent of hardware/microcode support. | 545 | but is independent of hardware/microcode support. |
553 | 546 | ||
554 | config ZFCPDUMP | 547 | config ZFCPDUMP |
555 | tristate "zfcpdump support" | 548 | bool "zfcpdump support" |
556 | select SMP | 549 | select SMP |
557 | default n | 550 | default n |
558 | help | 551 | help |
diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c index eca724d229ec..b49c00ce65e9 100644 --- a/arch/s390/crypto/prng.c +++ b/arch/s390/crypto/prng.c | |||
@@ -201,8 +201,7 @@ out_free: | |||
201 | static void __exit prng_exit(void) | 201 | static void __exit prng_exit(void) |
202 | { | 202 | { |
203 | /* wipe me */ | 203 | /* wipe me */ |
204 | memset(p->buf, 0, prng_chunk_size); | 204 | kzfree(p->buf); |
205 | kfree(p->buf); | ||
206 | kfree(p); | 205 | kfree(p); |
207 | 206 | ||
208 | misc_deregister(&prng_dev); | 207 | misc_deregister(&prng_dev); |
diff --git a/arch/s390/crypto/sha.h b/arch/s390/crypto/sha.h index 1ceafa571eab..f4e9dc71675f 100644 --- a/arch/s390/crypto/sha.h +++ b/arch/s390/crypto/sha.h | |||
@@ -29,7 +29,9 @@ struct s390_sha_ctx { | |||
29 | int func; /* KIMD function to use */ | 29 | int func; /* KIMD function to use */ |
30 | }; | 30 | }; |
31 | 31 | ||
32 | void s390_sha_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len); | 32 | struct shash_desc; |
33 | void s390_sha_final(struct crypto_tfm *tfm, u8 *out); | 33 | |
34 | int s390_sha_update(struct shash_desc *desc, const u8 *data, unsigned int len); | ||
35 | int s390_sha_final(struct shash_desc *desc, u8 *out); | ||
34 | 36 | ||
35 | #endif | 37 | #endif |
diff --git a/arch/s390/crypto/sha1_s390.c b/arch/s390/crypto/sha1_s390.c index b3cb5a89b00d..e85ba348722a 100644 --- a/arch/s390/crypto/sha1_s390.c +++ b/arch/s390/crypto/sha1_s390.c | |||
@@ -23,17 +23,17 @@ | |||
23 | * any later version. | 23 | * any later version. |
24 | * | 24 | * |
25 | */ | 25 | */ |
26 | #include <crypto/internal/hash.h> | ||
26 | #include <linux/init.h> | 27 | #include <linux/init.h> |
27 | #include <linux/module.h> | 28 | #include <linux/module.h> |
28 | #include <linux/crypto.h> | ||
29 | #include <crypto/sha.h> | 29 | #include <crypto/sha.h> |
30 | 30 | ||
31 | #include "crypt_s390.h" | 31 | #include "crypt_s390.h" |
32 | #include "sha.h" | 32 | #include "sha.h" |
33 | 33 | ||
34 | static void sha1_init(struct crypto_tfm *tfm) | 34 | static int sha1_init(struct shash_desc *desc) |
35 | { | 35 | { |
36 | struct s390_sha_ctx *sctx = crypto_tfm_ctx(tfm); | 36 | struct s390_sha_ctx *sctx = shash_desc_ctx(desc); |
37 | 37 | ||
38 | sctx->state[0] = SHA1_H0; | 38 | sctx->state[0] = SHA1_H0; |
39 | sctx->state[1] = SHA1_H1; | 39 | sctx->state[1] = SHA1_H1; |
@@ -42,34 +42,36 @@ static void sha1_init(struct crypto_tfm *tfm) | |||
42 | sctx->state[4] = SHA1_H4; | 42 | sctx->state[4] = SHA1_H4; |
43 | sctx->count = 0; | 43 | sctx->count = 0; |
44 | sctx->func = KIMD_SHA_1; | 44 | sctx->func = KIMD_SHA_1; |
45 | |||
46 | return 0; | ||
45 | } | 47 | } |
46 | 48 | ||
47 | static struct crypto_alg alg = { | 49 | static struct shash_alg alg = { |
48 | .cra_name = "sha1", | 50 | .digestsize = SHA1_DIGEST_SIZE, |
49 | .cra_driver_name= "sha1-s390", | 51 | .init = sha1_init, |
50 | .cra_priority = CRYPT_S390_PRIORITY, | 52 | .update = s390_sha_update, |
51 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 53 | .final = s390_sha_final, |
52 | .cra_blocksize = SHA1_BLOCK_SIZE, | 54 | .descsize = sizeof(struct s390_sha_ctx), |
53 | .cra_ctxsize = sizeof(struct s390_sha_ctx), | 55 | .base = { |
54 | .cra_module = THIS_MODULE, | 56 | .cra_name = "sha1", |
55 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 57 | .cra_driver_name= "sha1-s390", |
56 | .cra_u = { .digest = { | 58 | .cra_priority = CRYPT_S390_PRIORITY, |
57 | .dia_digestsize = SHA1_DIGEST_SIZE, | 59 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
58 | .dia_init = sha1_init, | 60 | .cra_blocksize = SHA1_BLOCK_SIZE, |
59 | .dia_update = s390_sha_update, | 61 | .cra_module = THIS_MODULE, |
60 | .dia_final = s390_sha_final } } | 62 | } |
61 | }; | 63 | }; |
62 | 64 | ||
63 | static int __init sha1_s390_init(void) | 65 | static int __init sha1_s390_init(void) |
64 | { | 66 | { |
65 | if (!crypt_s390_func_available(KIMD_SHA_1)) | 67 | if (!crypt_s390_func_available(KIMD_SHA_1)) |
66 | return -EOPNOTSUPP; | 68 | return -EOPNOTSUPP; |
67 | return crypto_register_alg(&alg); | 69 | return crypto_register_shash(&alg); |
68 | } | 70 | } |
69 | 71 | ||
70 | static void __exit sha1_s390_fini(void) | 72 | static void __exit sha1_s390_fini(void) |
71 | { | 73 | { |
72 | crypto_unregister_alg(&alg); | 74 | crypto_unregister_shash(&alg); |
73 | } | 75 | } |
74 | 76 | ||
75 | module_init(sha1_s390_init); | 77 | module_init(sha1_s390_init); |
diff --git a/arch/s390/crypto/sha256_s390.c b/arch/s390/crypto/sha256_s390.c index 19c03fb6ba7e..f9fefc569632 100644 --- a/arch/s390/crypto/sha256_s390.c +++ b/arch/s390/crypto/sha256_s390.c | |||
@@ -16,17 +16,17 @@ | |||
16 | * any later version. | 16 | * any later version. |
17 | * | 17 | * |
18 | */ | 18 | */ |
19 | #include <crypto/internal/hash.h> | ||
19 | #include <linux/init.h> | 20 | #include <linux/init.h> |
20 | #include <linux/module.h> | 21 | #include <linux/module.h> |
21 | #include <linux/crypto.h> | ||
22 | #include <crypto/sha.h> | 22 | #include <crypto/sha.h> |
23 | 23 | ||
24 | #include "crypt_s390.h" | 24 | #include "crypt_s390.h" |
25 | #include "sha.h" | 25 | #include "sha.h" |
26 | 26 | ||
27 | static void sha256_init(struct crypto_tfm *tfm) | 27 | static int sha256_init(struct shash_desc *desc) |
28 | { | 28 | { |
29 | struct s390_sha_ctx *sctx = crypto_tfm_ctx(tfm); | 29 | struct s390_sha_ctx *sctx = shash_desc_ctx(desc); |
30 | 30 | ||
31 | sctx->state[0] = SHA256_H0; | 31 | sctx->state[0] = SHA256_H0; |
32 | sctx->state[1] = SHA256_H1; | 32 | sctx->state[1] = SHA256_H1; |
@@ -38,22 +38,24 @@ static void sha256_init(struct crypto_tfm *tfm) | |||
38 | sctx->state[7] = SHA256_H7; | 38 | sctx->state[7] = SHA256_H7; |
39 | sctx->count = 0; | 39 | sctx->count = 0; |
40 | sctx->func = KIMD_SHA_256; | 40 | sctx->func = KIMD_SHA_256; |
41 | |||
42 | return 0; | ||
41 | } | 43 | } |
42 | 44 | ||
43 | static struct crypto_alg alg = { | 45 | static struct shash_alg alg = { |
44 | .cra_name = "sha256", | 46 | .digestsize = SHA256_DIGEST_SIZE, |
45 | .cra_driver_name = "sha256-s390", | 47 | .init = sha256_init, |
46 | .cra_priority = CRYPT_S390_PRIORITY, | 48 | .update = s390_sha_update, |
47 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 49 | .final = s390_sha_final, |
48 | .cra_blocksize = SHA256_BLOCK_SIZE, | 50 | .descsize = sizeof(struct s390_sha_ctx), |
49 | .cra_ctxsize = sizeof(struct s390_sha_ctx), | 51 | .base = { |
50 | .cra_module = THIS_MODULE, | 52 | .cra_name = "sha256", |
51 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 53 | .cra_driver_name= "sha256-s390", |
52 | .cra_u = { .digest = { | 54 | .cra_priority = CRYPT_S390_PRIORITY, |
53 | .dia_digestsize = SHA256_DIGEST_SIZE, | 55 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
54 | .dia_init = sha256_init, | 56 | .cra_blocksize = SHA256_BLOCK_SIZE, |
55 | .dia_update = s390_sha_update, | 57 | .cra_module = THIS_MODULE, |
56 | .dia_final = s390_sha_final } } | 58 | } |
57 | }; | 59 | }; |
58 | 60 | ||
59 | static int sha256_s390_init(void) | 61 | static int sha256_s390_init(void) |
@@ -61,12 +63,12 @@ static int sha256_s390_init(void) | |||
61 | if (!crypt_s390_func_available(KIMD_SHA_256)) | 63 | if (!crypt_s390_func_available(KIMD_SHA_256)) |
62 | return -EOPNOTSUPP; | 64 | return -EOPNOTSUPP; |
63 | 65 | ||
64 | return crypto_register_alg(&alg); | 66 | return crypto_register_shash(&alg); |
65 | } | 67 | } |
66 | 68 | ||
67 | static void __exit sha256_s390_fini(void) | 69 | static void __exit sha256_s390_fini(void) |
68 | { | 70 | { |
69 | crypto_unregister_alg(&alg); | 71 | crypto_unregister_shash(&alg); |
70 | } | 72 | } |
71 | 73 | ||
72 | module_init(sha256_s390_init); | 74 | module_init(sha256_s390_init); |
diff --git a/arch/s390/crypto/sha512_s390.c b/arch/s390/crypto/sha512_s390.c index 23c7861f6aeb..83192bfc8048 100644 --- a/arch/s390/crypto/sha512_s390.c +++ b/arch/s390/crypto/sha512_s390.c | |||
@@ -12,16 +12,16 @@ | |||
12 | * any later version. | 12 | * any later version. |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | #include <crypto/internal/hash.h> | ||
15 | #include <linux/init.h> | 16 | #include <linux/init.h> |
16 | #include <linux/module.h> | 17 | #include <linux/module.h> |
17 | #include <linux/crypto.h> | ||
18 | 18 | ||
19 | #include "sha.h" | 19 | #include "sha.h" |
20 | #include "crypt_s390.h" | 20 | #include "crypt_s390.h" |
21 | 21 | ||
22 | static void sha512_init(struct crypto_tfm *tfm) | 22 | static int sha512_init(struct shash_desc *desc) |
23 | { | 23 | { |
24 | struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm); | 24 | struct s390_sha_ctx *ctx = shash_desc_ctx(desc); |
25 | 25 | ||
26 | *(__u64 *)&ctx->state[0] = 0x6a09e667f3bcc908ULL; | 26 | *(__u64 *)&ctx->state[0] = 0x6a09e667f3bcc908ULL; |
27 | *(__u64 *)&ctx->state[2] = 0xbb67ae8584caa73bULL; | 27 | *(__u64 *)&ctx->state[2] = 0xbb67ae8584caa73bULL; |
@@ -33,29 +33,31 @@ static void sha512_init(struct crypto_tfm *tfm) | |||
33 | *(__u64 *)&ctx->state[14] = 0x5be0cd19137e2179ULL; | 33 | *(__u64 *)&ctx->state[14] = 0x5be0cd19137e2179ULL; |
34 | ctx->count = 0; | 34 | ctx->count = 0; |
35 | ctx->func = KIMD_SHA_512; | 35 | ctx->func = KIMD_SHA_512; |
36 | |||
37 | return 0; | ||
36 | } | 38 | } |
37 | 39 | ||
38 | static struct crypto_alg sha512_alg = { | 40 | static struct shash_alg sha512_alg = { |
39 | .cra_name = "sha512", | 41 | .digestsize = SHA512_DIGEST_SIZE, |
40 | .cra_driver_name = "sha512-s390", | 42 | .init = sha512_init, |
41 | .cra_priority = CRYPT_S390_PRIORITY, | 43 | .update = s390_sha_update, |
42 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 44 | .final = s390_sha_final, |
43 | .cra_blocksize = SHA512_BLOCK_SIZE, | 45 | .descsize = sizeof(struct s390_sha_ctx), |
44 | .cra_ctxsize = sizeof(struct s390_sha_ctx), | 46 | .base = { |
45 | .cra_module = THIS_MODULE, | 47 | .cra_name = "sha512", |
46 | .cra_list = LIST_HEAD_INIT(sha512_alg.cra_list), | 48 | .cra_driver_name= "sha512-s390", |
47 | .cra_u = { .digest = { | 49 | .cra_priority = CRYPT_S390_PRIORITY, |
48 | .dia_digestsize = SHA512_DIGEST_SIZE, | 50 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
49 | .dia_init = sha512_init, | 51 | .cra_blocksize = SHA512_BLOCK_SIZE, |
50 | .dia_update = s390_sha_update, | 52 | .cra_module = THIS_MODULE, |
51 | .dia_final = s390_sha_final } } | 53 | } |
52 | }; | 54 | }; |
53 | 55 | ||
54 | MODULE_ALIAS("sha512"); | 56 | MODULE_ALIAS("sha512"); |
55 | 57 | ||
56 | static void sha384_init(struct crypto_tfm *tfm) | 58 | static int sha384_init(struct shash_desc *desc) |
57 | { | 59 | { |
58 | struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm); | 60 | struct s390_sha_ctx *ctx = shash_desc_ctx(desc); |
59 | 61 | ||
60 | *(__u64 *)&ctx->state[0] = 0xcbbb9d5dc1059ed8ULL; | 62 | *(__u64 *)&ctx->state[0] = 0xcbbb9d5dc1059ed8ULL; |
61 | *(__u64 *)&ctx->state[2] = 0x629a292a367cd507ULL; | 63 | *(__u64 *)&ctx->state[2] = 0x629a292a367cd507ULL; |
@@ -67,22 +69,25 @@ static void sha384_init(struct crypto_tfm *tfm) | |||
67 | *(__u64 *)&ctx->state[14] = 0x47b5481dbefa4fa4ULL; | 69 | *(__u64 *)&ctx->state[14] = 0x47b5481dbefa4fa4ULL; |
68 | ctx->count = 0; | 70 | ctx->count = 0; |
69 | ctx->func = KIMD_SHA_512; | 71 | ctx->func = KIMD_SHA_512; |
72 | |||
73 | return 0; | ||
70 | } | 74 | } |
71 | 75 | ||
72 | static struct crypto_alg sha384_alg = { | 76 | static struct shash_alg sha384_alg = { |
73 | .cra_name = "sha384", | 77 | .digestsize = SHA384_DIGEST_SIZE, |
74 | .cra_driver_name = "sha384-s390", | 78 | .init = sha384_init, |
75 | .cra_priority = CRYPT_S390_PRIORITY, | 79 | .update = s390_sha_update, |
76 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 80 | .final = s390_sha_final, |
77 | .cra_blocksize = SHA384_BLOCK_SIZE, | 81 | .descsize = sizeof(struct s390_sha_ctx), |
78 | .cra_ctxsize = sizeof(struct s390_sha_ctx), | 82 | .base = { |
79 | .cra_module = THIS_MODULE, | 83 | .cra_name = "sha384", |
80 | .cra_list = LIST_HEAD_INIT(sha384_alg.cra_list), | 84 | .cra_driver_name= "sha384-s390", |
81 | .cra_u = { .digest = { | 85 | .cra_priority = CRYPT_S390_PRIORITY, |
82 | .dia_digestsize = SHA384_DIGEST_SIZE, | 86 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, |
83 | .dia_init = sha384_init, | 87 | .cra_blocksize = SHA384_BLOCK_SIZE, |
84 | .dia_update = s390_sha_update, | 88 | .cra_ctxsize = sizeof(struct s390_sha_ctx), |
85 | .dia_final = s390_sha_final } } | 89 | .cra_module = THIS_MODULE, |
90 | } | ||
86 | }; | 91 | }; |
87 | 92 | ||
88 | MODULE_ALIAS("sha384"); | 93 | MODULE_ALIAS("sha384"); |
@@ -93,18 +98,18 @@ static int __init init(void) | |||
93 | 98 | ||
94 | if (!crypt_s390_func_available(KIMD_SHA_512)) | 99 | if (!crypt_s390_func_available(KIMD_SHA_512)) |
95 | return -EOPNOTSUPP; | 100 | return -EOPNOTSUPP; |
96 | if ((ret = crypto_register_alg(&sha512_alg)) < 0) | 101 | if ((ret = crypto_register_shash(&sha512_alg)) < 0) |
97 | goto out; | 102 | goto out; |
98 | if ((ret = crypto_register_alg(&sha384_alg)) < 0) | 103 | if ((ret = crypto_register_shash(&sha384_alg)) < 0) |
99 | crypto_unregister_alg(&sha512_alg); | 104 | crypto_unregister_shash(&sha512_alg); |
100 | out: | 105 | out: |
101 | return ret; | 106 | return ret; |
102 | } | 107 | } |
103 | 108 | ||
104 | static void __exit fini(void) | 109 | static void __exit fini(void) |
105 | { | 110 | { |
106 | crypto_unregister_alg(&sha512_alg); | 111 | crypto_unregister_shash(&sha512_alg); |
107 | crypto_unregister_alg(&sha384_alg); | 112 | crypto_unregister_shash(&sha384_alg); |
108 | } | 113 | } |
109 | 114 | ||
110 | module_init(init); | 115 | module_init(init); |
diff --git a/arch/s390/crypto/sha_common.c b/arch/s390/crypto/sha_common.c index 9d6eb8c3d37e..7903ec47e6b9 100644 --- a/arch/s390/crypto/sha_common.c +++ b/arch/s390/crypto/sha_common.c | |||
@@ -13,14 +13,14 @@ | |||
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/crypto.h> | 16 | #include <crypto/internal/hash.h> |
17 | #include "sha.h" | 17 | #include "sha.h" |
18 | #include "crypt_s390.h" | 18 | #include "crypt_s390.h" |
19 | 19 | ||
20 | void s390_sha_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) | 20 | int s390_sha_update(struct shash_desc *desc, const u8 *data, unsigned int len) |
21 | { | 21 | { |
22 | struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm); | 22 | struct s390_sha_ctx *ctx = shash_desc_ctx(desc); |
23 | unsigned int bsize = crypto_tfm_alg_blocksize(tfm); | 23 | unsigned int bsize = crypto_shash_blocksize(desc->tfm); |
24 | unsigned int index; | 24 | unsigned int index; |
25 | int ret; | 25 | int ret; |
26 | 26 | ||
@@ -51,13 +51,15 @@ void s390_sha_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len) | |||
51 | store: | 51 | store: |
52 | if (len) | 52 | if (len) |
53 | memcpy(ctx->buf + index , data, len); | 53 | memcpy(ctx->buf + index , data, len); |
54 | |||
55 | return 0; | ||
54 | } | 56 | } |
55 | EXPORT_SYMBOL_GPL(s390_sha_update); | 57 | EXPORT_SYMBOL_GPL(s390_sha_update); |
56 | 58 | ||
57 | void s390_sha_final(struct crypto_tfm *tfm, u8 *out) | 59 | int s390_sha_final(struct shash_desc *desc, u8 *out) |
58 | { | 60 | { |
59 | struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm); | 61 | struct s390_sha_ctx *ctx = shash_desc_ctx(desc); |
60 | unsigned int bsize = crypto_tfm_alg_blocksize(tfm); | 62 | unsigned int bsize = crypto_shash_blocksize(desc->tfm); |
61 | u64 bits; | 63 | u64 bits; |
62 | unsigned int index, end, plen; | 64 | unsigned int index, end, plen; |
63 | int ret; | 65 | int ret; |
@@ -87,9 +89,11 @@ void s390_sha_final(struct crypto_tfm *tfm, u8 *out) | |||
87 | BUG_ON(ret != end); | 89 | BUG_ON(ret != end); |
88 | 90 | ||
89 | /* copy digest to out */ | 91 | /* copy digest to out */ |
90 | memcpy(out, ctx->state, crypto_hash_digestsize(crypto_hash_cast(tfm))); | 92 | memcpy(out, ctx->state, crypto_shash_digestsize(desc->tfm)); |
91 | /* wipe context */ | 93 | /* wipe context */ |
92 | memset(ctx, 0, sizeof *ctx); | 94 | memset(ctx, 0, sizeof *ctx); |
95 | |||
96 | return 0; | ||
93 | } | 97 | } |
94 | EXPORT_SYMBOL_GPL(s390_sha_final); | 98 | EXPORT_SYMBOL_GPL(s390_sha_final); |
95 | 99 | ||
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h index 8e9243ae0c19..b30606f6d523 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
@@ -57,7 +57,7 @@ | |||
57 | * with operation of the form "set_bit(bitnr, flags)". | 57 | * with operation of the form "set_bit(bitnr, flags)". |
58 | */ | 58 | */ |
59 | 59 | ||
60 | /* bitmap tables from arch/S390/kernel/bitmap.S */ | 60 | /* bitmap tables from arch/s390/kernel/bitmap.c */ |
61 | extern const char _oi_bitmap[]; | 61 | extern const char _oi_bitmap[]; |
62 | extern const char _ni_bitmap[]; | 62 | extern const char _ni_bitmap[]; |
63 | extern const char _zb_findmap[]; | 63 | extern const char _zb_findmap[]; |
@@ -525,16 +525,16 @@ static inline unsigned long __ffs_word_loop(const unsigned long *addr, | |||
525 | static inline unsigned long __ffz_word(unsigned long nr, unsigned long word) | 525 | static inline unsigned long __ffz_word(unsigned long nr, unsigned long word) |
526 | { | 526 | { |
527 | #ifdef __s390x__ | 527 | #ifdef __s390x__ |
528 | if (likely((word & 0xffffffff) == 0xffffffff)) { | 528 | if ((word & 0xffffffff) == 0xffffffff) { |
529 | word >>= 32; | 529 | word >>= 32; |
530 | nr += 32; | 530 | nr += 32; |
531 | } | 531 | } |
532 | #endif | 532 | #endif |
533 | if (likely((word & 0xffff) == 0xffff)) { | 533 | if ((word & 0xffff) == 0xffff) { |
534 | word >>= 16; | 534 | word >>= 16; |
535 | nr += 16; | 535 | nr += 16; |
536 | } | 536 | } |
537 | if (likely((word & 0xff) == 0xff)) { | 537 | if ((word & 0xff) == 0xff) { |
538 | word >>= 8; | 538 | word >>= 8; |
539 | nr += 8; | 539 | nr += 8; |
540 | } | 540 | } |
@@ -549,16 +549,16 @@ static inline unsigned long __ffz_word(unsigned long nr, unsigned long word) | |||
549 | static inline unsigned long __ffs_word(unsigned long nr, unsigned long word) | 549 | static inline unsigned long __ffs_word(unsigned long nr, unsigned long word) |
550 | { | 550 | { |
551 | #ifdef __s390x__ | 551 | #ifdef __s390x__ |
552 | if (likely((word & 0xffffffff) == 0)) { | 552 | if ((word & 0xffffffff) == 0) { |
553 | word >>= 32; | 553 | word >>= 32; |
554 | nr += 32; | 554 | nr += 32; |
555 | } | 555 | } |
556 | #endif | 556 | #endif |
557 | if (likely((word & 0xffff) == 0)) { | 557 | if ((word & 0xffff) == 0) { |
558 | word >>= 16; | 558 | word >>= 16; |
559 | nr += 16; | 559 | nr += 16; |
560 | } | 560 | } |
561 | if (likely((word & 0xff) == 0)) { | 561 | if ((word & 0xff) == 0) { |
562 | word >>= 8; | 562 | word >>= 8; |
563 | nr += 8; | 563 | nr += 8; |
564 | } | 564 | } |
diff --git a/arch/s390/include/asm/crw.h b/arch/s390/include/asm/crw.h new file mode 100644 index 000000000000..2185a6d619d3 --- /dev/null +++ b/arch/s390/include/asm/crw.h | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * Data definitions for channel report processing | ||
3 | * Copyright IBM Corp. 2000,2009 | ||
4 | * Author(s): Ingo Adlung <adlung@de.ibm.com>, | ||
5 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
6 | * Cornelia Huck <cornelia.huck@de.ibm.com>, | ||
7 | * Heiko Carstens <heiko.carstens@de.ibm.com>, | ||
8 | */ | ||
9 | |||
10 | #ifndef _ASM_S390_CRW_H | ||
11 | #define _ASM_S390_CRW_H | ||
12 | |||
13 | #include <linux/types.h> | ||
14 | |||
15 | /* | ||
16 | * Channel Report Word | ||
17 | */ | ||
18 | struct crw { | ||
19 | __u32 res1 : 1; /* reserved zero */ | ||
20 | __u32 slct : 1; /* solicited */ | ||
21 | __u32 oflw : 1; /* overflow */ | ||
22 | __u32 chn : 1; /* chained */ | ||
23 | __u32 rsc : 4; /* reporting source code */ | ||
24 | __u32 anc : 1; /* ancillary report */ | ||
25 | __u32 res2 : 1; /* reserved zero */ | ||
26 | __u32 erc : 6; /* error-recovery code */ | ||
27 | __u32 rsid : 16; /* reporting-source ID */ | ||
28 | } __attribute__ ((packed)); | ||
29 | |||
30 | typedef void (*crw_handler_t)(struct crw *, struct crw *, int); | ||
31 | |||
32 | extern int crw_register_handler(int rsc, crw_handler_t handler); | ||
33 | extern void crw_unregister_handler(int rsc); | ||
34 | extern void crw_handle_channel_report(void); | ||
35 | |||
36 | #define NR_RSCS 16 | ||
37 | |||
38 | #define CRW_RSC_MONITOR 0x2 /* monitoring facility */ | ||
39 | #define CRW_RSC_SCH 0x3 /* subchannel */ | ||
40 | #define CRW_RSC_CPATH 0x4 /* channel path */ | ||
41 | #define CRW_RSC_CONFIG 0x9 /* configuration-alert facility */ | ||
42 | #define CRW_RSC_CSS 0xB /* channel subsystem */ | ||
43 | |||
44 | #define CRW_ERC_EVENT 0x00 /* event information pending */ | ||
45 | #define CRW_ERC_AVAIL 0x01 /* available */ | ||
46 | #define CRW_ERC_INIT 0x02 /* initialized */ | ||
47 | #define CRW_ERC_TERROR 0x03 /* temporary error */ | ||
48 | #define CRW_ERC_IPARM 0x04 /* installed parm initialized */ | ||
49 | #define CRW_ERC_TERM 0x05 /* terminal */ | ||
50 | #define CRW_ERC_PERRN 0x06 /* perm. error, fac. not init */ | ||
51 | #define CRW_ERC_PERRI 0x07 /* perm. error, facility init */ | ||
52 | #define CRW_ERC_PMOD 0x08 /* installed parameters modified */ | ||
53 | |||
54 | static inline int stcrw(struct crw *pcrw) | ||
55 | { | ||
56 | int ccode; | ||
57 | |||
58 | asm volatile( | ||
59 | " stcrw 0(%2)\n" | ||
60 | " ipm %0\n" | ||
61 | " srl %0,28\n" | ||
62 | : "=d" (ccode), "=m" (*pcrw) | ||
63 | : "a" (pcrw) | ||
64 | : "cc" ); | ||
65 | return ccode; | ||
66 | } | ||
67 | |||
68 | #endif /* _ASM_S390_CRW_H */ | ||
diff --git a/arch/s390/include/asm/dasd.h b/arch/s390/include/asm/dasd.h index e2db6f16d9c8..218bce81ec70 100644 --- a/arch/s390/include/asm/dasd.h +++ b/arch/s390/include/asm/dasd.h | |||
@@ -162,15 +162,15 @@ typedef struct dasd_profile_info_t { | |||
162 | unsigned int dasd_io_nr_req[32]; /* histogram of # of requests in chanq */ | 162 | unsigned int dasd_io_nr_req[32]; /* histogram of # of requests in chanq */ |
163 | } dasd_profile_info_t; | 163 | } dasd_profile_info_t; |
164 | 164 | ||
165 | /* | 165 | /* |
166 | * struct format_data_t | 166 | * struct format_data_t |
167 | * represents all data necessary to format a dasd | 167 | * represents all data necessary to format a dasd |
168 | */ | 168 | */ |
169 | typedef struct format_data_t { | 169 | typedef struct format_data_t { |
170 | int start_unit; /* from track */ | 170 | unsigned int start_unit; /* from track */ |
171 | int stop_unit; /* to track */ | 171 | unsigned int stop_unit; /* to track */ |
172 | int blksize; /* sectorsize */ | 172 | unsigned int blksize; /* sectorsize */ |
173 | int intensity; | 173 | unsigned int intensity; |
174 | } format_data_t; | 174 | } format_data_t; |
175 | 175 | ||
176 | /* | 176 | /* |
diff --git a/arch/s390/include/asm/idals.h b/arch/s390/include/asm/idals.h index e82c10efe65a..aae276d00383 100644 --- a/arch/s390/include/asm/idals.h +++ b/arch/s390/include/asm/idals.h | |||
@@ -44,24 +44,18 @@ idal_is_needed(void *vaddr, unsigned int length) | |||
44 | /* | 44 | /* |
45 | * Return the number of idal words needed for an address/length pair. | 45 | * Return the number of idal words needed for an address/length pair. |
46 | */ | 46 | */ |
47 | static inline unsigned int | 47 | static inline unsigned int idal_nr_words(void *vaddr, unsigned int length) |
48 | idal_nr_words(void *vaddr, unsigned int length) | ||
49 | { | 48 | { |
50 | #ifdef __s390x__ | 49 | return ((__pa(vaddr) & (IDA_BLOCK_SIZE-1)) + length + |
51 | if (idal_is_needed(vaddr, length)) | 50 | (IDA_BLOCK_SIZE-1)) >> IDA_SIZE_LOG; |
52 | return ((__pa(vaddr) & (IDA_BLOCK_SIZE-1)) + length + | ||
53 | (IDA_BLOCK_SIZE-1)) >> IDA_SIZE_LOG; | ||
54 | #endif | ||
55 | return 0; | ||
56 | } | 51 | } |
57 | 52 | ||
58 | /* | 53 | /* |
59 | * Create the list of idal words for an address/length pair. | 54 | * Create the list of idal words for an address/length pair. |
60 | */ | 55 | */ |
61 | static inline unsigned long * | 56 | static inline unsigned long *idal_create_words(unsigned long *idaws, |
62 | idal_create_words(unsigned long *idaws, void *vaddr, unsigned int length) | 57 | void *vaddr, unsigned int length) |
63 | { | 58 | { |
64 | #ifdef __s390x__ | ||
65 | unsigned long paddr; | 59 | unsigned long paddr; |
66 | unsigned int cidaw; | 60 | unsigned int cidaw; |
67 | 61 | ||
@@ -74,7 +68,6 @@ idal_create_words(unsigned long *idaws, void *vaddr, unsigned int length) | |||
74 | paddr += IDA_BLOCK_SIZE; | 68 | paddr += IDA_BLOCK_SIZE; |
75 | *idaws++ = paddr; | 69 | *idaws++ = paddr; |
76 | } | 70 | } |
77 | #endif | ||
78 | return idaws; | 71 | return idaws; |
79 | } | 72 | } |
80 | 73 | ||
diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h index e1f54654e3ae..0b2f829f6d50 100644 --- a/arch/s390/include/asm/kvm.h +++ b/arch/s390/include/asm/kvm.h | |||
@@ -42,4 +42,11 @@ struct kvm_fpu { | |||
42 | __u64 fprs[16]; | 42 | __u64 fprs[16]; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | struct kvm_debug_exit_arch { | ||
46 | }; | ||
47 | |||
48 | /* for KVM_SET_GUEST_DEBUG */ | ||
49 | struct kvm_guest_debug_arch { | ||
50 | }; | ||
51 | |||
45 | #endif | 52 | #endif |
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 3c55e4107dcc..c6e674f5fca9 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
@@ -21,9 +21,6 @@ | |||
21 | /* memory slots that does not exposed to userspace */ | 21 | /* memory slots that does not exposed to userspace */ |
22 | #define KVM_PRIVATE_MEM_SLOTS 4 | 22 | #define KVM_PRIVATE_MEM_SLOTS 4 |
23 | 23 | ||
24 | struct kvm_guest_debug { | ||
25 | }; | ||
26 | |||
27 | struct sca_entry { | 24 | struct sca_entry { |
28 | atomic_t scn; | 25 | atomic_t scn; |
29 | __u64 reserved; | 26 | __u64 reserved; |
diff --git a/arch/s390/include/asm/lowcore.h b/arch/s390/include/asm/lowcore.h index f3720defdd16..b349f1c7fdfa 100644 --- a/arch/s390/include/asm/lowcore.h +++ b/arch/s390/include/asm/lowcore.h | |||
@@ -11,129 +11,118 @@ | |||
11 | #ifndef _ASM_S390_LOWCORE_H | 11 | #ifndef _ASM_S390_LOWCORE_H |
12 | #define _ASM_S390_LOWCORE_H | 12 | #define _ASM_S390_LOWCORE_H |
13 | 13 | ||
14 | #ifndef __s390x__ | 14 | #define __LC_IPL_PARMBLOCK_PTR 0x0014 |
15 | #define __LC_EXT_OLD_PSW 0x018 | 15 | #define __LC_EXT_PARAMS 0x0080 |
16 | #define __LC_SVC_OLD_PSW 0x020 | 16 | #define __LC_CPU_ADDRESS 0x0084 |
17 | #define __LC_PGM_OLD_PSW 0x028 | 17 | #define __LC_EXT_INT_CODE 0x0086 |
18 | #define __LC_MCK_OLD_PSW 0x030 | ||
19 | #define __LC_IO_OLD_PSW 0x038 | ||
20 | #define __LC_EXT_NEW_PSW 0x058 | ||
21 | #define __LC_SVC_NEW_PSW 0x060 | ||
22 | #define __LC_PGM_NEW_PSW 0x068 | ||
23 | #define __LC_MCK_NEW_PSW 0x070 | ||
24 | #define __LC_IO_NEW_PSW 0x078 | ||
25 | #else /* !__s390x__ */ | ||
26 | #define __LC_EXT_OLD_PSW 0x0130 | ||
27 | #define __LC_SVC_OLD_PSW 0x0140 | ||
28 | #define __LC_PGM_OLD_PSW 0x0150 | ||
29 | #define __LC_MCK_OLD_PSW 0x0160 | ||
30 | #define __LC_IO_OLD_PSW 0x0170 | ||
31 | #define __LC_EXT_NEW_PSW 0x01b0 | ||
32 | #define __LC_SVC_NEW_PSW 0x01c0 | ||
33 | #define __LC_PGM_NEW_PSW 0x01d0 | ||
34 | #define __LC_MCK_NEW_PSW 0x01e0 | ||
35 | #define __LC_IO_NEW_PSW 0x01f0 | ||
36 | #endif /* !__s390x__ */ | ||
37 | |||
38 | #define __LC_IPL_PARMBLOCK_PTR 0x014 | ||
39 | #define __LC_EXT_PARAMS 0x080 | ||
40 | #define __LC_CPU_ADDRESS 0x084 | ||
41 | #define __LC_EXT_INT_CODE 0x086 | ||
42 | |||
43 | #define __LC_SVC_ILC 0x088 | ||
44 | #define __LC_SVC_INT_CODE 0x08A | ||
45 | #define __LC_PGM_ILC 0x08C | ||
46 | #define __LC_PGM_INT_CODE 0x08E | ||
47 | 18 | ||
48 | #define __LC_PER_ATMID 0x096 | 19 | #define __LC_SVC_ILC 0x0088 |
49 | #define __LC_PER_ADDRESS 0x098 | 20 | #define __LC_SVC_INT_CODE 0x008a |
50 | #define __LC_PER_ACCESS_ID 0x0A1 | 21 | #define __LC_PGM_ILC 0x008c |
51 | #define __LC_AR_MODE_ID 0x0A3 | 22 | #define __LC_PGM_INT_CODE 0x008e |
52 | 23 | ||
53 | #define __LC_SUBCHANNEL_ID 0x0B8 | 24 | #define __LC_PER_ATMID 0x0096 |
54 | #define __LC_SUBCHANNEL_NR 0x0BA | 25 | #define __LC_PER_ADDRESS 0x0098 |
55 | #define __LC_IO_INT_PARM 0x0BC | 26 | #define __LC_PER_ACCESS_ID 0x00a1 |
56 | #define __LC_IO_INT_WORD 0x0C0 | 27 | #define __LC_AR_MODE_ID 0x00a3 |
57 | #define __LC_MCCK_CODE 0x0E8 | ||
58 | 28 | ||
59 | #define __LC_LAST_BREAK 0x110 | 29 | #define __LC_SUBCHANNEL_ID 0x00b8 |
60 | 30 | #define __LC_SUBCHANNEL_NR 0x00ba | |
61 | #define __LC_RETURN_PSW 0x200 | 31 | #define __LC_IO_INT_PARM 0x00bc |
62 | 32 | #define __LC_IO_INT_WORD 0x00c0 | |
63 | #define __LC_SAVE_AREA 0xC00 | 33 | #define __LC_MCCK_CODE 0x00e8 |
64 | |||
65 | #ifndef __s390x__ | ||
66 | #define __LC_IRB 0x208 | ||
67 | #define __LC_SYNC_ENTER_TIMER 0x248 | ||
68 | #define __LC_ASYNC_ENTER_TIMER 0x250 | ||
69 | #define __LC_EXIT_TIMER 0x258 | ||
70 | #define __LC_USER_TIMER 0x260 | ||
71 | #define __LC_SYSTEM_TIMER 0x268 | ||
72 | #define __LC_STEAL_TIMER 0x270 | ||
73 | #define __LC_LAST_UPDATE_TIMER 0x278 | ||
74 | #define __LC_LAST_UPDATE_CLOCK 0x280 | ||
75 | #define __LC_RETURN_MCCK_PSW 0x288 | ||
76 | #define __LC_KERNEL_STACK 0xC40 | ||
77 | #define __LC_THREAD_INFO 0xC44 | ||
78 | #define __LC_ASYNC_STACK 0xC48 | ||
79 | #define __LC_KERNEL_ASCE 0xC4C | ||
80 | #define __LC_USER_ASCE 0xC50 | ||
81 | #define __LC_PANIC_STACK 0xC54 | ||
82 | #define __LC_CPUID 0xC60 | ||
83 | #define __LC_CPUADDR 0xC68 | ||
84 | #define __LC_IPLDEV 0xC7C | ||
85 | #define __LC_CURRENT 0xC90 | ||
86 | #define __LC_INT_CLOCK 0xC98 | ||
87 | #else /* __s390x__ */ | ||
88 | #define __LC_IRB 0x210 | ||
89 | #define __LC_SYNC_ENTER_TIMER 0x250 | ||
90 | #define __LC_ASYNC_ENTER_TIMER 0x258 | ||
91 | #define __LC_EXIT_TIMER 0x260 | ||
92 | #define __LC_USER_TIMER 0x268 | ||
93 | #define __LC_SYSTEM_TIMER 0x270 | ||
94 | #define __LC_STEAL_TIMER 0x278 | ||
95 | #define __LC_LAST_UPDATE_TIMER 0x280 | ||
96 | #define __LC_LAST_UPDATE_CLOCK 0x288 | ||
97 | #define __LC_RETURN_MCCK_PSW 0x290 | ||
98 | #define __LC_KERNEL_STACK 0xD40 | ||
99 | #define __LC_THREAD_INFO 0xD48 | ||
100 | #define __LC_ASYNC_STACK 0xD50 | ||
101 | #define __LC_KERNEL_ASCE 0xD58 | ||
102 | #define __LC_USER_ASCE 0xD60 | ||
103 | #define __LC_PANIC_STACK 0xD68 | ||
104 | #define __LC_CPUID 0xD80 | ||
105 | #define __LC_CPUADDR 0xD88 | ||
106 | #define __LC_IPLDEV 0xDB8 | ||
107 | #define __LC_CURRENT 0xDD8 | ||
108 | #define __LC_INT_CLOCK 0xDE8 | ||
109 | #define __LC_VDSO_PER_CPU 0xE38 | ||
110 | #endif /* __s390x__ */ | ||
111 | 34 | ||
112 | #define __LC_PASTE 0xE40 | 35 | #define __LC_DUMP_REIPL 0x0e00 |
113 | 36 | ||
114 | #define __LC_PANIC_MAGIC 0xE00 | ||
115 | #ifndef __s390x__ | 37 | #ifndef __s390x__ |
116 | #define __LC_PFAULT_INTPARM 0x080 | 38 | #define __LC_EXT_OLD_PSW 0x0018 |
117 | #define __LC_CPU_TIMER_SAVE_AREA 0x0D8 | 39 | #define __LC_SVC_OLD_PSW 0x0020 |
118 | #define __LC_CLOCK_COMP_SAVE_AREA 0x0E0 | 40 | #define __LC_PGM_OLD_PSW 0x0028 |
119 | #define __LC_PSW_SAVE_AREA 0x100 | 41 | #define __LC_MCK_OLD_PSW 0x0030 |
120 | #define __LC_PREFIX_SAVE_AREA 0x108 | 42 | #define __LC_IO_OLD_PSW 0x0038 |
121 | #define __LC_AREGS_SAVE_AREA 0x120 | 43 | #define __LC_EXT_NEW_PSW 0x0058 |
122 | #define __LC_FPREGS_SAVE_AREA 0x160 | 44 | #define __LC_SVC_NEW_PSW 0x0060 |
123 | #define __LC_GPREGS_SAVE_AREA 0x180 | 45 | #define __LC_PGM_NEW_PSW 0x0068 |
124 | #define __LC_CREGS_SAVE_AREA 0x1C0 | 46 | #define __LC_MCK_NEW_PSW 0x0070 |
47 | #define __LC_IO_NEW_PSW 0x0078 | ||
48 | #define __LC_SAVE_AREA 0x0200 | ||
49 | #define __LC_RETURN_PSW 0x0240 | ||
50 | #define __LC_RETURN_MCCK_PSW 0x0248 | ||
51 | #define __LC_SYNC_ENTER_TIMER 0x0250 | ||
52 | #define __LC_ASYNC_ENTER_TIMER 0x0258 | ||
53 | #define __LC_EXIT_TIMER 0x0260 | ||
54 | #define __LC_USER_TIMER 0x0268 | ||
55 | #define __LC_SYSTEM_TIMER 0x0270 | ||
56 | #define __LC_STEAL_TIMER 0x0278 | ||
57 | #define __LC_LAST_UPDATE_TIMER 0x0280 | ||
58 | #define __LC_LAST_UPDATE_CLOCK 0x0288 | ||
59 | #define __LC_CURRENT 0x0290 | ||
60 | #define __LC_THREAD_INFO 0x0294 | ||
61 | #define __LC_KERNEL_STACK 0x0298 | ||
62 | #define __LC_ASYNC_STACK 0x029c | ||
63 | #define __LC_PANIC_STACK 0x02a0 | ||
64 | #define __LC_KERNEL_ASCE 0x02a4 | ||
65 | #define __LC_USER_ASCE 0x02a8 | ||
66 | #define __LC_USER_EXEC_ASCE 0x02ac | ||
67 | #define __LC_CPUID 0x02b0 | ||
68 | #define __LC_INT_CLOCK 0x02c8 | ||
69 | #define __LC_IRB 0x0300 | ||
70 | #define __LC_PFAULT_INTPARM 0x0080 | ||
71 | #define __LC_CPU_TIMER_SAVE_AREA 0x00d8 | ||
72 | #define __LC_CLOCK_COMP_SAVE_AREA 0x00e0 | ||
73 | #define __LC_PSW_SAVE_AREA 0x0100 | ||
74 | #define __LC_PREFIX_SAVE_AREA 0x0108 | ||
75 | #define __LC_AREGS_SAVE_AREA 0x0120 | ||
76 | #define __LC_FPREGS_SAVE_AREA 0x0160 | ||
77 | #define __LC_GPREGS_SAVE_AREA 0x0180 | ||
78 | #define __LC_CREGS_SAVE_AREA 0x01c0 | ||
125 | #else /* __s390x__ */ | 79 | #else /* __s390x__ */ |
126 | #define __LC_PFAULT_INTPARM 0x11B8 | 80 | #define __LC_LAST_BREAK 0x0110 |
81 | #define __LC_EXT_OLD_PSW 0x0130 | ||
82 | #define __LC_SVC_OLD_PSW 0x0140 | ||
83 | #define __LC_PGM_OLD_PSW 0x0150 | ||
84 | #define __LC_MCK_OLD_PSW 0x0160 | ||
85 | #define __LC_IO_OLD_PSW 0x0170 | ||
86 | #define __LC_EXT_NEW_PSW 0x01b0 | ||
87 | #define __LC_SVC_NEW_PSW 0x01c0 | ||
88 | #define __LC_PGM_NEW_PSW 0x01d0 | ||
89 | #define __LC_MCK_NEW_PSW 0x01e0 | ||
90 | #define __LC_IO_NEW_PSW 0x01f0 | ||
91 | #define __LC_SAVE_AREA 0x0200 | ||
92 | #define __LC_RETURN_PSW 0x0280 | ||
93 | #define __LC_RETURN_MCCK_PSW 0x0290 | ||
94 | #define __LC_SYNC_ENTER_TIMER 0x02a0 | ||
95 | #define __LC_ASYNC_ENTER_TIMER 0x02a8 | ||
96 | #define __LC_EXIT_TIMER 0x02b0 | ||
97 | #define __LC_USER_TIMER 0x02b8 | ||
98 | #define __LC_SYSTEM_TIMER 0x02c0 | ||
99 | #define __LC_STEAL_TIMER 0x02c8 | ||
100 | #define __LC_LAST_UPDATE_TIMER 0x02d0 | ||
101 | #define __LC_LAST_UPDATE_CLOCK 0x02d8 | ||
102 | #define __LC_CURRENT 0x02e0 | ||
103 | #define __LC_THREAD_INFO 0x02e8 | ||
104 | #define __LC_KERNEL_STACK 0x02f0 | ||
105 | #define __LC_ASYNC_STACK 0x02f8 | ||
106 | #define __LC_PANIC_STACK 0x0300 | ||
107 | #define __LC_KERNEL_ASCE 0x0308 | ||
108 | #define __LC_USER_ASCE 0x0310 | ||
109 | #define __LC_USER_EXEC_ASCE 0x0318 | ||
110 | #define __LC_CPUID 0x0320 | ||
111 | #define __LC_INT_CLOCK 0x0340 | ||
112 | #define __LC_VDSO_PER_CPU 0x0350 | ||
113 | #define __LC_IRB 0x0380 | ||
114 | #define __LC_PASTE 0x03c0 | ||
115 | #define __LC_PFAULT_INTPARM 0x11b8 | ||
127 | #define __LC_FPREGS_SAVE_AREA 0x1200 | 116 | #define __LC_FPREGS_SAVE_AREA 0x1200 |
128 | #define __LC_GPREGS_SAVE_AREA 0x1280 | 117 | #define __LC_GPREGS_SAVE_AREA 0x1280 |
129 | #define __LC_PSW_SAVE_AREA 0x1300 | 118 | #define __LC_PSW_SAVE_AREA 0x1300 |
130 | #define __LC_PREFIX_SAVE_AREA 0x1318 | 119 | #define __LC_PREFIX_SAVE_AREA 0x1318 |
131 | #define __LC_FP_CREG_SAVE_AREA 0x131C | 120 | #define __LC_FP_CREG_SAVE_AREA 0x131c |
132 | #define __LC_TODREG_SAVE_AREA 0x1324 | 121 | #define __LC_TODREG_SAVE_AREA 0x1324 |
133 | #define __LC_CPU_TIMER_SAVE_AREA 0x1328 | 122 | #define __LC_CPU_TIMER_SAVE_AREA 0x1328 |
134 | #define __LC_CLOCK_COMP_SAVE_AREA 0x1331 | 123 | #define __LC_CLOCK_COMP_SAVE_AREA 0x1331 |
135 | #define __LC_AREGS_SAVE_AREA 0x1340 | 124 | #define __LC_AREGS_SAVE_AREA 0x1340 |
136 | #define __LC_CREGS_SAVE_AREA 0x1380 | 125 | #define __LC_CREGS_SAVE_AREA 0x1380 |
137 | #endif /* __s390x__ */ | 126 | #endif /* __s390x__ */ |
138 | 127 | ||
139 | #ifndef __ASSEMBLY__ | 128 | #ifndef __ASSEMBLY__ |
@@ -198,222 +187,240 @@ union save_area { | |||
198 | struct _lowcore | 187 | struct _lowcore |
199 | { | 188 | { |
200 | #ifndef __s390x__ | 189 | #ifndef __s390x__ |
201 | /* prefix area: defined by architecture */ | 190 | /* 0x0000 - 0x01ff: defined by architecture */ |
202 | psw_t restart_psw; /* 0x000 */ | 191 | psw_t restart_psw; /* 0x0000 */ |
203 | __u32 ccw2[4]; /* 0x008 */ | 192 | __u32 ccw2[4]; /* 0x0008 */ |
204 | psw_t external_old_psw; /* 0x018 */ | 193 | psw_t external_old_psw; /* 0x0018 */ |
205 | psw_t svc_old_psw; /* 0x020 */ | 194 | psw_t svc_old_psw; /* 0x0020 */ |
206 | psw_t program_old_psw; /* 0x028 */ | 195 | psw_t program_old_psw; /* 0x0028 */ |
207 | psw_t mcck_old_psw; /* 0x030 */ | 196 | psw_t mcck_old_psw; /* 0x0030 */ |
208 | psw_t io_old_psw; /* 0x038 */ | 197 | psw_t io_old_psw; /* 0x0038 */ |
209 | __u8 pad1[0x58-0x40]; /* 0x040 */ | 198 | __u8 pad_0x0040[0x0058-0x0040]; /* 0x0040 */ |
210 | psw_t external_new_psw; /* 0x058 */ | 199 | psw_t external_new_psw; /* 0x0058 */ |
211 | psw_t svc_new_psw; /* 0x060 */ | 200 | psw_t svc_new_psw; /* 0x0060 */ |
212 | psw_t program_new_psw; /* 0x068 */ | 201 | psw_t program_new_psw; /* 0x0068 */ |
213 | psw_t mcck_new_psw; /* 0x070 */ | 202 | psw_t mcck_new_psw; /* 0x0070 */ |
214 | psw_t io_new_psw; /* 0x078 */ | 203 | psw_t io_new_psw; /* 0x0078 */ |
215 | __u32 ext_params; /* 0x080 */ | 204 | __u32 ext_params; /* 0x0080 */ |
216 | __u16 cpu_addr; /* 0x084 */ | 205 | __u16 cpu_addr; /* 0x0084 */ |
217 | __u16 ext_int_code; /* 0x086 */ | 206 | __u16 ext_int_code; /* 0x0086 */ |
218 | __u16 svc_ilc; /* 0x088 */ | 207 | __u16 svc_ilc; /* 0x0088 */ |
219 | __u16 svc_code; /* 0x08a */ | 208 | __u16 svc_code; /* 0x008a */ |
220 | __u16 pgm_ilc; /* 0x08c */ | 209 | __u16 pgm_ilc; /* 0x008c */ |
221 | __u16 pgm_code; /* 0x08e */ | 210 | __u16 pgm_code; /* 0x008e */ |
222 | __u32 trans_exc_code; /* 0x090 */ | 211 | __u32 trans_exc_code; /* 0x0090 */ |
223 | __u16 mon_class_num; /* 0x094 */ | 212 | __u16 mon_class_num; /* 0x0094 */ |
224 | __u16 per_perc_atmid; /* 0x096 */ | 213 | __u16 per_perc_atmid; /* 0x0096 */ |
225 | __u32 per_address; /* 0x098 */ | 214 | __u32 per_address; /* 0x0098 */ |
226 | __u32 monitor_code; /* 0x09c */ | 215 | __u32 monitor_code; /* 0x009c */ |
227 | __u8 exc_access_id; /* 0x0a0 */ | 216 | __u8 exc_access_id; /* 0x00a0 */ |
228 | __u8 per_access_id; /* 0x0a1 */ | 217 | __u8 per_access_id; /* 0x00a1 */ |
229 | __u8 pad2[0xB8-0xA2]; /* 0x0a2 */ | 218 | __u8 pad_0x00a2[0x00b8-0x00a2]; /* 0x00a2 */ |
230 | __u16 subchannel_id; /* 0x0b8 */ | 219 | __u16 subchannel_id; /* 0x00b8 */ |
231 | __u16 subchannel_nr; /* 0x0ba */ | 220 | __u16 subchannel_nr; /* 0x00ba */ |
232 | __u32 io_int_parm; /* 0x0bc */ | 221 | __u32 io_int_parm; /* 0x00bc */ |
233 | __u32 io_int_word; /* 0x0c0 */ | 222 | __u32 io_int_word; /* 0x00c0 */ |
234 | __u8 pad3[0xc8-0xc4]; /* 0x0c4 */ | 223 | __u8 pad_0x00c4[0x00c8-0x00c4]; /* 0x00c4 */ |
235 | __u32 stfl_fac_list; /* 0x0c8 */ | 224 | __u32 stfl_fac_list; /* 0x00c8 */ |
236 | __u8 pad4[0xd4-0xcc]; /* 0x0cc */ | 225 | __u8 pad_0x00cc[0x00d4-0x00cc]; /* 0x00cc */ |
237 | __u32 extended_save_area_addr; /* 0x0d4 */ | 226 | __u32 extended_save_area_addr; /* 0x00d4 */ |
238 | __u32 cpu_timer_save_area[2]; /* 0x0d8 */ | 227 | __u32 cpu_timer_save_area[2]; /* 0x00d8 */ |
239 | __u32 clock_comp_save_area[2]; /* 0x0e0 */ | 228 | __u32 clock_comp_save_area[2]; /* 0x00e0 */ |
240 | __u32 mcck_interruption_code[2]; /* 0x0e8 */ | 229 | __u32 mcck_interruption_code[2]; /* 0x00e8 */ |
241 | __u8 pad5[0xf4-0xf0]; /* 0x0f0 */ | 230 | __u8 pad_0x00f0[0x00f4-0x00f0]; /* 0x00f0 */ |
242 | __u32 external_damage_code; /* 0x0f4 */ | 231 | __u32 external_damage_code; /* 0x00f4 */ |
243 | __u32 failing_storage_address; /* 0x0f8 */ | 232 | __u32 failing_storage_address; /* 0x00f8 */ |
244 | __u8 pad6[0x100-0xfc]; /* 0x0fc */ | 233 | __u8 pad_0x00fc[0x0100-0x00fc]; /* 0x00fc */ |
245 | __u32 st_status_fixed_logout[4];/* 0x100 */ | 234 | __u32 st_status_fixed_logout[4]; /* 0x0100 */ |
246 | __u8 pad7[0x120-0x110]; /* 0x110 */ | 235 | __u8 pad_0x0110[0x0120-0x0110]; /* 0x0110 */ |
247 | __u32 access_regs_save_area[16];/* 0x120 */ | 236 | |
248 | __u32 floating_pt_save_area[8]; /* 0x160 */ | 237 | /* CPU register save area: defined by architecture */ |
249 | __u32 gpregs_save_area[16]; /* 0x180 */ | 238 | __u32 access_regs_save_area[16]; /* 0x0120 */ |
250 | __u32 cregs_save_area[16]; /* 0x1c0 */ | 239 | __u32 floating_pt_save_area[8]; /* 0x0160 */ |
251 | 240 | __u32 gpregs_save_area[16]; /* 0x0180 */ | |
252 | psw_t return_psw; /* 0x200 */ | 241 | __u32 cregs_save_area[16]; /* 0x01c0 */ |
253 | __u8 irb[64]; /* 0x208 */ | 242 | |
254 | __u64 sync_enter_timer; /* 0x248 */ | 243 | /* Return psws. */ |
255 | __u64 async_enter_timer; /* 0x250 */ | 244 | __u32 save_area[16]; /* 0x0200 */ |
256 | __u64 exit_timer; /* 0x258 */ | 245 | psw_t return_psw; /* 0x0240 */ |
257 | __u64 user_timer; /* 0x260 */ | 246 | psw_t return_mcck_psw; /* 0x0248 */ |
258 | __u64 system_timer; /* 0x268 */ | 247 | |
259 | __u64 steal_timer; /* 0x270 */ | 248 | /* CPU time accounting values */ |
260 | __u64 last_update_timer; /* 0x278 */ | 249 | __u64 sync_enter_timer; /* 0x0250 */ |
261 | __u64 last_update_clock; /* 0x280 */ | 250 | __u64 async_enter_timer; /* 0x0258 */ |
262 | psw_t return_mcck_psw; /* 0x288 */ | 251 | __u64 exit_timer; /* 0x0260 */ |
263 | __u8 pad8[0xc00-0x290]; /* 0x290 */ | 252 | __u64 user_timer; /* 0x0268 */ |
264 | 253 | __u64 system_timer; /* 0x0270 */ | |
265 | /* System info area */ | 254 | __u64 steal_timer; /* 0x0278 */ |
266 | __u32 save_area[16]; /* 0xc00 */ | 255 | __u64 last_update_timer; /* 0x0280 */ |
267 | __u32 kernel_stack; /* 0xc40 */ | 256 | __u64 last_update_clock; /* 0x0288 */ |
268 | __u32 thread_info; /* 0xc44 */ | 257 | |
269 | __u32 async_stack; /* 0xc48 */ | 258 | /* Current process. */ |
270 | __u32 kernel_asce; /* 0xc4c */ | 259 | __u32 current_task; /* 0x0290 */ |
271 | __u32 user_asce; /* 0xc50 */ | 260 | __u32 thread_info; /* 0x0294 */ |
272 | __u32 panic_stack; /* 0xc54 */ | 261 | __u32 kernel_stack; /* 0x0298 */ |
273 | __u32 user_exec_asce; /* 0xc58 */ | 262 | |
274 | __u8 pad10[0xc60-0xc5c]; /* 0xc5c */ | 263 | /* Interrupt and panic stack. */ |
275 | /* entry.S sensitive area start */ | 264 | __u32 async_stack; /* 0x029c */ |
276 | struct cpuinfo_S390 cpu_data; /* 0xc60 */ | 265 | __u32 panic_stack; /* 0x02a0 */ |
277 | __u32 ipl_device; /* 0xc7c */ | 266 | |
278 | /* entry.S sensitive area end */ | 267 | /* Address space pointer. */ |
279 | 268 | __u32 kernel_asce; /* 0x02a4 */ | |
280 | /* SMP info area: defined by DJB */ | 269 | __u32 user_asce; /* 0x02a8 */ |
281 | __u64 clock_comparator; /* 0xc80 */ | 270 | __u32 user_exec_asce; /* 0x02ac */ |
282 | __u32 ext_call_fast; /* 0xc88 */ | 271 | |
283 | __u32 percpu_offset; /* 0xc8c */ | 272 | /* SMP info area */ |
284 | __u32 current_task; /* 0xc90 */ | 273 | cpuid_t cpu_id; /* 0x02b0 */ |
285 | __u32 softirq_pending; /* 0xc94 */ | 274 | __u32 cpu_nr; /* 0x02b8 */ |
286 | __u64 int_clock; /* 0xc98 */ | 275 | __u32 softirq_pending; /* 0x02bc */ |
287 | __u8 pad11[0xe00-0xca0]; /* 0xca0 */ | 276 | __u32 percpu_offset; /* 0x02c0 */ |
288 | 277 | __u32 ext_call_fast; /* 0x02c4 */ | |
289 | /* 0xe00 is used as indicator for dump tools */ | 278 | __u64 int_clock; /* 0x02c8 */ |
290 | /* whether the kernel died with panic() or not */ | 279 | __u64 clock_comparator; /* 0x02d0 */ |
291 | __u32 panic_magic; /* 0xe00 */ | 280 | __u8 pad_0x02d8[0x0300-0x02d8]; /* 0x02d8 */ |
292 | 281 | ||
293 | /* Align to the top 1k of prefix area */ | 282 | /* Interrupt response block */ |
294 | __u8 pad12[0x1000-0xe04]; /* 0xe04 */ | 283 | __u8 irb[64]; /* 0x0300 */ |
284 | |||
285 | __u8 pad_0x0400[0x0e00-0x0400]; /* 0x0400 */ | ||
286 | |||
287 | /* | ||
288 | * 0xe00 contains the address of the IPL Parameter Information | ||
289 | * block. Dump tools need IPIB for IPL after dump. | ||
290 | * Note: do not change the position of any fields in 0x0e00-0x0f00 | ||
291 | */ | ||
292 | __u32 ipib; /* 0x0e00 */ | ||
293 | __u32 ipib_checksum; /* 0x0e04 */ | ||
294 | |||
295 | /* Align to the top 1k of prefix area */ | ||
296 | __u8 pad_0x0e08[0x1000-0x0e08]; /* 0x0e08 */ | ||
295 | #else /* !__s390x__ */ | 297 | #else /* !__s390x__ */ |
296 | /* prefix area: defined by architecture */ | 298 | /* 0x0000 - 0x01ff: defined by architecture */ |
297 | __u32 ccw1[2]; /* 0x000 */ | 299 | __u32 ccw1[2]; /* 0x0000 */ |
298 | __u32 ccw2[4]; /* 0x008 */ | 300 | __u32 ccw2[4]; /* 0x0008 */ |
299 | __u8 pad1[0x80-0x18]; /* 0x018 */ | 301 | __u8 pad_0x0018[0x0080-0x0018]; /* 0x0018 */ |
300 | __u32 ext_params; /* 0x080 */ | 302 | __u32 ext_params; /* 0x0080 */ |
301 | __u16 cpu_addr; /* 0x084 */ | 303 | __u16 cpu_addr; /* 0x0084 */ |
302 | __u16 ext_int_code; /* 0x086 */ | 304 | __u16 ext_int_code; /* 0x0086 */ |
303 | __u16 svc_ilc; /* 0x088 */ | 305 | __u16 svc_ilc; /* 0x0088 */ |
304 | __u16 svc_code; /* 0x08a */ | 306 | __u16 svc_code; /* 0x008a */ |
305 | __u16 pgm_ilc; /* 0x08c */ | 307 | __u16 pgm_ilc; /* 0x008c */ |
306 | __u16 pgm_code; /* 0x08e */ | 308 | __u16 pgm_code; /* 0x008e */ |
307 | __u32 data_exc_code; /* 0x090 */ | 309 | __u32 data_exc_code; /* 0x0090 */ |
308 | __u16 mon_class_num; /* 0x094 */ | 310 | __u16 mon_class_num; /* 0x0094 */ |
309 | __u16 per_perc_atmid; /* 0x096 */ | 311 | __u16 per_perc_atmid; /* 0x0096 */ |
310 | addr_t per_address; /* 0x098 */ | 312 | addr_t per_address; /* 0x0098 */ |
311 | __u8 exc_access_id; /* 0x0a0 */ | 313 | __u8 exc_access_id; /* 0x00a0 */ |
312 | __u8 per_access_id; /* 0x0a1 */ | 314 | __u8 per_access_id; /* 0x00a1 */ |
313 | __u8 op_access_id; /* 0x0a2 */ | 315 | __u8 op_access_id; /* 0x00a2 */ |
314 | __u8 ar_access_id; /* 0x0a3 */ | 316 | __u8 ar_access_id; /* 0x00a3 */ |
315 | __u8 pad2[0xA8-0xA4]; /* 0x0a4 */ | 317 | __u8 pad_0x00a4[0x00a8-0x00a4]; /* 0x00a4 */ |
316 | addr_t trans_exc_code; /* 0x0A0 */ | 318 | addr_t trans_exc_code; /* 0x00a8 */ |
317 | addr_t monitor_code; /* 0x09c */ | 319 | addr_t monitor_code; /* 0x00b0 */ |
318 | __u16 subchannel_id; /* 0x0b8 */ | 320 | __u16 subchannel_id; /* 0x00b8 */ |
319 | __u16 subchannel_nr; /* 0x0ba */ | 321 | __u16 subchannel_nr; /* 0x00ba */ |
320 | __u32 io_int_parm; /* 0x0bc */ | 322 | __u32 io_int_parm; /* 0x00bc */ |
321 | __u32 io_int_word; /* 0x0c0 */ | 323 | __u32 io_int_word; /* 0x00c0 */ |
322 | __u8 pad3[0xc8-0xc4]; /* 0x0c4 */ | 324 | __u8 pad_0x00c4[0x00c8-0x00c4]; /* 0x00c4 */ |
323 | __u32 stfl_fac_list; /* 0x0c8 */ | 325 | __u32 stfl_fac_list; /* 0x00c8 */ |
324 | __u8 pad4[0xe8-0xcc]; /* 0x0cc */ | 326 | __u8 pad_0x00cc[0x00e8-0x00cc]; /* 0x00cc */ |
325 | __u32 mcck_interruption_code[2]; /* 0x0e8 */ | 327 | __u32 mcck_interruption_code[2]; /* 0x00e8 */ |
326 | __u8 pad5[0xf4-0xf0]; /* 0x0f0 */ | 328 | __u8 pad_0x00f0[0x00f4-0x00f0]; /* 0x00f0 */ |
327 | __u32 external_damage_code; /* 0x0f4 */ | 329 | __u32 external_damage_code; /* 0x00f4 */ |
328 | addr_t failing_storage_address; /* 0x0f8 */ | 330 | addr_t failing_storage_address; /* 0x00f8 */ |
329 | __u8 pad6[0x120-0x100]; /* 0x100 */ | 331 | __u8 pad_0x0100[0x0120-0x0100]; /* 0x0100 */ |
330 | psw_t restart_old_psw; /* 0x120 */ | 332 | psw_t restart_old_psw; /* 0x0120 */ |
331 | psw_t external_old_psw; /* 0x130 */ | 333 | psw_t external_old_psw; /* 0x0130 */ |
332 | psw_t svc_old_psw; /* 0x140 */ | 334 | psw_t svc_old_psw; /* 0x0140 */ |
333 | psw_t program_old_psw; /* 0x150 */ | 335 | psw_t program_old_psw; /* 0x0150 */ |
334 | psw_t mcck_old_psw; /* 0x160 */ | 336 | psw_t mcck_old_psw; /* 0x0160 */ |
335 | psw_t io_old_psw; /* 0x170 */ | 337 | psw_t io_old_psw; /* 0x0170 */ |
336 | __u8 pad7[0x1a0-0x180]; /* 0x180 */ | 338 | __u8 pad_0x0180[0x01a0-0x0180]; /* 0x0180 */ |
337 | psw_t restart_psw; /* 0x1a0 */ | 339 | psw_t restart_psw; /* 0x01a0 */ |
338 | psw_t external_new_psw; /* 0x1b0 */ | 340 | psw_t external_new_psw; /* 0x01b0 */ |
339 | psw_t svc_new_psw; /* 0x1c0 */ | 341 | psw_t svc_new_psw; /* 0x01c0 */ |
340 | psw_t program_new_psw; /* 0x1d0 */ | 342 | psw_t program_new_psw; /* 0x01d0 */ |
341 | psw_t mcck_new_psw; /* 0x1e0 */ | 343 | psw_t mcck_new_psw; /* 0x01e0 */ |
342 | psw_t io_new_psw; /* 0x1f0 */ | 344 | psw_t io_new_psw; /* 0x01f0 */ |
343 | psw_t return_psw; /* 0x200 */ | 345 | |
344 | __u8 irb[64]; /* 0x210 */ | 346 | /* Entry/exit save area & return psws. */ |
345 | __u64 sync_enter_timer; /* 0x250 */ | 347 | __u64 save_area[16]; /* 0x0200 */ |
346 | __u64 async_enter_timer; /* 0x258 */ | 348 | psw_t return_psw; /* 0x0280 */ |
347 | __u64 exit_timer; /* 0x260 */ | 349 | psw_t return_mcck_psw; /* 0x0290 */ |
348 | __u64 user_timer; /* 0x268 */ | 350 | |
349 | __u64 system_timer; /* 0x270 */ | 351 | /* CPU accounting and timing values. */ |
350 | __u64 steal_timer; /* 0x278 */ | 352 | __u64 sync_enter_timer; /* 0x02a0 */ |
351 | __u64 last_update_timer; /* 0x280 */ | 353 | __u64 async_enter_timer; /* 0x02a8 */ |
352 | __u64 last_update_clock; /* 0x288 */ | 354 | __u64 exit_timer; /* 0x02b0 */ |
353 | psw_t return_mcck_psw; /* 0x290 */ | 355 | __u64 user_timer; /* 0x02b8 */ |
354 | __u8 pad8[0xc00-0x2a0]; /* 0x2a0 */ | 356 | __u64 system_timer; /* 0x02c0 */ |
355 | /* System info area */ | 357 | __u64 steal_timer; /* 0x02c8 */ |
356 | __u64 save_area[16]; /* 0xc00 */ | 358 | __u64 last_update_timer; /* 0x02d0 */ |
357 | __u8 pad9[0xd40-0xc80]; /* 0xc80 */ | 359 | __u64 last_update_clock; /* 0x02d8 */ |
358 | __u64 kernel_stack; /* 0xd40 */ | 360 | |
359 | __u64 thread_info; /* 0xd48 */ | 361 | /* Current process. */ |
360 | __u64 async_stack; /* 0xd50 */ | 362 | __u64 current_task; /* 0x02e0 */ |
361 | __u64 kernel_asce; /* 0xd58 */ | 363 | __u64 thread_info; /* 0x02e8 */ |
362 | __u64 user_asce; /* 0xd60 */ | 364 | __u64 kernel_stack; /* 0x02f0 */ |
363 | __u64 panic_stack; /* 0xd68 */ | 365 | |
364 | __u64 user_exec_asce; /* 0xd70 */ | 366 | /* Interrupt and panic stack. */ |
365 | __u8 pad10[0xd80-0xd78]; /* 0xd78 */ | 367 | __u64 async_stack; /* 0x02f8 */ |
366 | /* entry.S sensitive area start */ | 368 | __u64 panic_stack; /* 0x0300 */ |
367 | struct cpuinfo_S390 cpu_data; /* 0xd80 */ | 369 | |
368 | __u32 ipl_device; /* 0xdb8 */ | 370 | /* Address space pointer. */ |
369 | __u32 pad11; /* 0xdbc */ | 371 | __u64 kernel_asce; /* 0x0308 */ |
370 | /* entry.S sensitive area end */ | 372 | __u64 user_asce; /* 0x0310 */ |
371 | 373 | __u64 user_exec_asce; /* 0x0318 */ | |
372 | /* SMP info area: defined by DJB */ | 374 | |
373 | __u64 clock_comparator; /* 0xdc0 */ | 375 | /* SMP info area */ |
374 | __u64 ext_call_fast; /* 0xdc8 */ | 376 | cpuid_t cpu_id; /* 0x0320 */ |
375 | __u64 percpu_offset; /* 0xdd0 */ | 377 | __u32 cpu_nr; /* 0x0328 */ |
376 | __u64 current_task; /* 0xdd8 */ | 378 | __u32 softirq_pending; /* 0x032c */ |
377 | __u32 softirq_pending; /* 0xde0 */ | 379 | __u64 percpu_offset; /* 0x0330 */ |
378 | __u32 pad_0x0de4; /* 0xde4 */ | 380 | __u64 ext_call_fast; /* 0x0338 */ |
379 | __u64 int_clock; /* 0xde8 */ | 381 | __u64 int_clock; /* 0x0340 */ |
380 | __u8 pad12[0xe00-0xdf0]; /* 0xdf0 */ | 382 | __u64 clock_comparator; /* 0x0348 */ |
381 | 383 | __u64 vdso_per_cpu_data; /* 0x0350 */ | |
382 | /* 0xe00 is used as indicator for dump tools */ | 384 | __u8 pad_0x0358[0x0380-0x0358]; /* 0x0358 */ |
383 | /* whether the kernel died with panic() or not */ | 385 | |
384 | __u32 panic_magic; /* 0xe00 */ | 386 | /* Interrupt response block. */ |
387 | __u8 irb[64]; /* 0x0380 */ | ||
385 | 388 | ||
386 | /* Per cpu primary space access list */ | 389 | /* Per cpu primary space access list */ |
387 | __u8 pad_0xe04[0xe38-0xe04]; /* 0xe04 */ | 390 | __u32 paste[16]; /* 0x03c0 */ |
388 | __u64 vdso_per_cpu_data; /* 0xe38 */ | 391 | |
389 | __u32 paste[16]; /* 0xe40 */ | 392 | __u8 pad_0x0400[0x0e00-0x0400]; /* 0x0400 */ |
390 | 393 | ||
391 | __u8 pad13[0x11b8-0xe80]; /* 0xe80 */ | 394 | /* |
392 | 395 | * 0xe00 contains the address of the IPL Parameter Information | |
393 | /* 64 bit extparam used for pfault, diag 250 etc */ | 396 | * block. Dump tools need IPIB for IPL after dump. |
394 | __u64 ext_params2; /* 0x11B8 */ | 397 | * Note: do not change the position of any fields in 0x0e00-0x0f00 |
395 | 398 | */ | |
396 | __u8 pad14[0x1200-0x11C0]; /* 0x11C0 */ | 399 | __u64 ipib; /* 0x0e00 */ |
397 | 400 | __u32 ipib_checksum; /* 0x0e08 */ | |
398 | /* System info area */ | 401 | __u8 pad_0x0e0c[0x11b8-0x0e0c]; /* 0x0e0c */ |
399 | 402 | ||
400 | __u64 floating_pt_save_area[16]; /* 0x1200 */ | 403 | /* 64 bit extparam used for pfault/diag 250: defined by architecture */ |
401 | __u64 gpregs_save_area[16]; /* 0x1280 */ | 404 | __u64 ext_params2; /* 0x11B8 */ |
402 | __u32 st_status_fixed_logout[4]; /* 0x1300 */ | 405 | __u8 pad_0x11c0[0x1200-0x11C0]; /* 0x11C0 */ |
403 | __u8 pad15[0x1318-0x1310]; /* 0x1310 */ | 406 | |
404 | __u32 prefixreg_save_area; /* 0x1318 */ | 407 | /* CPU register save area: defined by architecture */ |
405 | __u32 fpt_creg_save_area; /* 0x131c */ | 408 | __u64 floating_pt_save_area[16]; /* 0x1200 */ |
406 | __u8 pad16[0x1324-0x1320]; /* 0x1320 */ | 409 | __u64 gpregs_save_area[16]; /* 0x1280 */ |
407 | __u32 tod_progreg_save_area; /* 0x1324 */ | 410 | __u32 st_status_fixed_logout[4]; /* 0x1300 */ |
408 | __u32 cpu_timer_save_area[2]; /* 0x1328 */ | 411 | __u8 pad_0x1310[0x1318-0x1310]; /* 0x1310 */ |
409 | __u32 clock_comp_save_area[2]; /* 0x1330 */ | 412 | __u32 prefixreg_save_area; /* 0x1318 */ |
410 | __u8 pad17[0x1340-0x1338]; /* 0x1338 */ | 413 | __u32 fpt_creg_save_area; /* 0x131c */ |
411 | __u32 access_regs_save_area[16]; /* 0x1340 */ | 414 | __u8 pad_0x1320[0x1324-0x1320]; /* 0x1320 */ |
412 | __u64 cregs_save_area[16]; /* 0x1380 */ | 415 | __u32 tod_progreg_save_area; /* 0x1324 */ |
416 | __u32 cpu_timer_save_area[2]; /* 0x1328 */ | ||
417 | __u32 clock_comp_save_area[2]; /* 0x1330 */ | ||
418 | __u8 pad_0x1338[0x1340-0x1338]; /* 0x1338 */ | ||
419 | __u32 access_regs_save_area[16]; /* 0x1340 */ | ||
420 | __u64 cregs_save_area[16]; /* 0x1380 */ | ||
413 | 421 | ||
414 | /* align to the top of the prefix area */ | 422 | /* align to the top of the prefix area */ |
415 | 423 | __u8 pad_0x1400[0x2000-0x1400]; /* 0x1400 */ | |
416 | __u8 pad18[0x2000-0x1400]; /* 0x1400 */ | ||
417 | #endif /* !__s390x__ */ | 424 | #endif /* !__s390x__ */ |
418 | } __attribute__((packed)); /* End structure*/ | 425 | } __attribute__((packed)); /* End structure*/ |
419 | 426 | ||
@@ -433,8 +440,6 @@ static inline __u32 store_prefix(void) | |||
433 | return address; | 440 | return address; |
434 | } | 441 | } |
435 | 442 | ||
436 | #define __PANIC_MAGIC 0xDEADC0DE | ||
437 | |||
438 | #endif | 443 | #endif |
439 | 444 | ||
440 | #endif | 445 | #endif |
diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h index 28ec870655af..fc7edd6f41b6 100644 --- a/arch/s390/include/asm/mmu_context.h +++ b/arch/s390/include/asm/mmu_context.h | |||
@@ -74,7 +74,7 @@ static inline void update_mm(struct mm_struct *mm, struct task_struct *tsk) | |||
74 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | 74 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, |
75 | struct task_struct *tsk) | 75 | struct task_struct *tsk) |
76 | { | 76 | { |
77 | cpu_set(smp_processor_id(), next->cpu_vm_mask); | 77 | cpumask_set_cpu(smp_processor_id(), mm_cpumask(next)); |
78 | update_mm(next, tsk); | 78 | update_mm(next, tsk); |
79 | } | 79 | } |
80 | 80 | ||
diff --git a/arch/s390/include/asm/nmi.h b/arch/s390/include/asm/nmi.h new file mode 100644 index 000000000000..f4b60441adca --- /dev/null +++ b/arch/s390/include/asm/nmi.h | |||
@@ -0,0 +1,66 @@ | |||
1 | /* | ||
2 | * Machine check handler definitions | ||
3 | * | ||
4 | * Copyright IBM Corp. 2000,2009 | ||
5 | * Author(s): Ingo Adlung <adlung@de.ibm.com>, | ||
6 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
7 | * Cornelia Huck <cornelia.huck@de.ibm.com>, | ||
8 | * Heiko Carstens <heiko.carstens@de.ibm.com>, | ||
9 | */ | ||
10 | |||
11 | #ifndef _ASM_S390_NMI_H | ||
12 | #define _ASM_S390_NMI_H | ||
13 | |||
14 | #include <linux/types.h> | ||
15 | |||
16 | struct mci { | ||
17 | __u32 sd : 1; /* 00 system damage */ | ||
18 | __u32 pd : 1; /* 01 instruction-processing damage */ | ||
19 | __u32 sr : 1; /* 02 system recovery */ | ||
20 | __u32 : 1; /* 03 */ | ||
21 | __u32 cd : 1; /* 04 timing-facility damage */ | ||
22 | __u32 ed : 1; /* 05 external damage */ | ||
23 | __u32 : 1; /* 06 */ | ||
24 | __u32 dg : 1; /* 07 degradation */ | ||
25 | __u32 w : 1; /* 08 warning pending */ | ||
26 | __u32 cp : 1; /* 09 channel-report pending */ | ||
27 | __u32 sp : 1; /* 10 service-processor damage */ | ||
28 | __u32 ck : 1; /* 11 channel-subsystem damage */ | ||
29 | __u32 : 2; /* 12-13 */ | ||
30 | __u32 b : 1; /* 14 backed up */ | ||
31 | __u32 : 1; /* 15 */ | ||
32 | __u32 se : 1; /* 16 storage error uncorrected */ | ||
33 | __u32 sc : 1; /* 17 storage error corrected */ | ||
34 | __u32 ke : 1; /* 18 storage-key error uncorrected */ | ||
35 | __u32 ds : 1; /* 19 storage degradation */ | ||
36 | __u32 wp : 1; /* 20 psw mwp validity */ | ||
37 | __u32 ms : 1; /* 21 psw mask and key validity */ | ||
38 | __u32 pm : 1; /* 22 psw program mask and cc validity */ | ||
39 | __u32 ia : 1; /* 23 psw instruction address validity */ | ||
40 | __u32 fa : 1; /* 24 failing storage address validity */ | ||
41 | __u32 : 1; /* 25 */ | ||
42 | __u32 ec : 1; /* 26 external damage code validity */ | ||
43 | __u32 fp : 1; /* 27 floating point register validity */ | ||
44 | __u32 gr : 1; /* 28 general register validity */ | ||
45 | __u32 cr : 1; /* 29 control register validity */ | ||
46 | __u32 : 1; /* 30 */ | ||
47 | __u32 st : 1; /* 31 storage logical validity */ | ||
48 | __u32 ie : 1; /* 32 indirect storage error */ | ||
49 | __u32 ar : 1; /* 33 access register validity */ | ||
50 | __u32 da : 1; /* 34 delayed access exception */ | ||
51 | __u32 : 7; /* 35-41 */ | ||
52 | __u32 pr : 1; /* 42 tod programmable register validity */ | ||
53 | __u32 fc : 1; /* 43 fp control register validity */ | ||
54 | __u32 ap : 1; /* 44 ancillary report */ | ||
55 | __u32 : 1; /* 45 */ | ||
56 | __u32 ct : 1; /* 46 cpu timer validity */ | ||
57 | __u32 cc : 1; /* 47 clock comparator validity */ | ||
58 | __u32 : 16; /* 47-63 */ | ||
59 | }; | ||
60 | |||
61 | struct pt_regs; | ||
62 | |||
63 | extern void s390_handle_mcck(void); | ||
64 | extern void s390_do_machine_check(struct pt_regs *regs); | ||
65 | |||
66 | #endif /* _ASM_S390_NMI_H */ | ||
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index db4523fe38ac..61862b3ac794 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h | |||
@@ -42,22 +42,8 @@ static inline void get_cpu_id(cpuid_t *ptr) | |||
42 | asm volatile("stidp 0(%1)" : "=m" (*ptr) : "a" (ptr)); | 42 | asm volatile("stidp 0(%1)" : "=m" (*ptr) : "a" (ptr)); |
43 | } | 43 | } |
44 | 44 | ||
45 | struct cpuinfo_S390 | ||
46 | { | ||
47 | cpuid_t cpu_id; | ||
48 | __u16 cpu_addr; | ||
49 | __u16 cpu_nr; | ||
50 | unsigned long loops_per_jiffy; | ||
51 | unsigned long *pgd_quick; | ||
52 | #ifdef __s390x__ | ||
53 | unsigned long *pmd_quick; | ||
54 | #endif /* __s390x__ */ | ||
55 | unsigned long *pte_quick; | ||
56 | unsigned long pgtable_cache_sz; | ||
57 | }; | ||
58 | |||
59 | extern void s390_adjust_jiffies(void); | 45 | extern void s390_adjust_jiffies(void); |
60 | extern void print_cpu_info(struct cpuinfo_S390 *); | 46 | extern void print_cpu_info(void); |
61 | extern int get_cpu_capability(unsigned int *); | 47 | extern int get_cpu_capability(unsigned int *); |
62 | 48 | ||
63 | /* | 49 | /* |
diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index 8920025c3c02..f1b051630c50 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h | |||
@@ -172,6 +172,8 @@ | |||
172 | #define NUM_CRS 16 | 172 | #define NUM_CRS 16 |
173 | #define NUM_ACRS 16 | 173 | #define NUM_ACRS 16 |
174 | 174 | ||
175 | #define NUM_CR_WORDS 3 | ||
176 | |||
175 | #define FPR_SIZE 8 | 177 | #define FPR_SIZE 8 |
176 | #define FPC_SIZE 4 | 178 | #define FPC_SIZE 4 |
177 | #define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */ | 179 | #define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */ |
@@ -334,7 +336,7 @@ struct pt_regs | |||
334 | */ | 336 | */ |
335 | typedef struct | 337 | typedef struct |
336 | { | 338 | { |
337 | unsigned long cr[3]; | 339 | unsigned long cr[NUM_CR_WORDS]; |
338 | } per_cr_words; | 340 | } per_cr_words; |
339 | 341 | ||
340 | #define PER_EM_MASK 0xE8000000UL | 342 | #define PER_EM_MASK 0xE8000000UL |
diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h index 27fc1746de15..402d6dcf0d26 100644 --- a/arch/s390/include/asm/qdio.h +++ b/arch/s390/include/asm/qdio.h | |||
@@ -314,6 +314,7 @@ typedef void qdio_handler_t(struct ccw_device *, unsigned int, int, | |||
314 | int, int, unsigned long); | 314 | int, int, unsigned long); |
315 | 315 | ||
316 | /* qdio errors reported to the upper-layer program */ | 316 | /* qdio errors reported to the upper-layer program */ |
317 | #define QDIO_ERROR_SIGA_TARGET 0x02 | ||
317 | #define QDIO_ERROR_SIGA_ACCESS_EXCEPTION 0x10 | 318 | #define QDIO_ERROR_SIGA_ACCESS_EXCEPTION 0x10 |
318 | #define QDIO_ERROR_SIGA_BUSY 0x20 | 319 | #define QDIO_ERROR_SIGA_BUSY 0x20 |
319 | #define QDIO_ERROR_ACTIVATE_CHECK_CONDITION 0x40 | 320 | #define QDIO_ERROR_ACTIVATE_CHECK_CONDITION 0x40 |
diff --git a/arch/s390/include/asm/smp.h b/arch/s390/include/asm/smp.h index 024b91e06239..2009158a4502 100644 --- a/arch/s390/include/asm/smp.h +++ b/arch/s390/include/asm/smp.h | |||
@@ -50,12 +50,7 @@ extern void machine_power_off_smp(void); | |||
50 | 50 | ||
51 | #define PROC_CHANGE_PENALTY 20 /* Schedule penalty */ | 51 | #define PROC_CHANGE_PENALTY 20 /* Schedule penalty */ |
52 | 52 | ||
53 | #define raw_smp_processor_id() (S390_lowcore.cpu_data.cpu_nr) | 53 | #define raw_smp_processor_id() (S390_lowcore.cpu_nr) |
54 | |||
55 | static inline __u16 hard_smp_processor_id(void) | ||
56 | { | ||
57 | return stap(); | ||
58 | } | ||
59 | 54 | ||
60 | /* | 55 | /* |
61 | * returns 1 if cpu is in stopped/check stopped state or not operational | 56 | * returns 1 if cpu is in stopped/check stopped state or not operational |
diff --git a/arch/s390/include/asm/socket.h b/arch/s390/include/asm/socket.h index c786ab623b2d..02330c50241b 100644 --- a/arch/s390/include/asm/socket.h +++ b/arch/s390/include/asm/socket.h | |||
@@ -62,4 +62,7 @@ | |||
62 | 62 | ||
63 | #define SO_MARK 36 | 63 | #define SO_MARK 36 |
64 | 64 | ||
65 | #define SO_TIMESTAMPING 37 | ||
66 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
67 | |||
65 | #endif /* _ASM_SOCKET_H */ | 68 | #endif /* _ASM_SOCKET_H */ |
diff --git a/arch/s390/include/asm/string.h b/arch/s390/include/asm/string.h index d074673a6d9b..cd0241db5a46 100644 --- a/arch/s390/include/asm/string.h +++ b/arch/s390/include/asm/string.h | |||
@@ -100,6 +100,7 @@ static inline char *strcat(char *dst, const char *src) | |||
100 | 100 | ||
101 | static inline char *strcpy(char *dst, const char *src) | 101 | static inline char *strcpy(char *dst, const char *src) |
102 | { | 102 | { |
103 | #if __GNUC__ < 4 | ||
103 | register int r0 asm("0") = 0; | 104 | register int r0 asm("0") = 0; |
104 | char *ret = dst; | 105 | char *ret = dst; |
105 | 106 | ||
@@ -109,10 +110,14 @@ static inline char *strcpy(char *dst, const char *src) | |||
109 | : "+&a" (dst), "+&a" (src) : "d" (r0) | 110 | : "+&a" (dst), "+&a" (src) : "d" (r0) |
110 | : "cc", "memory"); | 111 | : "cc", "memory"); |
111 | return ret; | 112 | return ret; |
113 | #else | ||
114 | return __builtin_strcpy(dst, src); | ||
115 | #endif | ||
112 | } | 116 | } |
113 | 117 | ||
114 | static inline size_t strlen(const char *s) | 118 | static inline size_t strlen(const char *s) |
115 | { | 119 | { |
120 | #if __GNUC__ < 4 | ||
116 | register unsigned long r0 asm("0") = 0; | 121 | register unsigned long r0 asm("0") = 0; |
117 | const char *tmp = s; | 122 | const char *tmp = s; |
118 | 123 | ||
@@ -121,6 +126,9 @@ static inline size_t strlen(const char *s) | |||
121 | " jo 0b" | 126 | " jo 0b" |
122 | : "+d" (r0), "+a" (tmp) : : "cc"); | 127 | : "+d" (r0), "+a" (tmp) : : "cc"); |
123 | return r0 - (unsigned long) s; | 128 | return r0 - (unsigned long) s; |
129 | #else | ||
130 | return __builtin_strlen(s); | ||
131 | #endif | ||
124 | } | 132 | } |
125 | 133 | ||
126 | static inline size_t strnlen(const char * s, size_t n) | 134 | static inline size_t strnlen(const char * s, size_t n) |
@@ -135,7 +143,13 @@ static inline size_t strnlen(const char * s, size_t n) | |||
135 | : "+a" (end), "+a" (tmp) : "d" (r0) : "cc"); | 143 | : "+a" (end), "+a" (tmp) : "d" (r0) : "cc"); |
136 | return end - s; | 144 | return end - s; |
137 | } | 145 | } |
138 | 146 | #else /* IN_ARCH_STRING_C */ | |
147 | void *memchr(const void * s, int c, size_t n); | ||
148 | void *memscan(void *s, int c, size_t n); | ||
149 | char *strcat(char *dst, const char *src); | ||
150 | char *strcpy(char *dst, const char *src); | ||
151 | size_t strlen(const char *s); | ||
152 | size_t strnlen(const char * s, size_t n); | ||
139 | #endif /* !IN_ARCH_STRING_C */ | 153 | #endif /* !IN_ARCH_STRING_C */ |
140 | 154 | ||
141 | #endif /* __KERNEL__ */ | 155 | #endif /* __KERNEL__ */ |
diff --git a/arch/s390/include/asm/sysinfo.h b/arch/s390/include/asm/sysinfo.h index ad93212d9e16..9d70057d828c 100644 --- a/arch/s390/include/asm/sysinfo.h +++ b/arch/s390/include/asm/sysinfo.h | |||
@@ -100,6 +100,7 @@ struct sysinfo_3_2_2 { | |||
100 | char reserved_1[24]; | 100 | char reserved_1[24]; |
101 | 101 | ||
102 | } vm[8]; | 102 | } vm[8]; |
103 | char reserved_544[3552]; | ||
103 | }; | 104 | }; |
104 | 105 | ||
105 | static inline int stsi(void *sysinfo, int fc, int sel1, int sel2) | 106 | static inline int stsi(void *sysinfo, int fc, int sel1, int sel2) |
diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h index d60394b9745e..304cffa623e1 100644 --- a/arch/s390/include/asm/tlbflush.h +++ b/arch/s390/include/asm/tlbflush.h | |||
@@ -51,7 +51,7 @@ static inline void __tlb_flush_full(struct mm_struct *mm) | |||
51 | * If the process only ran on the local cpu, do a local flush. | 51 | * If the process only ran on the local cpu, do a local flush. |
52 | */ | 52 | */ |
53 | local_cpumask = cpumask_of_cpu(smp_processor_id()); | 53 | local_cpumask = cpumask_of_cpu(smp_processor_id()); |
54 | if (cpus_equal(mm->cpu_vm_mask, local_cpumask)) | 54 | if (cpumask_equal(mm_cpumask(mm), &local_cpumask)) |
55 | __tlb_flush_local(); | 55 | __tlb_flush_local(); |
56 | else | 56 | else |
57 | __tlb_flush_global(); | 57 | __tlb_flush_global(); |
@@ -73,7 +73,7 @@ static inline void __tlb_flush_idte(unsigned long asce) | |||
73 | 73 | ||
74 | static inline void __tlb_flush_mm(struct mm_struct * mm) | 74 | static inline void __tlb_flush_mm(struct mm_struct * mm) |
75 | { | 75 | { |
76 | if (unlikely(cpus_empty(mm->cpu_vm_mask))) | 76 | if (unlikely(cpumask_empty(mm_cpumask(mm)))) |
77 | return; | 77 | return; |
78 | /* | 78 | /* |
79 | * If the machine has IDTE we prefer to do a per mm flush | 79 | * If the machine has IDTE we prefer to do a per mm flush |
diff --git a/arch/s390/include/asm/topology.h b/arch/s390/include/asm/topology.h index c979c3b56ab0..5e0ad618dc45 100644 --- a/arch/s390/include/asm/topology.h +++ b/arch/s390/include/asm/topology.h | |||
@@ -5,7 +5,6 @@ | |||
5 | 5 | ||
6 | #define mc_capable() (1) | 6 | #define mc_capable() (1) |
7 | 7 | ||
8 | cpumask_t cpu_coregroup_map(unsigned int cpu); | ||
9 | const struct cpumask *cpu_coregroup_mask(unsigned int cpu); | 8 | const struct cpumask *cpu_coregroup_mask(unsigned int cpu); |
10 | 9 | ||
11 | extern cpumask_t cpu_core_map[NR_CPUS]; | 10 | extern cpumask_t cpu_core_map[NR_CPUS]; |
diff --git a/arch/s390/include/asm/vtoc.h b/arch/s390/include/asm/vtoc.h index 3a5267d90d29..8406a2b3157a 100644 --- a/arch/s390/include/asm/vtoc.h +++ b/arch/s390/include/asm/vtoc.h | |||
@@ -39,7 +39,7 @@ struct vtoc_labeldate | |||
39 | __u16 day; | 39 | __u16 day; |
40 | } __attribute__ ((packed)); | 40 | } __attribute__ ((packed)); |
41 | 41 | ||
42 | struct vtoc_volume_label | 42 | struct vtoc_volume_label_cdl |
43 | { | 43 | { |
44 | char volkey[4]; /* volume key = volume label */ | 44 | char volkey[4]; /* volume key = volume label */ |
45 | char vollbl[4]; /* volume label */ | 45 | char vollbl[4]; /* volume label */ |
@@ -56,6 +56,14 @@ struct vtoc_volume_label | |||
56 | char res3[29]; /* reserved */ | 56 | char res3[29]; /* reserved */ |
57 | } __attribute__ ((packed)); | 57 | } __attribute__ ((packed)); |
58 | 58 | ||
59 | struct vtoc_volume_label_ldl { | ||
60 | char vollbl[4]; /* volume label */ | ||
61 | char volid[6]; /* volume identifier */ | ||
62 | char res3[69]; /* reserved */ | ||
63 | char ldl_version; /* version number, valid for ldl format */ | ||
64 | __u64 formatted_blocks; /* valid when ldl_version >= f2 */ | ||
65 | } __attribute__ ((packed)); | ||
66 | |||
59 | struct vtoc_extent | 67 | struct vtoc_extent |
60 | { | 68 | { |
61 | __u8 typeind; /* extent type indicator */ | 69 | __u8 typeind; /* extent type indicator */ |
@@ -140,7 +148,11 @@ struct vtoc_format4_label | |||
140 | char res2[10]; /* reserved */ | 148 | char res2[10]; /* reserved */ |
141 | __u8 DS4EFLVL; /* extended free-space management level */ | 149 | __u8 DS4EFLVL; /* extended free-space management level */ |
142 | struct vtoc_cchhb DS4EFPTR; /* pointer to extended free-space info */ | 150 | struct vtoc_cchhb DS4EFPTR; /* pointer to extended free-space info */ |
143 | char res3[9]; /* reserved */ | 151 | char res3; /* reserved */ |
152 | __u32 DS4DCYL; /* number of logical cyls */ | ||
153 | char res4[2]; /* reserved */ | ||
154 | __u8 DS4DEVF2; /* device flags */ | ||
155 | char res5; /* reserved */ | ||
144 | } __attribute__ ((packed)); | 156 | } __attribute__ ((packed)); |
145 | 157 | ||
146 | struct vtoc_ds5ext | 158 | struct vtoc_ds5ext |
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 3edc6c6f258b..228e3105ded7 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -17,10 +17,12 @@ CFLAGS_smp.o := -Wno-nonnull | |||
17 | # | 17 | # |
18 | CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' | 18 | CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' |
19 | 19 | ||
20 | CFLAGS_sysinfo.o += -Iinclude/math-emu -Iarch/s390/math-emu -w | ||
21 | |||
20 | obj-y := bitmap.o traps.o time.o process.o base.o early.o setup.o \ | 22 | obj-y := bitmap.o traps.o time.o process.o base.o early.o setup.o \ |
21 | processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ | 23 | processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ |
22 | s390_ext.o debug.o irq.o ipl.o dis.o diag.o mem_detect.o \ | 24 | s390_ext.o debug.o irq.o ipl.o dis.o diag.o mem_detect.o \ |
23 | vdso.o vtime.o | 25 | vdso.o vtime.o sysinfo.o nmi.o |
24 | 26 | ||
25 | obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) | 27 | obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) |
26 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) | 28 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) |
diff --git a/arch/s390/kernel/bitmap.S b/arch/s390/kernel/bitmap.S deleted file mode 100644 index dfb41f946e23..000000000000 --- a/arch/s390/kernel/bitmap.S +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | /* | ||
2 | * arch/s390/kernel/bitmap.S | ||
3 | * Bitmaps for set_bit, clear_bit, test_and_set_bit, ... | ||
4 | * See include/asm-s390/{bitops.h|posix_types.h} for details | ||
5 | * | ||
6 | * S390 version | ||
7 | * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
8 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | ||
9 | */ | ||
10 | |||
11 | .globl _oi_bitmap | ||
12 | _oi_bitmap: | ||
13 | .byte 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 | ||
14 | |||
15 | .globl _ni_bitmap | ||
16 | _ni_bitmap: | ||
17 | .byte 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F | ||
18 | |||
19 | .globl _zb_findmap | ||
20 | _zb_findmap: | ||
21 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
22 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5 | ||
23 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
24 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6 | ||
25 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
26 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5 | ||
27 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
28 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7 | ||
29 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
30 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5 | ||
31 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
32 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6 | ||
33 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
34 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5 | ||
35 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 | ||
36 | .byte 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8 | ||
37 | |||
38 | .globl _sb_findmap | ||
39 | _sb_findmap: | ||
40 | .byte 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
41 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
42 | .byte 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
43 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
44 | .byte 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
45 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
46 | .byte 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
47 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
48 | .byte 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
49 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
50 | .byte 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
51 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
52 | .byte 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
53 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
54 | .byte 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
55 | .byte 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 | ||
56 | |||
diff --git a/arch/s390/kernel/bitmap.c b/arch/s390/kernel/bitmap.c new file mode 100644 index 000000000000..3ae4757b006a --- /dev/null +++ b/arch/s390/kernel/bitmap.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * Bitmaps for set_bit, clear_bit, test_and_set_bit, ... | ||
3 | * See include/asm/{bitops.h|posix_types.h} for details | ||
4 | * | ||
5 | * Copyright IBM Corp. 1999,2009 | ||
6 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
7 | */ | ||
8 | |||
9 | #include <linux/bitops.h> | ||
10 | #include <linux/module.h> | ||
11 | |||
12 | const char _oi_bitmap[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; | ||
13 | EXPORT_SYMBOL(_oi_bitmap); | ||
14 | |||
15 | const char _ni_bitmap[] = { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }; | ||
16 | EXPORT_SYMBOL(_ni_bitmap); | ||
17 | |||
18 | const char _zb_findmap[] = { | ||
19 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
20 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, | ||
21 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
22 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, | ||
23 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
24 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, | ||
25 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
26 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7, | ||
27 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
28 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, | ||
29 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
30 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, | ||
31 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
32 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, | ||
33 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4, | ||
34 | 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8 }; | ||
35 | EXPORT_SYMBOL(_zb_findmap); | ||
36 | |||
37 | const char _sb_findmap[] = { | ||
38 | 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
39 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
40 | 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
41 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
42 | 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
43 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
44 | 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
45 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
46 | 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
47 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
48 | 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
49 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
50 | 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
51 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
52 | 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, | ||
53 | 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0 }; | ||
54 | EXPORT_SYMBOL(_sb_findmap); | ||
diff --git a/arch/s390/kernel/compat_ptrace.h b/arch/s390/kernel/compat_ptrace.h index a2be3a978d5c..123dd660d7fb 100644 --- a/arch/s390/kernel/compat_ptrace.h +++ b/arch/s390/kernel/compat_ptrace.h | |||
@@ -1,10 +1,11 @@ | |||
1 | #ifndef _PTRACE32_H | 1 | #ifndef _PTRACE32_H |
2 | #define _PTRACE32_H | 2 | #define _PTRACE32_H |
3 | 3 | ||
4 | #include <asm/ptrace.h> /* needed for NUM_CR_WORDS */ | ||
4 | #include "compat_linux.h" /* needed for psw_compat_t */ | 5 | #include "compat_linux.h" /* needed for psw_compat_t */ |
5 | 6 | ||
6 | typedef struct { | 7 | typedef struct { |
7 | __u32 cr[3]; | 8 | __u32 cr[NUM_CR_WORDS]; |
8 | } per_cr_words32; | 9 | } per_cr_words32; |
9 | 10 | ||
10 | typedef struct { | 11 | typedef struct { |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 62c706eb0de6..87cf5a79a351 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -252,7 +252,7 @@ sys32_chroot_wrapper: | |||
252 | sys32_ustat_wrapper: | 252 | sys32_ustat_wrapper: |
253 | llgfr %r2,%r2 # dev_t | 253 | llgfr %r2,%r2 # dev_t |
254 | llgtr %r3,%r3 # struct ustat * | 254 | llgtr %r3,%r3 # struct ustat * |
255 | jg sys_ustat | 255 | jg compat_sys_ustat |
256 | 256 | ||
257 | .globl sys32_dup2_wrapper | 257 | .globl sys32_dup2_wrapper |
258 | sys32_dup2_wrapper: | 258 | sys32_dup2_wrapper: |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index ba03fc0a3a56..be8bceaf37d9 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
@@ -603,7 +603,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length, | |||
603 | static int | 603 | static int |
604 | debug_open(struct inode *inode, struct file *file) | 604 | debug_open(struct inode *inode, struct file *file) |
605 | { | 605 | { |
606 | int i = 0, rc = 0; | 606 | int i, rc = 0; |
607 | file_private_info_t *p_info; | 607 | file_private_info_t *p_info; |
608 | debug_info_t *debug_info, *debug_info_snapshot; | 608 | debug_info_t *debug_info, *debug_info_snapshot; |
609 | 609 | ||
@@ -642,8 +642,7 @@ found: | |||
642 | p_info = kmalloc(sizeof(file_private_info_t), | 642 | p_info = kmalloc(sizeof(file_private_info_t), |
643 | GFP_KERNEL); | 643 | GFP_KERNEL); |
644 | if(!p_info){ | 644 | if(!p_info){ |
645 | if(debug_info_snapshot) | 645 | debug_info_free(debug_info_snapshot); |
646 | debug_info_free(debug_info_snapshot); | ||
647 | rc = -ENOMEM; | 646 | rc = -ENOMEM; |
648 | goto out; | 647 | goto out; |
649 | } | 648 | } |
@@ -698,8 +697,7 @@ debug_info_t *debug_register_mode(const char *name, int pages_per_area, | |||
698 | if ((uid != 0) || (gid != 0)) | 697 | if ((uid != 0) || (gid != 0)) |
699 | pr_warning("Root becomes the owner of all s390dbf files " | 698 | pr_warning("Root becomes the owner of all s390dbf files " |
700 | "in sysfs\n"); | 699 | "in sysfs\n"); |
701 | if (!initialized) | 700 | BUG_ON(!initialized); |
702 | BUG(); | ||
703 | mutex_lock(&debug_mutex); | 701 | mutex_lock(&debug_mutex); |
704 | 702 | ||
705 | /* create new debug_info */ | 703 | /* create new debug_info */ |
@@ -1156,7 +1154,6 @@ debug_unregister_view(debug_info_t * id, struct debug_view *view) | |||
1156 | else { | 1154 | else { |
1157 | debugfs_remove(id->debugfs_entries[i]); | 1155 | debugfs_remove(id->debugfs_entries[i]); |
1158 | id->views[i] = NULL; | 1156 | id->views[i] = NULL; |
1159 | rc = 0; | ||
1160 | } | 1157 | } |
1161 | spin_unlock_irqrestore(&id->lock, flags); | 1158 | spin_unlock_irqrestore(&id->lock, flags); |
1162 | out: | 1159 | out: |
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index 2a2ca268b1dd..4d221c81c849 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
@@ -6,6 +6,7 @@ | |||
6 | * Heiko Carstens <heiko.carstens@de.ibm.com> | 6 | * Heiko Carstens <heiko.carstens@de.ibm.com> |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/compiler.h> | ||
9 | #include <linux/init.h> | 10 | #include <linux/init.h> |
10 | #include <linux/errno.h> | 11 | #include <linux/errno.h> |
11 | #include <linux/string.h> | 12 | #include <linux/string.h> |
@@ -20,6 +21,7 @@ | |||
20 | #include <asm/processor.h> | 21 | #include <asm/processor.h> |
21 | #include <asm/sections.h> | 22 | #include <asm/sections.h> |
22 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
24 | #include <asm/sysinfo.h> | ||
23 | #include <asm/cpcmd.h> | 25 | #include <asm/cpcmd.h> |
24 | #include <asm/sclp.h> | 26 | #include <asm/sclp.h> |
25 | #include "entry.h" | 27 | #include "entry.h" |
@@ -173,19 +175,21 @@ static noinline __init void init_kernel_storage_key(void) | |||
173 | page_set_storage_key(init_pfn << PAGE_SHIFT, PAGE_DEFAULT_KEY); | 175 | page_set_storage_key(init_pfn << PAGE_SHIFT, PAGE_DEFAULT_KEY); |
174 | } | 176 | } |
175 | 177 | ||
178 | static __initdata struct sysinfo_3_2_2 vmms __aligned(PAGE_SIZE); | ||
179 | |||
176 | static noinline __init void detect_machine_type(void) | 180 | static noinline __init void detect_machine_type(void) |
177 | { | 181 | { |
178 | struct cpuinfo_S390 *cpuinfo = &S390_lowcore.cpu_data; | 182 | /* No VM information? Looks like LPAR */ |
179 | 183 | if (stsi(&vmms, 3, 2, 2) == -ENOSYS) | |
180 | get_cpu_id(&S390_lowcore.cpu_data.cpu_id); | 184 | return; |
181 | 185 | if (!vmms.count) | |
182 | /* Running under z/VM ? */ | 186 | return; |
183 | if (cpuinfo->cpu_id.version == 0xff) | ||
184 | machine_flags |= MACHINE_FLAG_VM; | ||
185 | 187 | ||
186 | /* Running under KVM ? */ | 188 | /* Running under KVM? If not we assume z/VM */ |
187 | if (cpuinfo->cpu_id.version == 0xfe) | 189 | if (!memcmp(vmms.vm[0].cpi, "\xd2\xe5\xd4", 3)) |
188 | machine_flags |= MACHINE_FLAG_KVM; | 190 | machine_flags |= MACHINE_FLAG_KVM; |
191 | else | ||
192 | machine_flags |= MACHINE_FLAG_VM; | ||
189 | } | 193 | } |
190 | 194 | ||
191 | static __init void early_pgm_check_handler(void) | 195 | static __init void early_pgm_check_handler(void) |
@@ -348,7 +352,6 @@ static void __init setup_boot_command_line(void) | |||
348 | 352 | ||
349 | /* copy arch command line */ | 353 | /* copy arch command line */ |
350 | strlcpy(boot_command_line, COMMAND_LINE, ARCH_COMMAND_LINE_SIZE); | 354 | strlcpy(boot_command_line, COMMAND_LINE, ARCH_COMMAND_LINE_SIZE); |
351 | boot_command_line[ARCH_COMMAND_LINE_SIZE - 1] = 0; | ||
352 | 355 | ||
353 | /* append IPL PARM data to the boot command line */ | 356 | /* append IPL PARM data to the boot command line */ |
354 | if (MACHINE_IS_VM) { | 357 | if (MACHINE_IS_VM) { |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index ec7e35f6055b..1046c2c9f8d1 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -469,6 +469,8 @@ start: | |||
469 | .org 0x10000 | 469 | .org 0x10000 |
470 | startup:basr %r13,0 # get base | 470 | startup:basr %r13,0 # get base |
471 | .LPG0: | 471 | .LPG0: |
472 | xc 0x200(256),0x200 # partially clear lowcore | ||
473 | xc 0x300(256),0x300 | ||
472 | 474 | ||
473 | #ifndef CONFIG_MARCH_G5 | 475 | #ifndef CONFIG_MARCH_G5 |
474 | # check processor version against MARCH_{G5,Z900,Z990,Z9_109,Z10} | 476 | # check processor version against MARCH_{G5,Z900,Z990,Z9_109,Z10} |
diff --git a/arch/s390/kernel/head31.S b/arch/s390/kernel/head31.S index db476d114caa..2ced846065b7 100644 --- a/arch/s390/kernel/head31.S +++ b/arch/s390/kernel/head31.S | |||
@@ -20,7 +20,6 @@ startup_continue: | |||
20 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 20 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
21 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area | 21 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area |
22 | # move IPL device to lowcore | 22 | # move IPL device to lowcore |
23 | mvc __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12) | ||
24 | # | 23 | # |
25 | # Setup stack | 24 | # Setup stack |
26 | # | 25 | # |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index f9f70aa15244..65667b2e65ce 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -86,7 +86,6 @@ startup_continue: | |||
86 | lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 86 | lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
87 | lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area | 87 | lg %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area |
88 | # move IPL device to lowcore | 88 | # move IPL device to lowcore |
89 | mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12) | ||
90 | lghi %r0,__LC_PASTE | 89 | lghi %r0,__LC_PASTE |
91 | stg %r0,__LC_VDSO_PER_CPU | 90 | stg %r0,__LC_VDSO_PER_CPU |
92 | # | 91 | # |
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index 2dcf590faba6..6f3711a0eaaa 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <asm/ebcdic.h> | 23 | #include <asm/ebcdic.h> |
24 | #include <asm/reset.h> | 24 | #include <asm/reset.h> |
25 | #include <asm/sclp.h> | 25 | #include <asm/sclp.h> |
26 | #include <asm/setup.h> | 26 | #include <asm/checksum.h> |
27 | 27 | ||
28 | #define IPL_PARM_BLOCK_VERSION 0 | 28 | #define IPL_PARM_BLOCK_VERSION 0 |
29 | 29 | ||
@@ -56,13 +56,14 @@ struct shutdown_trigger { | |||
56 | }; | 56 | }; |
57 | 57 | ||
58 | /* | 58 | /* |
59 | * Five shutdown action types are supported: | 59 | * The following shutdown action types are supported: |
60 | */ | 60 | */ |
61 | #define SHUTDOWN_ACTION_IPL_STR "ipl" | 61 | #define SHUTDOWN_ACTION_IPL_STR "ipl" |
62 | #define SHUTDOWN_ACTION_REIPL_STR "reipl" | 62 | #define SHUTDOWN_ACTION_REIPL_STR "reipl" |
63 | #define SHUTDOWN_ACTION_DUMP_STR "dump" | 63 | #define SHUTDOWN_ACTION_DUMP_STR "dump" |
64 | #define SHUTDOWN_ACTION_VMCMD_STR "vmcmd" | 64 | #define SHUTDOWN_ACTION_VMCMD_STR "vmcmd" |
65 | #define SHUTDOWN_ACTION_STOP_STR "stop" | 65 | #define SHUTDOWN_ACTION_STOP_STR "stop" |
66 | #define SHUTDOWN_ACTION_DUMP_REIPL_STR "dump_reipl" | ||
66 | 67 | ||
67 | struct shutdown_action { | 68 | struct shutdown_action { |
68 | char *name; | 69 | char *name; |
@@ -146,6 +147,7 @@ static enum ipl_method reipl_method = REIPL_METHOD_DEFAULT; | |||
146 | static struct ipl_parameter_block *reipl_block_fcp; | 147 | static struct ipl_parameter_block *reipl_block_fcp; |
147 | static struct ipl_parameter_block *reipl_block_ccw; | 148 | static struct ipl_parameter_block *reipl_block_ccw; |
148 | static struct ipl_parameter_block *reipl_block_nss; | 149 | static struct ipl_parameter_block *reipl_block_nss; |
150 | static struct ipl_parameter_block *reipl_block_actual; | ||
149 | 151 | ||
150 | static int dump_capabilities = DUMP_TYPE_NONE; | 152 | static int dump_capabilities = DUMP_TYPE_NONE; |
151 | static enum dump_type dump_type = DUMP_TYPE_NONE; | 153 | static enum dump_type dump_type = DUMP_TYPE_NONE; |
@@ -835,6 +837,7 @@ static int reipl_set_type(enum ipl_type type) | |||
835 | reipl_method = REIPL_METHOD_CCW_VM; | 837 | reipl_method = REIPL_METHOD_CCW_VM; |
836 | else | 838 | else |
837 | reipl_method = REIPL_METHOD_CCW_CIO; | 839 | reipl_method = REIPL_METHOD_CCW_CIO; |
840 | reipl_block_actual = reipl_block_ccw; | ||
838 | break; | 841 | break; |
839 | case IPL_TYPE_FCP: | 842 | case IPL_TYPE_FCP: |
840 | if (diag308_set_works) | 843 | if (diag308_set_works) |
@@ -843,6 +846,7 @@ static int reipl_set_type(enum ipl_type type) | |||
843 | reipl_method = REIPL_METHOD_FCP_RO_VM; | 846 | reipl_method = REIPL_METHOD_FCP_RO_VM; |
844 | else | 847 | else |
845 | reipl_method = REIPL_METHOD_FCP_RO_DIAG; | 848 | reipl_method = REIPL_METHOD_FCP_RO_DIAG; |
849 | reipl_block_actual = reipl_block_fcp; | ||
846 | break; | 850 | break; |
847 | case IPL_TYPE_FCP_DUMP: | 851 | case IPL_TYPE_FCP_DUMP: |
848 | reipl_method = REIPL_METHOD_FCP_DUMP; | 852 | reipl_method = REIPL_METHOD_FCP_DUMP; |
@@ -852,6 +856,7 @@ static int reipl_set_type(enum ipl_type type) | |||
852 | reipl_method = REIPL_METHOD_NSS_DIAG; | 856 | reipl_method = REIPL_METHOD_NSS_DIAG; |
853 | else | 857 | else |
854 | reipl_method = REIPL_METHOD_NSS; | 858 | reipl_method = REIPL_METHOD_NSS; |
859 | reipl_block_actual = reipl_block_nss; | ||
855 | break; | 860 | break; |
856 | case IPL_TYPE_UNKNOWN: | 861 | case IPL_TYPE_UNKNOWN: |
857 | reipl_method = REIPL_METHOD_DEFAULT; | 862 | reipl_method = REIPL_METHOD_DEFAULT; |
@@ -960,7 +965,6 @@ static void reipl_run(struct shutdown_trigger *trigger) | |||
960 | diag308(DIAG308_IPL, NULL); | 965 | diag308(DIAG308_IPL, NULL); |
961 | break; | 966 | break; |
962 | case REIPL_METHOD_FCP_DUMP: | 967 | case REIPL_METHOD_FCP_DUMP: |
963 | default: | ||
964 | break; | 968 | break; |
965 | } | 969 | } |
966 | disabled_wait((unsigned long) __builtin_return_address(0)); | 970 | disabled_wait((unsigned long) __builtin_return_address(0)); |
@@ -1069,10 +1073,12 @@ static int __init reipl_fcp_init(void) | |||
1069 | { | 1073 | { |
1070 | int rc; | 1074 | int rc; |
1071 | 1075 | ||
1072 | if ((!diag308_set_works) && (ipl_info.type != IPL_TYPE_FCP)) | 1076 | if (!diag308_set_works) { |
1073 | return 0; | 1077 | if (ipl_info.type == IPL_TYPE_FCP) |
1074 | if ((!diag308_set_works) && (ipl_info.type == IPL_TYPE_FCP)) | 1078 | make_attrs_ro(reipl_fcp_attrs); |
1075 | make_attrs_ro(reipl_fcp_attrs); | 1079 | else |
1080 | return 0; | ||
1081 | } | ||
1076 | 1082 | ||
1077 | reipl_block_fcp = (void *) get_zeroed_page(GFP_KERNEL); | 1083 | reipl_block_fcp = (void *) get_zeroed_page(GFP_KERNEL); |
1078 | if (!reipl_block_fcp) | 1084 | if (!reipl_block_fcp) |
@@ -1253,7 +1259,6 @@ static void dump_run(struct shutdown_trigger *trigger) | |||
1253 | diag308(DIAG308_DUMP, NULL); | 1259 | diag308(DIAG308_DUMP, NULL); |
1254 | break; | 1260 | break; |
1255 | case DUMP_METHOD_NONE: | 1261 | case DUMP_METHOD_NONE: |
1256 | default: | ||
1257 | return; | 1262 | return; |
1258 | } | 1263 | } |
1259 | printk(KERN_EMERG "Dump failed!\n"); | 1264 | printk(KERN_EMERG "Dump failed!\n"); |
@@ -1332,6 +1337,49 @@ static struct shutdown_action __refdata dump_action = { | |||
1332 | .init = dump_init, | 1337 | .init = dump_init, |
1333 | }; | 1338 | }; |
1334 | 1339 | ||
1340 | static void dump_reipl_run(struct shutdown_trigger *trigger) | ||
1341 | { | ||
1342 | preempt_disable(); | ||
1343 | /* | ||
1344 | * Bypass dynamic address translation (DAT) when storing IPL parameter | ||
1345 | * information block address and checksum into the prefix area | ||
1346 | * (corresponding to absolute addresses 0-8191). | ||
1347 | * When enhanced DAT applies and the STE format control in one, | ||
1348 | * the absolute address is formed without prefixing. In this case a | ||
1349 | * normal store (stg/st) into the prefix area would no more match to | ||
1350 | * absolute addresses 0-8191. | ||
1351 | */ | ||
1352 | #ifdef CONFIG_64BIT | ||
1353 | asm volatile("sturg %0,%1" | ||
1354 | :: "a" ((unsigned long) reipl_block_actual), | ||
1355 | "a" (&lowcore_ptr[smp_processor_id()]->ipib)); | ||
1356 | #else | ||
1357 | asm volatile("stura %0,%1" | ||
1358 | :: "a" ((unsigned long) reipl_block_actual), | ||
1359 | "a" (&lowcore_ptr[smp_processor_id()]->ipib)); | ||
1360 | #endif | ||
1361 | asm volatile("stura %0,%1" | ||
1362 | :: "a" (csum_partial(reipl_block_actual, | ||
1363 | reipl_block_actual->hdr.len, 0)), | ||
1364 | "a" (&lowcore_ptr[smp_processor_id()]->ipib_checksum)); | ||
1365 | preempt_enable(); | ||
1366 | dump_run(trigger); | ||
1367 | } | ||
1368 | |||
1369 | static int __init dump_reipl_init(void) | ||
1370 | { | ||
1371 | if (!diag308_set_works) | ||
1372 | return -EOPNOTSUPP; | ||
1373 | else | ||
1374 | return 0; | ||
1375 | } | ||
1376 | |||
1377 | static struct shutdown_action __refdata dump_reipl_action = { | ||
1378 | .name = SHUTDOWN_ACTION_DUMP_REIPL_STR, | ||
1379 | .fn = dump_reipl_run, | ||
1380 | .init = dump_reipl_init, | ||
1381 | }; | ||
1382 | |||
1335 | /* | 1383 | /* |
1336 | * vmcmd shutdown action: Trigger vm command on shutdown. | 1384 | * vmcmd shutdown action: Trigger vm command on shutdown. |
1337 | */ | 1385 | */ |
@@ -1421,7 +1469,8 @@ static struct shutdown_action stop_action = {SHUTDOWN_ACTION_STOP_STR, | |||
1421 | /* action list */ | 1469 | /* action list */ |
1422 | 1470 | ||
1423 | static struct shutdown_action *shutdown_actions_list[] = { | 1471 | static struct shutdown_action *shutdown_actions_list[] = { |
1424 | &ipl_action, &reipl_action, &dump_action, &vmcmd_action, &stop_action}; | 1472 | &ipl_action, &reipl_action, &dump_reipl_action, &dump_action, |
1473 | &vmcmd_action, &stop_action}; | ||
1425 | #define SHUTDOWN_ACTIONS_COUNT (sizeof(shutdown_actions_list) / sizeof(void *)) | 1474 | #define SHUTDOWN_ACTIONS_COUNT (sizeof(shutdown_actions_list) / sizeof(void *)) |
1426 | 1475 | ||
1427 | /* | 1476 | /* |
@@ -1434,11 +1483,11 @@ static int set_trigger(const char *buf, struct shutdown_trigger *trigger, | |||
1434 | size_t len) | 1483 | size_t len) |
1435 | { | 1484 | { |
1436 | int i; | 1485 | int i; |
1486 | |||
1437 | for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) { | 1487 | for (i = 0; i < SHUTDOWN_ACTIONS_COUNT; i++) { |
1438 | if (!shutdown_actions_list[i]) | 1488 | if (!shutdown_actions_list[i]) |
1439 | continue; | 1489 | continue; |
1440 | if (strncmp(buf, shutdown_actions_list[i]->name, | 1490 | if (sysfs_streq(buf, shutdown_actions_list[i]->name)) { |
1441 | strlen(shutdown_actions_list[i]->name)) == 0) { | ||
1442 | trigger->action = shutdown_actions_list[i]; | 1491 | trigger->action = shutdown_actions_list[i]; |
1443 | return len; | 1492 | return len; |
1444 | } | 1493 | } |
@@ -1672,7 +1721,7 @@ static int on_panic_notify(struct notifier_block *self, | |||
1672 | 1721 | ||
1673 | static struct notifier_block on_panic_nb = { | 1722 | static struct notifier_block on_panic_nb = { |
1674 | .notifier_call = on_panic_notify, | 1723 | .notifier_call = on_panic_notify, |
1675 | .priority = 0, | 1724 | .priority = INT_MIN, |
1676 | }; | 1725 | }; |
1677 | 1726 | ||
1678 | void __init setup_ipl(void) | 1727 | void __init setup_ipl(void) |
@@ -1696,7 +1745,6 @@ void __init setup_ipl(void) | |||
1696 | sizeof(ipl_info.data.nss.name)); | 1745 | sizeof(ipl_info.data.nss.name)); |
1697 | break; | 1746 | break; |
1698 | case IPL_TYPE_UNKNOWN: | 1747 | case IPL_TYPE_UNKNOWN: |
1699 | default: | ||
1700 | /* We have no info to copy */ | 1748 | /* We have no info to copy */ |
1701 | break; | 1749 | break; |
1702 | } | 1750 | } |
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c index 59b4e796680a..eed4a00cb676 100644 --- a/arch/s390/kernel/module.c +++ b/arch/s390/kernel/module.c | |||
@@ -310,15 +310,20 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, | |||
310 | info->plt_initialized = 1; | 310 | info->plt_initialized = 1; |
311 | } | 311 | } |
312 | if (r_type == R_390_PLTOFF16 || | 312 | if (r_type == R_390_PLTOFF16 || |
313 | r_type == R_390_PLTOFF32 | 313 | r_type == R_390_PLTOFF32 || |
314 | || r_type == R_390_PLTOFF64 | 314 | r_type == R_390_PLTOFF64) |
315 | ) | ||
316 | val = me->arch.plt_offset - me->arch.got_offset + | 315 | val = me->arch.plt_offset - me->arch.got_offset + |
317 | info->plt_offset + rela->r_addend; | 316 | info->plt_offset + rela->r_addend; |
318 | else | 317 | else { |
319 | val = (Elf_Addr) me->module_core + | 318 | if (!((r_type == R_390_PLT16DBL && |
320 | me->arch.plt_offset + info->plt_offset + | 319 | val - loc + 0xffffUL < 0x1ffffeUL) || |
321 | rela->r_addend - loc; | 320 | (r_type == R_390_PLT32DBL && |
321 | val - loc + 0xffffffffULL < 0x1fffffffeULL))) | ||
322 | val = (Elf_Addr) me->module_core + | ||
323 | me->arch.plt_offset + | ||
324 | info->plt_offset; | ||
325 | val += rela->r_addend - loc; | ||
326 | } | ||
322 | if (r_type == R_390_PLT16DBL) | 327 | if (r_type == R_390_PLT16DBL) |
323 | *(unsigned short *) loc = val >> 1; | 328 | *(unsigned short *) loc = val >> 1; |
324 | else if (r_type == R_390_PLTOFF16) | 329 | else if (r_type == R_390_PLTOFF16) |
diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c new file mode 100644 index 000000000000..4bfdc421d7e9 --- /dev/null +++ b/arch/s390/kernel/nmi.c | |||
@@ -0,0 +1,376 @@ | |||
1 | /* | ||
2 | * Machine check handler | ||
3 | * | ||
4 | * Copyright IBM Corp. 2000,2009 | ||
5 | * Author(s): Ingo Adlung <adlung@de.ibm.com>, | ||
6 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
7 | * Cornelia Huck <cornelia.huck@de.ibm.com>, | ||
8 | * Heiko Carstens <heiko.carstens@de.ibm.com>, | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/time.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <asm/lowcore.h> | ||
16 | #include <asm/smp.h> | ||
17 | #include <asm/etr.h> | ||
18 | #include <asm/cpu.h> | ||
19 | #include <asm/nmi.h> | ||
20 | #include <asm/crw.h> | ||
21 | |||
22 | struct mcck_struct { | ||
23 | int kill_task; | ||
24 | int channel_report; | ||
25 | int warning; | ||
26 | unsigned long long mcck_code; | ||
27 | }; | ||
28 | |||
29 | static DEFINE_PER_CPU(struct mcck_struct, cpu_mcck); | ||
30 | |||
31 | static NORET_TYPE void s390_handle_damage(char *msg) | ||
32 | { | ||
33 | smp_send_stop(); | ||
34 | disabled_wait((unsigned long) __builtin_return_address(0)); | ||
35 | while (1); | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | * Main machine check handler function. Will be called with interrupts enabled | ||
40 | * or disabled and machine checks enabled or disabled. | ||
41 | */ | ||
42 | void s390_handle_mcck(void) | ||
43 | { | ||
44 | unsigned long flags; | ||
45 | struct mcck_struct mcck; | ||
46 | |||
47 | /* | ||
48 | * Disable machine checks and get the current state of accumulated | ||
49 | * machine checks. Afterwards delete the old state and enable machine | ||
50 | * checks again. | ||
51 | */ | ||
52 | local_irq_save(flags); | ||
53 | local_mcck_disable(); | ||
54 | mcck = __get_cpu_var(cpu_mcck); | ||
55 | memset(&__get_cpu_var(cpu_mcck), 0, sizeof(struct mcck_struct)); | ||
56 | clear_thread_flag(TIF_MCCK_PENDING); | ||
57 | local_mcck_enable(); | ||
58 | local_irq_restore(flags); | ||
59 | |||
60 | if (mcck.channel_report) | ||
61 | crw_handle_channel_report(); | ||
62 | /* | ||
63 | * A warning may remain for a prolonged period on the bare iron. | ||
64 | * (actually until the machine is powered off, or the problem is gone) | ||
65 | * So we just stop listening for the WARNING MCH and avoid continuously | ||
66 | * being interrupted. One caveat is however, that we must do this per | ||
67 | * processor and cannot use the smp version of ctl_clear_bit(). | ||
68 | * On VM we only get one interrupt per virtally presented machinecheck. | ||
69 | * Though one suffices, we may get one interrupt per (virtual) cpu. | ||
70 | */ | ||
71 | if (mcck.warning) { /* WARNING pending ? */ | ||
72 | static int mchchk_wng_posted = 0; | ||
73 | |||
74 | /* Use single cpu clear, as we cannot handle smp here. */ | ||
75 | __ctl_clear_bit(14, 24); /* Disable WARNING MCH */ | ||
76 | if (xchg(&mchchk_wng_posted, 1) == 0) | ||
77 | kill_cad_pid(SIGPWR, 1); | ||
78 | } | ||
79 | if (mcck.kill_task) { | ||
80 | local_irq_enable(); | ||
81 | printk(KERN_EMERG "mcck: Terminating task because of machine " | ||
82 | "malfunction (code 0x%016llx).\n", mcck.mcck_code); | ||
83 | printk(KERN_EMERG "mcck: task: %s, pid: %d.\n", | ||
84 | current->comm, current->pid); | ||
85 | do_exit(SIGSEGV); | ||
86 | } | ||
87 | } | ||
88 | EXPORT_SYMBOL_GPL(s390_handle_mcck); | ||
89 | |||
90 | /* | ||
91 | * returns 0 if all registers could be validated | ||
92 | * returns 1 otherwise | ||
93 | */ | ||
94 | static int notrace s390_revalidate_registers(struct mci *mci) | ||
95 | { | ||
96 | int kill_task; | ||
97 | u64 tmpclock; | ||
98 | u64 zero; | ||
99 | void *fpt_save_area, *fpt_creg_save_area; | ||
100 | |||
101 | kill_task = 0; | ||
102 | zero = 0; | ||
103 | |||
104 | if (!mci->gr) { | ||
105 | /* | ||
106 | * General purpose registers couldn't be restored and have | ||
107 | * unknown contents. Process needs to be terminated. | ||
108 | */ | ||
109 | kill_task = 1; | ||
110 | } | ||
111 | if (!mci->fp) { | ||
112 | /* | ||
113 | * Floating point registers can't be restored and | ||
114 | * therefore the process needs to be terminated. | ||
115 | */ | ||
116 | kill_task = 1; | ||
117 | } | ||
118 | #ifndef CONFIG_64BIT | ||
119 | asm volatile( | ||
120 | " ld 0,0(%0)\n" | ||
121 | " ld 2,8(%0)\n" | ||
122 | " ld 4,16(%0)\n" | ||
123 | " ld 6,24(%0)" | ||
124 | : : "a" (&S390_lowcore.floating_pt_save_area)); | ||
125 | #endif | ||
126 | |||
127 | if (MACHINE_HAS_IEEE) { | ||
128 | #ifdef CONFIG_64BIT | ||
129 | fpt_save_area = &S390_lowcore.floating_pt_save_area; | ||
130 | fpt_creg_save_area = &S390_lowcore.fpt_creg_save_area; | ||
131 | #else | ||
132 | fpt_save_area = (void *) S390_lowcore.extended_save_area_addr; | ||
133 | fpt_creg_save_area = fpt_save_area + 128; | ||
134 | #endif | ||
135 | if (!mci->fc) { | ||
136 | /* | ||
137 | * Floating point control register can't be restored. | ||
138 | * Task will be terminated. | ||
139 | */ | ||
140 | asm volatile("lfpc 0(%0)" : : "a" (&zero), "m" (zero)); | ||
141 | kill_task = 1; | ||
142 | |||
143 | } else | ||
144 | asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area)); | ||
145 | |||
146 | asm volatile( | ||
147 | " ld 0,0(%0)\n" | ||
148 | " ld 1,8(%0)\n" | ||
149 | " ld 2,16(%0)\n" | ||
150 | " ld 3,24(%0)\n" | ||
151 | " ld 4,32(%0)\n" | ||
152 | " ld 5,40(%0)\n" | ||
153 | " ld 6,48(%0)\n" | ||
154 | " ld 7,56(%0)\n" | ||
155 | " ld 8,64(%0)\n" | ||
156 | " ld 9,72(%0)\n" | ||
157 | " ld 10,80(%0)\n" | ||
158 | " ld 11,88(%0)\n" | ||
159 | " ld 12,96(%0)\n" | ||
160 | " ld 13,104(%0)\n" | ||
161 | " ld 14,112(%0)\n" | ||
162 | " ld 15,120(%0)\n" | ||
163 | : : "a" (fpt_save_area)); | ||
164 | } | ||
165 | /* Revalidate access registers */ | ||
166 | asm volatile( | ||
167 | " lam 0,15,0(%0)" | ||
168 | : : "a" (&S390_lowcore.access_regs_save_area)); | ||
169 | if (!mci->ar) { | ||
170 | /* | ||
171 | * Access registers have unknown contents. | ||
172 | * Terminating task. | ||
173 | */ | ||
174 | kill_task = 1; | ||
175 | } | ||
176 | /* Revalidate control registers */ | ||
177 | if (!mci->cr) { | ||
178 | /* | ||
179 | * Control registers have unknown contents. | ||
180 | * Can't recover and therefore stopping machine. | ||
181 | */ | ||
182 | s390_handle_damage("invalid control registers."); | ||
183 | } else { | ||
184 | #ifdef CONFIG_64BIT | ||
185 | asm volatile( | ||
186 | " lctlg 0,15,0(%0)" | ||
187 | : : "a" (&S390_lowcore.cregs_save_area)); | ||
188 | #else | ||
189 | asm volatile( | ||
190 | " lctl 0,15,0(%0)" | ||
191 | : : "a" (&S390_lowcore.cregs_save_area)); | ||
192 | #endif | ||
193 | } | ||
194 | /* | ||
195 | * We don't even try to revalidate the TOD register, since we simply | ||
196 | * can't write something sensible into that register. | ||
197 | */ | ||
198 | #ifdef CONFIG_64BIT | ||
199 | /* | ||
200 | * See if we can revalidate the TOD programmable register with its | ||
201 | * old contents (should be zero) otherwise set it to zero. | ||
202 | */ | ||
203 | if (!mci->pr) | ||
204 | asm volatile( | ||
205 | " sr 0,0\n" | ||
206 | " sckpf" | ||
207 | : : : "0", "cc"); | ||
208 | else | ||
209 | asm volatile( | ||
210 | " l 0,0(%0)\n" | ||
211 | " sckpf" | ||
212 | : : "a" (&S390_lowcore.tod_progreg_save_area) | ||
213 | : "0", "cc"); | ||
214 | #endif | ||
215 | /* Revalidate clock comparator register */ | ||
216 | asm volatile( | ||
217 | " stck 0(%1)\n" | ||
218 | " sckc 0(%1)" | ||
219 | : "=m" (tmpclock) : "a" (&(tmpclock)) : "cc", "memory"); | ||
220 | |||
221 | /* Check if old PSW is valid */ | ||
222 | if (!mci->wp) | ||
223 | /* | ||
224 | * Can't tell if we come from user or kernel mode | ||
225 | * -> stopping machine. | ||
226 | */ | ||
227 | s390_handle_damage("old psw invalid."); | ||
228 | |||
229 | if (!mci->ms || !mci->pm || !mci->ia) | ||
230 | kill_task = 1; | ||
231 | |||
232 | return kill_task; | ||
233 | } | ||
234 | |||
235 | #define MAX_IPD_COUNT 29 | ||
236 | #define MAX_IPD_TIME (5 * 60 * USEC_PER_SEC) /* 5 minutes */ | ||
237 | |||
238 | #define ED_STP_ISLAND 6 /* External damage STP island check */ | ||
239 | #define ED_STP_SYNC 7 /* External damage STP sync check */ | ||
240 | #define ED_ETR_SYNC 12 /* External damage ETR sync check */ | ||
241 | #define ED_ETR_SWITCH 13 /* External damage ETR switch to local */ | ||
242 | |||
243 | /* | ||
244 | * machine check handler. | ||
245 | */ | ||
246 | void notrace s390_do_machine_check(struct pt_regs *regs) | ||
247 | { | ||
248 | static int ipd_count; | ||
249 | static DEFINE_SPINLOCK(ipd_lock); | ||
250 | static unsigned long long last_ipd; | ||
251 | struct mcck_struct *mcck; | ||
252 | unsigned long long tmp; | ||
253 | struct mci *mci; | ||
254 | int umode; | ||
255 | |||
256 | lockdep_off(); | ||
257 | s390_idle_check(); | ||
258 | |||
259 | mci = (struct mci *) &S390_lowcore.mcck_interruption_code; | ||
260 | mcck = &__get_cpu_var(cpu_mcck); | ||
261 | umode = user_mode(regs); | ||
262 | |||
263 | if (mci->sd) { | ||
264 | /* System damage -> stopping machine */ | ||
265 | s390_handle_damage("received system damage machine check."); | ||
266 | } | ||
267 | if (mci->pd) { | ||
268 | if (mci->b) { | ||
269 | /* Processing backup -> verify if we can survive this */ | ||
270 | u64 z_mcic, o_mcic, t_mcic; | ||
271 | #ifdef CONFIG_64BIT | ||
272 | z_mcic = (1ULL<<63 | 1ULL<<59 | 1ULL<<29); | ||
273 | o_mcic = (1ULL<<43 | 1ULL<<42 | 1ULL<<41 | 1ULL<<40 | | ||
274 | 1ULL<<36 | 1ULL<<35 | 1ULL<<34 | 1ULL<<32 | | ||
275 | 1ULL<<30 | 1ULL<<21 | 1ULL<<20 | 1ULL<<17 | | ||
276 | 1ULL<<16); | ||
277 | #else | ||
278 | z_mcic = (1ULL<<63 | 1ULL<<59 | 1ULL<<57 | 1ULL<<50 | | ||
279 | 1ULL<<29); | ||
280 | o_mcic = (1ULL<<43 | 1ULL<<42 | 1ULL<<41 | 1ULL<<40 | | ||
281 | 1ULL<<36 | 1ULL<<35 | 1ULL<<34 | 1ULL<<32 | | ||
282 | 1ULL<<30 | 1ULL<<20 | 1ULL<<17 | 1ULL<<16); | ||
283 | #endif | ||
284 | t_mcic = *(u64 *)mci; | ||
285 | |||
286 | if (((t_mcic & z_mcic) != 0) || | ||
287 | ((t_mcic & o_mcic) != o_mcic)) { | ||
288 | s390_handle_damage("processing backup machine " | ||
289 | "check with damage."); | ||
290 | } | ||
291 | |||
292 | /* | ||
293 | * Nullifying exigent condition, therefore we might | ||
294 | * retry this instruction. | ||
295 | */ | ||
296 | spin_lock(&ipd_lock); | ||
297 | tmp = get_clock(); | ||
298 | if (((tmp - last_ipd) >> 12) < MAX_IPD_TIME) | ||
299 | ipd_count++; | ||
300 | else | ||
301 | ipd_count = 1; | ||
302 | last_ipd = tmp; | ||
303 | if (ipd_count == MAX_IPD_COUNT) | ||
304 | s390_handle_damage("too many ipd retries."); | ||
305 | spin_unlock(&ipd_lock); | ||
306 | } else { | ||
307 | /* Processing damage -> stopping machine */ | ||
308 | s390_handle_damage("received instruction processing " | ||
309 | "damage machine check."); | ||
310 | } | ||
311 | } | ||
312 | if (s390_revalidate_registers(mci)) { | ||
313 | if (umode) { | ||
314 | /* | ||
315 | * Couldn't restore all register contents while in | ||
316 | * user mode -> mark task for termination. | ||
317 | */ | ||
318 | mcck->kill_task = 1; | ||
319 | mcck->mcck_code = *(unsigned long long *) mci; | ||
320 | set_thread_flag(TIF_MCCK_PENDING); | ||
321 | } else { | ||
322 | /* | ||
323 | * Couldn't restore all register contents while in | ||
324 | * kernel mode -> stopping machine. | ||
325 | */ | ||
326 | s390_handle_damage("unable to revalidate registers."); | ||
327 | } | ||
328 | } | ||
329 | if (mci->cd) { | ||
330 | /* Timing facility damage */ | ||
331 | s390_handle_damage("TOD clock damaged"); | ||
332 | } | ||
333 | if (mci->ed && mci->ec) { | ||
334 | /* External damage */ | ||
335 | if (S390_lowcore.external_damage_code & (1U << ED_ETR_SYNC)) | ||
336 | etr_sync_check(); | ||
337 | if (S390_lowcore.external_damage_code & (1U << ED_ETR_SWITCH)) | ||
338 | etr_switch_to_local(); | ||
339 | if (S390_lowcore.external_damage_code & (1U << ED_STP_SYNC)) | ||
340 | stp_sync_check(); | ||
341 | if (S390_lowcore.external_damage_code & (1U << ED_STP_ISLAND)) | ||
342 | stp_island_check(); | ||
343 | } | ||
344 | if (mci->se) | ||
345 | /* Storage error uncorrected */ | ||
346 | s390_handle_damage("received storage error uncorrected " | ||
347 | "machine check."); | ||
348 | if (mci->ke) | ||
349 | /* Storage key-error uncorrected */ | ||
350 | s390_handle_damage("received storage key-error uncorrected " | ||
351 | "machine check."); | ||
352 | if (mci->ds && mci->fa) | ||
353 | /* Storage degradation */ | ||
354 | s390_handle_damage("received storage degradation machine " | ||
355 | "check."); | ||
356 | if (mci->cp) { | ||
357 | /* Channel report word pending */ | ||
358 | mcck->channel_report = 1; | ||
359 | set_thread_flag(TIF_MCCK_PENDING); | ||
360 | } | ||
361 | if (mci->w) { | ||
362 | /* Warning pending */ | ||
363 | mcck->warning = 1; | ||
364 | set_thread_flag(TIF_MCCK_PENDING); | ||
365 | } | ||
366 | lockdep_on(); | ||
367 | } | ||
368 | |||
369 | static int __init machine_check_init(void) | ||
370 | { | ||
371 | ctl_set_bit(14, 25); /* enable external damage MCH */ | ||
372 | ctl_set_bit(14, 27); /* enable system recovery MCH */ | ||
373 | ctl_set_bit(14, 24); /* enable warning MCH */ | ||
374 | return 0; | ||
375 | } | ||
376 | arch_initcall(machine_check_init); | ||
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 5cd38a90e64d..b48e961a38f6 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -1,18 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/process.c | 2 | * This file handles the architecture dependent parts of process handling. |
3 | * | 3 | * |
4 | * S390 version | 4 | * Copyright IBM Corp. 1999,2009 |
5 | * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation | 5 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, |
6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | 6 | * Hartmut Penner <hp@de.ibm.com>, |
7 | * Hartmut Penner (hp@de.ibm.com), | 7 | * Denis Joseph Barrow, |
8 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), | ||
9 | * | ||
10 | * Derived from "arch/i386/kernel/process.c" | ||
11 | * Copyright (C) 1995, Linus Torvalds | ||
12 | */ | ||
13 | |||
14 | /* | ||
15 | * This file handles the architecture-dependent parts of process handling.. | ||
16 | */ | 8 | */ |
17 | 9 | ||
18 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
@@ -47,6 +39,7 @@ | |||
47 | #include <asm/processor.h> | 39 | #include <asm/processor.h> |
48 | #include <asm/irq.h> | 40 | #include <asm/irq.h> |
49 | #include <asm/timer.h> | 41 | #include <asm/timer.h> |
42 | #include <asm/nmi.h> | ||
50 | #include "entry.h" | 43 | #include "entry.h" |
51 | 44 | ||
52 | asmlinkage void ret_from_fork(void) asm ("ret_from_fork"); | 45 | asmlinkage void ret_from_fork(void) asm ("ret_from_fork"); |
@@ -76,7 +69,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | |||
76 | return sf->gprs[8]; | 69 | return sf->gprs[8]; |
77 | } | 70 | } |
78 | 71 | ||
79 | extern void s390_handle_mcck(void); | ||
80 | /* | 72 | /* |
81 | * The idle loop on a S390... | 73 | * The idle loop on a S390... |
82 | */ | 74 | */ |
@@ -149,6 +141,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) | |||
149 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, | 141 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, |
150 | 0, ®s, 0, NULL, NULL); | 142 | 0, ®s, 0, NULL, NULL); |
151 | } | 143 | } |
144 | EXPORT_SYMBOL(kernel_thread); | ||
152 | 145 | ||
153 | /* | 146 | /* |
154 | * Free current thread data structures etc.. | 147 | * Free current thread data structures etc.. |
@@ -168,34 +161,35 @@ void release_thread(struct task_struct *dead_task) | |||
168 | } | 161 | } |
169 | 162 | ||
170 | int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp, | 163 | int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp, |
171 | unsigned long unused, | 164 | unsigned long unused, |
172 | struct task_struct * p, struct pt_regs * regs) | 165 | struct task_struct *p, struct pt_regs *regs) |
173 | { | 166 | { |
174 | struct fake_frame | 167 | struct thread_info *ti; |
175 | { | 168 | struct fake_frame |
176 | struct stack_frame sf; | 169 | { |
177 | struct pt_regs childregs; | 170 | struct stack_frame sf; |
178 | } *frame; | 171 | struct pt_regs childregs; |
179 | 172 | } *frame; | |
180 | frame = container_of(task_pt_regs(p), struct fake_frame, childregs); | 173 | |
181 | p->thread.ksp = (unsigned long) frame; | 174 | frame = container_of(task_pt_regs(p), struct fake_frame, childregs); |
175 | p->thread.ksp = (unsigned long) frame; | ||
182 | /* Store access registers to kernel stack of new process. */ | 176 | /* Store access registers to kernel stack of new process. */ |
183 | frame->childregs = *regs; | 177 | frame->childregs = *regs; |
184 | frame->childregs.gprs[2] = 0; /* child returns 0 on fork. */ | 178 | frame->childregs.gprs[2] = 0; /* child returns 0 on fork. */ |
185 | frame->childregs.gprs[15] = new_stackp; | 179 | frame->childregs.gprs[15] = new_stackp; |
186 | frame->sf.back_chain = 0; | 180 | frame->sf.back_chain = 0; |
187 | 181 | ||
188 | /* new return point is ret_from_fork */ | 182 | /* new return point is ret_from_fork */ |
189 | frame->sf.gprs[8] = (unsigned long) ret_from_fork; | 183 | frame->sf.gprs[8] = (unsigned long) ret_from_fork; |
190 | 184 | ||
191 | /* fake return stack for resume(), don't go back to schedule */ | 185 | /* fake return stack for resume(), don't go back to schedule */ |
192 | frame->sf.gprs[9] = (unsigned long) frame; | 186 | frame->sf.gprs[9] = (unsigned long) frame; |
193 | 187 | ||
194 | /* Save access registers to new thread structure. */ | 188 | /* Save access registers to new thread structure. */ |
195 | save_access_regs(&p->thread.acrs[0]); | 189 | save_access_regs(&p->thread.acrs[0]); |
196 | 190 | ||
197 | #ifndef CONFIG_64BIT | 191 | #ifndef CONFIG_64BIT |
198 | /* | 192 | /* |
199 | * save fprs to current->thread.fp_regs to merge them with | 193 | * save fprs to current->thread.fp_regs to merge them with |
200 | * the emulated registers and then copy the result to the child. | 194 | * the emulated registers and then copy the result to the child. |
201 | */ | 195 | */ |
@@ -220,10 +214,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp, | |||
220 | #endif /* CONFIG_64BIT */ | 214 | #endif /* CONFIG_64BIT */ |
221 | /* start new process with ar4 pointing to the correct address space */ | 215 | /* start new process with ar4 pointing to the correct address space */ |
222 | p->thread.mm_segment = get_fs(); | 216 | p->thread.mm_segment = get_fs(); |
223 | /* Don't copy debug registers */ | 217 | /* Don't copy debug registers */ |
224 | memset(&p->thread.per_info,0,sizeof(p->thread.per_info)); | 218 | memset(&p->thread.per_info, 0, sizeof(p->thread.per_info)); |
225 | 219 | /* Initialize per thread user and system timer values */ | |
226 | return 0; | 220 | ti = task_thread_info(p); |
221 | ti->user_timer = 0; | ||
222 | ti->system_timer = 0; | ||
223 | return 0; | ||
227 | } | 224 | } |
228 | 225 | ||
229 | SYSCALL_DEFINE0(fork) | 226 | SYSCALL_DEFINE0(fork) |
@@ -311,7 +308,7 @@ out: | |||
311 | int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs) | 308 | int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs) |
312 | { | 309 | { |
313 | #ifndef CONFIG_64BIT | 310 | #ifndef CONFIG_64BIT |
314 | /* | 311 | /* |
315 | * save fprs to current->thread.fp_regs to merge them with | 312 | * save fprs to current->thread.fp_regs to merge them with |
316 | * the emulated registers and then copy the result to the dump. | 313 | * the emulated registers and then copy the result to the dump. |
317 | */ | 314 | */ |
@@ -322,6 +319,7 @@ int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs) | |||
322 | #endif /* CONFIG_64BIT */ | 319 | #endif /* CONFIG_64BIT */ |
323 | return 1; | 320 | return 1; |
324 | } | 321 | } |
322 | EXPORT_SYMBOL(dump_fpu); | ||
325 | 323 | ||
326 | unsigned long get_wchan(struct task_struct *p) | 324 | unsigned long get_wchan(struct task_struct *p) |
327 | { | 325 | { |
@@ -346,4 +344,3 @@ unsigned long get_wchan(struct task_struct *p) | |||
346 | } | 344 | } |
347 | return 0; | 345 | return 0; |
348 | } | 346 | } |
349 | |||
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c index 82c1872cfe80..802c8ab247f3 100644 --- a/arch/s390/kernel/processor.c +++ b/arch/s390/kernel/processor.c | |||
@@ -18,10 +18,11 @@ | |||
18 | #include <asm/lowcore.h> | 18 | #include <asm/lowcore.h> |
19 | #include <asm/param.h> | 19 | #include <asm/param.h> |
20 | 20 | ||
21 | void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) | 21 | void __cpuinit print_cpu_info(void) |
22 | { | 22 | { |
23 | pr_info("Processor %d started, address %d, identification %06X\n", | 23 | pr_info("Processor %d started, address %d, identification %06X\n", |
24 | cpuinfo->cpu_nr, cpuinfo->cpu_addr, cpuinfo->cpu_id.ident); | 24 | S390_lowcore.cpu_nr, S390_lowcore.cpu_addr, |
25 | S390_lowcore.cpu_id.ident); | ||
25 | } | 26 | } |
26 | 27 | ||
27 | /* | 28 | /* |
@@ -30,48 +31,46 @@ void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) | |||
30 | 31 | ||
31 | static int show_cpuinfo(struct seq_file *m, void *v) | 32 | static int show_cpuinfo(struct seq_file *m, void *v) |
32 | { | 33 | { |
33 | static const char *hwcap_str[8] = { | 34 | static const char *hwcap_str[9] = { |
34 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", | 35 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", |
35 | "edat" | 36 | "edat", "etf3eh" |
36 | }; | 37 | }; |
37 | struct cpuinfo_S390 *cpuinfo; | 38 | struct _lowcore *lc; |
38 | unsigned long n = (unsigned long) v - 1; | 39 | unsigned long n = (unsigned long) v - 1; |
39 | int i; | 40 | int i; |
40 | 41 | ||
41 | s390_adjust_jiffies(); | 42 | s390_adjust_jiffies(); |
42 | preempt_disable(); | 43 | preempt_disable(); |
43 | if (!n) { | 44 | if (!n) { |
44 | seq_printf(m, "vendor_id : IBM/S390\n" | 45 | seq_printf(m, "vendor_id : IBM/S390\n" |
45 | "# processors : %i\n" | 46 | "# processors : %i\n" |
46 | "bogomips per cpu: %lu.%02lu\n", | 47 | "bogomips per cpu: %lu.%02lu\n", |
47 | num_online_cpus(), loops_per_jiffy/(500000/HZ), | 48 | num_online_cpus(), loops_per_jiffy/(500000/HZ), |
48 | (loops_per_jiffy/(5000/HZ))%100); | 49 | (loops_per_jiffy/(5000/HZ))%100); |
49 | seq_puts(m, "features\t: "); | 50 | seq_puts(m, "features\t: "); |
50 | for (i = 0; i < 8; i++) | 51 | for (i = 0; i < 9; i++) |
51 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) | 52 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) |
52 | seq_printf(m, "%s ", hwcap_str[i]); | 53 | seq_printf(m, "%s ", hwcap_str[i]); |
53 | seq_puts(m, "\n"); | 54 | seq_puts(m, "\n"); |
54 | } | 55 | } |
55 | 56 | ||
56 | if (cpu_online(n)) { | 57 | if (cpu_online(n)) { |
57 | #ifdef CONFIG_SMP | 58 | #ifdef CONFIG_SMP |
58 | if (smp_processor_id() == n) | 59 | lc = (smp_processor_id() == n) ? |
59 | cpuinfo = &S390_lowcore.cpu_data; | 60 | &S390_lowcore : lowcore_ptr[n]; |
60 | else | ||
61 | cpuinfo = &lowcore_ptr[n]->cpu_data; | ||
62 | #else | 61 | #else |
63 | cpuinfo = &S390_lowcore.cpu_data; | 62 | lc = &S390_lowcore; |
64 | #endif | 63 | #endif |
65 | seq_printf(m, "processor %li: " | 64 | seq_printf(m, "processor %li: " |
66 | "version = %02X, " | 65 | "version = %02X, " |
67 | "identification = %06X, " | 66 | "identification = %06X, " |
68 | "machine = %04X\n", | 67 | "machine = %04X\n", |
69 | n, cpuinfo->cpu_id.version, | 68 | n, lc->cpu_id.version, |
70 | cpuinfo->cpu_id.ident, | 69 | lc->cpu_id.ident, |
71 | cpuinfo->cpu_id.machine); | 70 | lc->cpu_id.machine); |
72 | } | 71 | } |
73 | preempt_enable(); | 72 | preempt_enable(); |
74 | return 0; | 73 | return 0; |
75 | } | 74 | } |
76 | 75 | ||
77 | static void *c_start(struct seq_file *m, loff_t *pos) | 76 | static void *c_start(struct seq_file *m, loff_t *pos) |
diff --git a/arch/s390/kernel/reipl64.S b/arch/s390/kernel/reipl64.S index c41930499a5f..774147824c3d 100644 --- a/arch/s390/kernel/reipl64.S +++ b/arch/s390/kernel/reipl64.S | |||
@@ -1,10 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/reipl.S | 2 | * Copyright IBM Corp 2000,2009 |
3 | * | 3 | * Author(s): Holger Smolinski <Holger.Smolinski@de.ibm.com>, |
4 | * S390 version | 4 | * Denis Joseph Barrow, |
5 | * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
6 | * Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com) | ||
7 | Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) | ||
8 | */ | 5 | */ |
9 | 6 | ||
10 | #include <asm/lowcore.h> | 7 | #include <asm/lowcore.h> |
@@ -30,7 +27,7 @@ do_reipl_asm: basr %r13,0 | |||
30 | mvc __LC_PREFIX_SAVE_AREA-0x1000(4,%r1),0(%r10) | 27 | mvc __LC_PREFIX_SAVE_AREA-0x1000(4,%r1),0(%r10) |
31 | stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1) | 28 | stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1) |
32 | stckc .Lclkcmp-.Lpg0(%r13) | 29 | stckc .Lclkcmp-.Lpg0(%r13) |
33 | mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(8,%r1),.Lclkcmp-.Lpg0(%r13) | 30 | mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(7,%r1),.Lclkcmp-.Lpg0(%r13) |
34 | stpt __LC_CPU_TIMER_SAVE_AREA-0x1000(%r1) | 31 | stpt __LC_CPU_TIMER_SAVE_AREA-0x1000(%r1) |
35 | stg %r13, __LC_PSW_SAVE_AREA-0x1000+8(%r1) | 32 | stg %r13, __LC_PSW_SAVE_AREA-0x1000+8(%r1) |
36 | 33 | ||
diff --git a/arch/s390/kernel/s390_ksyms.c b/arch/s390/kernel/s390_ksyms.c index 46b90cb03707..656fcbb9bd83 100644 --- a/arch/s390/kernel/s390_ksyms.c +++ b/arch/s390/kernel/s390_ksyms.c | |||
@@ -1,49 +1,5 @@ | |||
1 | /* | ||
2 | * arch/s390/kernel/s390_ksyms.c | ||
3 | * | ||
4 | * S390 version | ||
5 | */ | ||
6 | #include <linux/highuid.h> | ||
7 | #include <linux/module.h> | 1 | #include <linux/module.h> |
8 | #include <linux/mm.h> | ||
9 | #include <linux/smp.h> | ||
10 | #include <linux/syscalls.h> | ||
11 | #include <linux/interrupt.h> | ||
12 | #include <asm/checksum.h> | ||
13 | #include <asm/cpcmd.h> | ||
14 | #include <asm/delay.h> | ||
15 | #include <asm/pgalloc.h> | ||
16 | #include <asm/setup.h> | ||
17 | #include <asm/ftrace.h> | 2 | #include <asm/ftrace.h> |
18 | #ifdef CONFIG_IP_MULTICAST | ||
19 | #include <net/arp.h> | ||
20 | #endif | ||
21 | |||
22 | /* | ||
23 | * memory management | ||
24 | */ | ||
25 | EXPORT_SYMBOL(_oi_bitmap); | ||
26 | EXPORT_SYMBOL(_ni_bitmap); | ||
27 | EXPORT_SYMBOL(_zb_findmap); | ||
28 | EXPORT_SYMBOL(_sb_findmap); | ||
29 | |||
30 | /* | ||
31 | * binfmt_elf loader | ||
32 | */ | ||
33 | extern int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs); | ||
34 | EXPORT_SYMBOL(dump_fpu); | ||
35 | EXPORT_SYMBOL(empty_zero_page); | ||
36 | |||
37 | /* | ||
38 | * misc. | ||
39 | */ | ||
40 | EXPORT_SYMBOL(machine_flags); | ||
41 | EXPORT_SYMBOL(__udelay); | ||
42 | EXPORT_SYMBOL(kernel_thread); | ||
43 | EXPORT_SYMBOL(csum_fold); | ||
44 | EXPORT_SYMBOL(console_mode); | ||
45 | EXPORT_SYMBOL(console_devno); | ||
46 | EXPORT_SYMBOL(console_irq); | ||
47 | 3 | ||
48 | #ifdef CONFIG_FUNCTION_TRACER | 4 | #ifdef CONFIG_FUNCTION_TRACER |
49 | EXPORT_SYMBOL(_mcount); | 5 | EXPORT_SYMBOL(_mcount); |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index c5cfb6185eac..06201b93cbbf 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -74,9 +74,17 @@ EXPORT_SYMBOL(uaccess); | |||
74 | * Machine setup.. | 74 | * Machine setup.. |
75 | */ | 75 | */ |
76 | unsigned int console_mode = 0; | 76 | unsigned int console_mode = 0; |
77 | EXPORT_SYMBOL(console_mode); | ||
78 | |||
77 | unsigned int console_devno = -1; | 79 | unsigned int console_devno = -1; |
80 | EXPORT_SYMBOL(console_devno); | ||
81 | |||
78 | unsigned int console_irq = -1; | 82 | unsigned int console_irq = -1; |
83 | EXPORT_SYMBOL(console_irq); | ||
84 | |||
79 | unsigned long machine_flags; | 85 | unsigned long machine_flags; |
86 | EXPORT_SYMBOL(machine_flags); | ||
87 | |||
80 | unsigned long elf_hwcap = 0; | 88 | unsigned long elf_hwcap = 0; |
81 | char elf_platform[ELF_PLATFORM_SIZE]; | 89 | char elf_platform[ELF_PLATFORM_SIZE]; |
82 | 90 | ||
@@ -86,6 +94,10 @@ volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ | |||
86 | int __initdata memory_end_set; | 94 | int __initdata memory_end_set; |
87 | unsigned long __initdata memory_end; | 95 | unsigned long __initdata memory_end; |
88 | 96 | ||
97 | /* An array with a pointer to the lowcore of every CPU. */ | ||
98 | struct _lowcore *lowcore_ptr[NR_CPUS]; | ||
99 | EXPORT_SYMBOL(lowcore_ptr); | ||
100 | |||
89 | /* | 101 | /* |
90 | * This is set up by the setup-routine at boot-time | 102 | * This is set up by the setup-routine at boot-time |
91 | * for S390 need to find out, what we have to setup | 103 | * for S390 need to find out, what we have to setup |
@@ -109,13 +121,10 @@ static struct resource data_resource = { | |||
109 | */ | 121 | */ |
110 | void __cpuinit cpu_init(void) | 122 | void __cpuinit cpu_init(void) |
111 | { | 123 | { |
112 | int addr = hard_smp_processor_id(); | ||
113 | |||
114 | /* | 124 | /* |
115 | * Store processor id in lowcore (used e.g. in timer_interrupt) | 125 | * Store processor id in lowcore (used e.g. in timer_interrupt) |
116 | */ | 126 | */ |
117 | get_cpu_id(&S390_lowcore.cpu_data.cpu_id); | 127 | get_cpu_id(&S390_lowcore.cpu_id); |
118 | S390_lowcore.cpu_data.cpu_addr = addr; | ||
119 | 128 | ||
120 | /* | 129 | /* |
121 | * Force FPU initialization: | 130 | * Force FPU initialization: |
@@ -125,8 +134,7 @@ void __cpuinit cpu_init(void) | |||
125 | 134 | ||
126 | atomic_inc(&init_mm.mm_count); | 135 | atomic_inc(&init_mm.mm_count); |
127 | current->active_mm = &init_mm; | 136 | current->active_mm = &init_mm; |
128 | if (current->mm) | 137 | BUG_ON(current->mm); |
129 | BUG(); | ||
130 | enter_lazy_tlb(&init_mm, current); | 138 | enter_lazy_tlb(&init_mm, current); |
131 | } | 139 | } |
132 | 140 | ||
@@ -217,7 +225,7 @@ static void __init conmode_default(void) | |||
217 | } | 225 | } |
218 | } | 226 | } |
219 | 227 | ||
220 | #if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE) | 228 | #ifdef CONFIG_ZFCPDUMP |
221 | static void __init setup_zfcpdump(unsigned int console_devno) | 229 | static void __init setup_zfcpdump(unsigned int console_devno) |
222 | { | 230 | { |
223 | static char str[41]; | 231 | static char str[41]; |
@@ -289,11 +297,7 @@ static int __init early_parse_mem(char *p) | |||
289 | early_param("mem", early_parse_mem); | 297 | early_param("mem", early_parse_mem); |
290 | 298 | ||
291 | #ifdef CONFIG_S390_SWITCH_AMODE | 299 | #ifdef CONFIG_S390_SWITCH_AMODE |
292 | #ifdef CONFIG_PGSTE | ||
293 | unsigned int switch_amode = 1; | ||
294 | #else | ||
295 | unsigned int switch_amode = 0; | 300 | unsigned int switch_amode = 0; |
296 | #endif | ||
297 | EXPORT_SYMBOL_GPL(switch_amode); | 301 | EXPORT_SYMBOL_GPL(switch_amode); |
298 | 302 | ||
299 | static int set_amode_and_uaccess(unsigned long user_amode, | 303 | static int set_amode_and_uaccess(unsigned long user_amode, |
@@ -414,7 +418,6 @@ setup_lowcore(void) | |||
414 | PSW_ADDR_AMODE | (unsigned long) mcck_int_handler; | 418 | PSW_ADDR_AMODE | (unsigned long) mcck_int_handler; |
415 | lc->io_new_psw.mask = psw_kernel_bits; | 419 | lc->io_new_psw.mask = psw_kernel_bits; |
416 | lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler; | 420 | lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler; |
417 | lc->ipl_device = S390_lowcore.ipl_device; | ||
418 | lc->clock_comparator = -1ULL; | 421 | lc->clock_comparator = -1ULL; |
419 | lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE; | 422 | lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE; |
420 | lc->async_stack = (unsigned long) | 423 | lc->async_stack = (unsigned long) |
@@ -434,6 +437,7 @@ setup_lowcore(void) | |||
434 | lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0]; | 437 | lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0]; |
435 | #endif | 438 | #endif |
436 | set_prefix((u32)(unsigned long) lc); | 439 | set_prefix((u32)(unsigned long) lc); |
440 | lowcore_ptr[0] = lc; | ||
437 | } | 441 | } |
438 | 442 | ||
439 | static void __init | 443 | static void __init |
@@ -510,7 +514,7 @@ static void __init setup_memory_end(void) | |||
510 | unsigned long max_mem; | 514 | unsigned long max_mem; |
511 | int i; | 515 | int i; |
512 | 516 | ||
513 | #if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE) | 517 | #ifdef CONFIG_ZFCPDUMP |
514 | if (ipl_info.type == IPL_TYPE_FCP_DUMP) { | 518 | if (ipl_info.type == IPL_TYPE_FCP_DUMP) { |
515 | memory_end = ZFCPDUMP_HSA_SIZE; | 519 | memory_end = ZFCPDUMP_HSA_SIZE; |
516 | memory_end_set = 1; | 520 | memory_end_set = 1; |
@@ -677,7 +681,6 @@ setup_memory(void) | |||
677 | static void __init setup_hwcaps(void) | 681 | static void __init setup_hwcaps(void) |
678 | { | 682 | { |
679 | static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 }; | 683 | static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 }; |
680 | struct cpuinfo_S390 *cpuinfo = &S390_lowcore.cpu_data; | ||
681 | unsigned long long facility_list_extended; | 684 | unsigned long long facility_list_extended; |
682 | unsigned int facility_list; | 685 | unsigned int facility_list; |
683 | int i; | 686 | int i; |
@@ -693,15 +696,22 @@ static void __init setup_hwcaps(void) | |||
693 | * Bit 17: the message-security assist is installed | 696 | * Bit 17: the message-security assist is installed |
694 | * Bit 19: the long-displacement facility is installed | 697 | * Bit 19: the long-displacement facility is installed |
695 | * Bit 21: the extended-immediate facility is installed | 698 | * Bit 21: the extended-immediate facility is installed |
699 | * Bit 22: extended-translation facility 3 is installed | ||
700 | * Bit 30: extended-translation facility 3 enhancement facility | ||
696 | * These get translated to: | 701 | * These get translated to: |
697 | * HWCAP_S390_ESAN3 bit 0, HWCAP_S390_ZARCH bit 1, | 702 | * HWCAP_S390_ESAN3 bit 0, HWCAP_S390_ZARCH bit 1, |
698 | * HWCAP_S390_STFLE bit 2, HWCAP_S390_MSA bit 3, | 703 | * HWCAP_S390_STFLE bit 2, HWCAP_S390_MSA bit 3, |
699 | * HWCAP_S390_LDISP bit 4, and HWCAP_S390_EIMM bit 5. | 704 | * HWCAP_S390_LDISP bit 4, HWCAP_S390_EIMM bit 5 and |
705 | * HWCAP_S390_ETF3EH bit 8 (22 && 30). | ||
700 | */ | 706 | */ |
701 | for (i = 0; i < 6; i++) | 707 | for (i = 0; i < 6; i++) |
702 | if (facility_list & (1UL << (31 - stfl_bits[i]))) | 708 | if (facility_list & (1UL << (31 - stfl_bits[i]))) |
703 | elf_hwcap |= 1UL << i; | 709 | elf_hwcap |= 1UL << i; |
704 | 710 | ||
711 | if ((facility_list & (1UL << (31 - 22))) | ||
712 | && (facility_list & (1UL << (31 - 30)))) | ||
713 | elf_hwcap |= 1UL << 8; | ||
714 | |||
705 | /* | 715 | /* |
706 | * Check for additional facilities with store-facility-list-extended. | 716 | * Check for additional facilities with store-facility-list-extended. |
707 | * stfle stores doublewords (8 byte) with bit 1ULL<<63 as bit 0 | 717 | * stfle stores doublewords (8 byte) with bit 1ULL<<63 as bit 0 |
@@ -710,20 +720,22 @@ static void __init setup_hwcaps(void) | |||
710 | * How many facility words are stored depends on the number of | 720 | * How many facility words are stored depends on the number of |
711 | * doublewords passed to the instruction. The additional facilites | 721 | * doublewords passed to the instruction. The additional facilites |
712 | * are: | 722 | * are: |
713 | * Bit 43: decimal floating point facility is installed | 723 | * Bit 42: decimal floating point facility is installed |
724 | * Bit 44: perform floating point operation facility is installed | ||
714 | * translated to: | 725 | * translated to: |
715 | * HWCAP_S390_DFP bit 6. | 726 | * HWCAP_S390_DFP bit 6 (42 && 44). |
716 | */ | 727 | */ |
717 | if ((elf_hwcap & (1UL << 2)) && | 728 | if ((elf_hwcap & (1UL << 2)) && |
718 | __stfle(&facility_list_extended, 1) > 0) { | 729 | __stfle(&facility_list_extended, 1) > 0) { |
719 | if (facility_list_extended & (1ULL << (64 - 43))) | 730 | if ((facility_list_extended & (1ULL << (63 - 42))) |
731 | && (facility_list_extended & (1ULL << (63 - 44)))) | ||
720 | elf_hwcap |= 1UL << 6; | 732 | elf_hwcap |= 1UL << 6; |
721 | } | 733 | } |
722 | 734 | ||
723 | if (MACHINE_HAS_HPAGE) | 735 | if (MACHINE_HAS_HPAGE) |
724 | elf_hwcap |= 1UL << 7; | 736 | elf_hwcap |= 1UL << 7; |
725 | 737 | ||
726 | switch (cpuinfo->cpu_id.machine) { | 738 | switch (S390_lowcore.cpu_id.machine) { |
727 | case 0x9672: | 739 | case 0x9672: |
728 | #if !defined(CONFIG_64BIT) | 740 | #if !defined(CONFIG_64BIT) |
729 | default: /* Use "g5" as default for 31 bit kernels. */ | 741 | default: /* Use "g5" as default for 31 bit kernels. */ |
@@ -816,7 +828,7 @@ setup_arch(char **cmdline_p) | |||
816 | setup_lowcore(); | 828 | setup_lowcore(); |
817 | 829 | ||
818 | cpu_init(); | 830 | cpu_init(); |
819 | __cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr; | 831 | __cpu_logical_map[0] = stap(); |
820 | s390_init_cpu_topology(); | 832 | s390_init_cpu_topology(); |
821 | 833 | ||
822 | /* | 834 | /* |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 2d337cbb9329..006ed5016eb4 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/cache.h> | 33 | #include <linux/cache.h> |
34 | #include <linux/interrupt.h> | 34 | #include <linux/interrupt.h> |
35 | #include <linux/irqflags.h> | ||
35 | #include <linux/cpu.h> | 36 | #include <linux/cpu.h> |
36 | #include <linux/timex.h> | 37 | #include <linux/timex.h> |
37 | #include <linux/bootmem.h> | 38 | #include <linux/bootmem.h> |
@@ -50,12 +51,6 @@ | |||
50 | #include <asm/vdso.h> | 51 | #include <asm/vdso.h> |
51 | #include "entry.h" | 52 | #include "entry.h" |
52 | 53 | ||
53 | /* | ||
54 | * An array with a pointer the lowcore of every CPU. | ||
55 | */ | ||
56 | struct _lowcore *lowcore_ptr[NR_CPUS]; | ||
57 | EXPORT_SYMBOL(lowcore_ptr); | ||
58 | |||
59 | static struct task_struct *current_set[NR_CPUS]; | 54 | static struct task_struct *current_set[NR_CPUS]; |
60 | 55 | ||
61 | static u8 smp_cpu_type; | 56 | static u8 smp_cpu_type; |
@@ -81,9 +76,7 @@ void smp_send_stop(void) | |||
81 | 76 | ||
82 | /* Disable all interrupts/machine checks */ | 77 | /* Disable all interrupts/machine checks */ |
83 | __load_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK); | 78 | __load_psw_mask(psw_kernel_bits & ~PSW_MASK_MCHECK); |
84 | 79 | trace_hardirqs_off(); | |
85 | /* write magic number to zero page (absolute 0) */ | ||
86 | lowcore_ptr[smp_processor_id()]->panic_magic = __PANIC_MAGIC; | ||
87 | 80 | ||
88 | /* stop all processors */ | 81 | /* stop all processors */ |
89 | for_each_online_cpu(cpu) { | 82 | for_each_online_cpu(cpu) { |
@@ -233,7 +226,7 @@ EXPORT_SYMBOL(smp_ctl_clear_bit); | |||
233 | */ | 226 | */ |
234 | #define CPU_INIT_NO 1 | 227 | #define CPU_INIT_NO 1 |
235 | 228 | ||
236 | #if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE) | 229 | #ifdef CONFIG_ZFCPDUMP |
237 | 230 | ||
238 | /* | 231 | /* |
239 | * zfcpdump_prefix_array holds prefix registers for the following scenario: | 232 | * zfcpdump_prefix_array holds prefix registers for the following scenario: |
@@ -274,7 +267,7 @@ EXPORT_SYMBOL_GPL(zfcpdump_save_areas); | |||
274 | 267 | ||
275 | static inline void smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { } | 268 | static inline void smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) { } |
276 | 269 | ||
277 | #endif /* CONFIG_ZFCPDUMP || CONFIG_ZFCPDUMP_MODULE */ | 270 | #endif /* CONFIG_ZFCPDUMP */ |
278 | 271 | ||
279 | static int cpu_stopped(int cpu) | 272 | static int cpu_stopped(int cpu) |
280 | { | 273 | { |
@@ -304,8 +297,8 @@ static int smp_rescan_cpus_sigp(cpumask_t avail) | |||
304 | { | 297 | { |
305 | int cpu_id, logical_cpu; | 298 | int cpu_id, logical_cpu; |
306 | 299 | ||
307 | logical_cpu = first_cpu(avail); | 300 | logical_cpu = cpumask_first(&avail); |
308 | if (logical_cpu == NR_CPUS) | 301 | if (logical_cpu >= nr_cpu_ids) |
309 | return 0; | 302 | return 0; |
310 | for (cpu_id = 0; cpu_id <= 65535; cpu_id++) { | 303 | for (cpu_id = 0; cpu_id <= 65535; cpu_id++) { |
311 | if (cpu_known(cpu_id)) | 304 | if (cpu_known(cpu_id)) |
@@ -316,8 +309,8 @@ static int smp_rescan_cpus_sigp(cpumask_t avail) | |||
316 | continue; | 309 | continue; |
317 | cpu_set(logical_cpu, cpu_present_map); | 310 | cpu_set(logical_cpu, cpu_present_map); |
318 | smp_cpu_state[logical_cpu] = CPU_STATE_CONFIGURED; | 311 | smp_cpu_state[logical_cpu] = CPU_STATE_CONFIGURED; |
319 | logical_cpu = next_cpu(logical_cpu, avail); | 312 | logical_cpu = cpumask_next(logical_cpu, &avail); |
320 | if (logical_cpu == NR_CPUS) | 313 | if (logical_cpu >= nr_cpu_ids) |
321 | break; | 314 | break; |
322 | } | 315 | } |
323 | return 0; | 316 | return 0; |
@@ -329,8 +322,8 @@ static int smp_rescan_cpus_sclp(cpumask_t avail) | |||
329 | int cpu_id, logical_cpu, cpu; | 322 | int cpu_id, logical_cpu, cpu; |
330 | int rc; | 323 | int rc; |
331 | 324 | ||
332 | logical_cpu = first_cpu(avail); | 325 | logical_cpu = cpumask_first(&avail); |
333 | if (logical_cpu == NR_CPUS) | 326 | if (logical_cpu >= nr_cpu_ids) |
334 | return 0; | 327 | return 0; |
335 | info = kmalloc(sizeof(*info), GFP_KERNEL); | 328 | info = kmalloc(sizeof(*info), GFP_KERNEL); |
336 | if (!info) | 329 | if (!info) |
@@ -351,8 +344,8 @@ static int smp_rescan_cpus_sclp(cpumask_t avail) | |||
351 | smp_cpu_state[logical_cpu] = CPU_STATE_STANDBY; | 344 | smp_cpu_state[logical_cpu] = CPU_STATE_STANDBY; |
352 | else | 345 | else |
353 | smp_cpu_state[logical_cpu] = CPU_STATE_CONFIGURED; | 346 | smp_cpu_state[logical_cpu] = CPU_STATE_CONFIGURED; |
354 | logical_cpu = next_cpu(logical_cpu, avail); | 347 | logical_cpu = cpumask_next(logical_cpu, &avail); |
355 | if (logical_cpu == NR_CPUS) | 348 | if (logical_cpu >= nr_cpu_ids) |
356 | break; | 349 | break; |
357 | } | 350 | } |
358 | out: | 351 | out: |
@@ -379,7 +372,7 @@ static void __init smp_detect_cpus(void) | |||
379 | 372 | ||
380 | c_cpus = 1; | 373 | c_cpus = 1; |
381 | s_cpus = 0; | 374 | s_cpus = 0; |
382 | boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; | 375 | boot_cpu_addr = __cpu_logical_map[0]; |
383 | info = kmalloc(sizeof(*info), GFP_KERNEL); | 376 | info = kmalloc(sizeof(*info), GFP_KERNEL); |
384 | if (!info) | 377 | if (!info) |
385 | panic("smp_detect_cpus failed to allocate memory\n"); | 378 | panic("smp_detect_cpus failed to allocate memory\n"); |
@@ -453,7 +446,7 @@ int __cpuinit start_secondary(void *cpuvoid) | |||
453 | /* Switch on interrupts */ | 446 | /* Switch on interrupts */ |
454 | local_irq_enable(); | 447 | local_irq_enable(); |
455 | /* Print info about this processor */ | 448 | /* Print info about this processor */ |
456 | print_cpu_info(&S390_lowcore.cpu_data); | 449 | print_cpu_info(); |
457 | /* cpu_idle will call schedule for us */ | 450 | /* cpu_idle will call schedule for us */ |
458 | cpu_idle(); | 451 | cpu_idle(); |
459 | return 0; | 452 | return 0; |
@@ -515,7 +508,6 @@ out: | |||
515 | return -ENOMEM; | 508 | return -ENOMEM; |
516 | } | 509 | } |
517 | 510 | ||
518 | #ifdef CONFIG_HOTPLUG_CPU | ||
519 | static void smp_free_lowcore(int cpu) | 511 | static void smp_free_lowcore(int cpu) |
520 | { | 512 | { |
521 | struct _lowcore *lowcore; | 513 | struct _lowcore *lowcore; |
@@ -534,7 +526,6 @@ static void smp_free_lowcore(int cpu) | |||
534 | free_pages((unsigned long) lowcore, lc_order); | 526 | free_pages((unsigned long) lowcore, lc_order); |
535 | lowcore_ptr[cpu] = NULL; | 527 | lowcore_ptr[cpu] = NULL; |
536 | } | 528 | } |
537 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
538 | 529 | ||
539 | /* Upping and downing of CPUs */ | 530 | /* Upping and downing of CPUs */ |
540 | int __cpuinit __cpu_up(unsigned int cpu) | 531 | int __cpuinit __cpu_up(unsigned int cpu) |
@@ -543,16 +534,23 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
543 | struct _lowcore *cpu_lowcore; | 534 | struct _lowcore *cpu_lowcore; |
544 | struct stack_frame *sf; | 535 | struct stack_frame *sf; |
545 | sigp_ccode ccode; | 536 | sigp_ccode ccode; |
537 | u32 lowcore; | ||
546 | 538 | ||
547 | if (smp_cpu_state[cpu] != CPU_STATE_CONFIGURED) | 539 | if (smp_cpu_state[cpu] != CPU_STATE_CONFIGURED) |
548 | return -EIO; | 540 | return -EIO; |
549 | if (smp_alloc_lowcore(cpu)) | 541 | if (smp_alloc_lowcore(cpu)) |
550 | return -ENOMEM; | 542 | return -ENOMEM; |
551 | 543 | do { | |
552 | ccode = signal_processor_p((__u32)(unsigned long)(lowcore_ptr[cpu]), | 544 | ccode = signal_processor(cpu, sigp_initial_cpu_reset); |
553 | cpu, sigp_set_prefix); | 545 | if (ccode == sigp_busy) |
554 | if (ccode) | 546 | udelay(10); |
555 | return -EIO; | 547 | if (ccode == sigp_not_operational) |
548 | goto err_out; | ||
549 | } while (ccode == sigp_busy); | ||
550 | |||
551 | lowcore = (u32)(unsigned long)lowcore_ptr[cpu]; | ||
552 | while (signal_processor_p(lowcore, cpu, sigp_set_prefix) == sigp_busy) | ||
553 | udelay(10); | ||
556 | 554 | ||
557 | idle = current_set[cpu]; | 555 | idle = current_set[cpu]; |
558 | cpu_lowcore = lowcore_ptr[cpu]; | 556 | cpu_lowcore = lowcore_ptr[cpu]; |
@@ -571,9 +569,8 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
571 | : : "a" (&cpu_lowcore->access_regs_save_area) : "memory"); | 569 | : : "a" (&cpu_lowcore->access_regs_save_area) : "memory"); |
572 | cpu_lowcore->percpu_offset = __per_cpu_offset[cpu]; | 570 | cpu_lowcore->percpu_offset = __per_cpu_offset[cpu]; |
573 | cpu_lowcore->current_task = (unsigned long) idle; | 571 | cpu_lowcore->current_task = (unsigned long) idle; |
574 | cpu_lowcore->cpu_data.cpu_nr = cpu; | 572 | cpu_lowcore->cpu_nr = cpu; |
575 | cpu_lowcore->kernel_asce = S390_lowcore.kernel_asce; | 573 | cpu_lowcore->kernel_asce = S390_lowcore.kernel_asce; |
576 | cpu_lowcore->ipl_device = S390_lowcore.ipl_device; | ||
577 | eieio(); | 574 | eieio(); |
578 | 575 | ||
579 | while (signal_processor(cpu, sigp_restart) == sigp_busy) | 576 | while (signal_processor(cpu, sigp_restart) == sigp_busy) |
@@ -582,6 +579,10 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
582 | while (!cpu_online(cpu)) | 579 | while (!cpu_online(cpu)) |
583 | cpu_relax(); | 580 | cpu_relax(); |
584 | return 0; | 581 | return 0; |
582 | |||
583 | err_out: | ||
584 | smp_free_lowcore(cpu); | ||
585 | return -EIO; | ||
585 | } | 586 | } |
586 | 587 | ||
587 | static int __init setup_possible_cpus(char *s) | 588 | static int __init setup_possible_cpus(char *s) |
@@ -589,9 +590,8 @@ static int __init setup_possible_cpus(char *s) | |||
589 | int pcpus, cpu; | 590 | int pcpus, cpu; |
590 | 591 | ||
591 | pcpus = simple_strtoul(s, NULL, 0); | 592 | pcpus = simple_strtoul(s, NULL, 0); |
592 | cpu_possible_map = cpumask_of_cpu(0); | 593 | for (cpu = 0; cpu < pcpus && cpu < nr_cpu_ids; cpu++) |
593 | for (cpu = 1; cpu < pcpus && cpu < NR_CPUS; cpu++) | 594 | set_cpu_possible(cpu, true); |
594 | cpu_set(cpu, cpu_possible_map); | ||
595 | return 0; | 595 | return 0; |
596 | } | 596 | } |
597 | early_param("possible_cpus", setup_possible_cpus); | 597 | early_param("possible_cpus", setup_possible_cpus); |
@@ -663,7 +663,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
663 | /* request the 0x1201 emergency signal external interrupt */ | 663 | /* request the 0x1201 emergency signal external interrupt */ |
664 | if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0) | 664 | if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0) |
665 | panic("Couldn't request external interrupt 0x1201"); | 665 | panic("Couldn't request external interrupt 0x1201"); |
666 | print_cpu_info(&S390_lowcore.cpu_data); | 666 | print_cpu_info(); |
667 | 667 | ||
668 | /* Reallocate current lowcore, but keep its contents. */ | 668 | /* Reallocate current lowcore, but keep its contents. */ |
669 | lc_order = sizeof(long) == 8 ? 1 : 0; | 669 | lc_order = sizeof(long) == 8 ? 1 : 0; |
diff --git a/arch/s390/kernel/sysinfo.c b/arch/s390/kernel/sysinfo.c new file mode 100644 index 000000000000..b5e75e1061c8 --- /dev/null +++ b/arch/s390/kernel/sysinfo.c | |||
@@ -0,0 +1,428 @@ | |||
1 | /* | ||
2 | * Copyright IBM Corp. 2001, 2009 | ||
3 | * Author(s): Ulrich Weigand <Ulrich.Weigand@de.ibm.com>, | ||
4 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, | ||
5 | */ | ||
6 | |||
7 | #include <linux/kernel.h> | ||
8 | #include <linux/mm.h> | ||
9 | #include <linux/proc_fs.h> | ||
10 | #include <linux/seq_file.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/delay.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <asm/ebcdic.h> | ||
15 | #include <asm/sysinfo.h> | ||
16 | #include <asm/cpcmd.h> | ||
17 | |||
18 | /* Sigh, math-emu. Don't ask. */ | ||
19 | #include <asm/sfp-util.h> | ||
20 | #include <math-emu/soft-fp.h> | ||
21 | #include <math-emu/single.h> | ||
22 | |||
23 | static inline int stsi_0(void) | ||
24 | { | ||
25 | int rc = stsi(NULL, 0, 0, 0); | ||
26 | return rc == -ENOSYS ? rc : (((unsigned int) rc) >> 28); | ||
27 | } | ||
28 | |||
29 | static int stsi_1_1_1(struct sysinfo_1_1_1 *info, char *page, int len) | ||
30 | { | ||
31 | if (stsi(info, 1, 1, 1) == -ENOSYS) | ||
32 | return len; | ||
33 | |||
34 | EBCASC(info->manufacturer, sizeof(info->manufacturer)); | ||
35 | EBCASC(info->type, sizeof(info->type)); | ||
36 | EBCASC(info->model, sizeof(info->model)); | ||
37 | EBCASC(info->sequence, sizeof(info->sequence)); | ||
38 | EBCASC(info->plant, sizeof(info->plant)); | ||
39 | EBCASC(info->model_capacity, sizeof(info->model_capacity)); | ||
40 | EBCASC(info->model_perm_cap, sizeof(info->model_perm_cap)); | ||
41 | EBCASC(info->model_temp_cap, sizeof(info->model_temp_cap)); | ||
42 | len += sprintf(page + len, "Manufacturer: %-16.16s\n", | ||
43 | info->manufacturer); | ||
44 | len += sprintf(page + len, "Type: %-4.4s\n", | ||
45 | info->type); | ||
46 | if (info->model[0] != '\0') | ||
47 | /* | ||
48 | * Sigh: the model field has been renamed with System z9 | ||
49 | * to model_capacity and a new model field has been added | ||
50 | * after the plant field. To avoid confusing older programs | ||
51 | * the "Model:" prints "model_capacity model" or just | ||
52 | * "model_capacity" if the model string is empty . | ||
53 | */ | ||
54 | len += sprintf(page + len, | ||
55 | "Model: %-16.16s %-16.16s\n", | ||
56 | info->model_capacity, info->model); | ||
57 | else | ||
58 | len += sprintf(page + len, "Model: %-16.16s\n", | ||
59 | info->model_capacity); | ||
60 | len += sprintf(page + len, "Sequence Code: %-16.16s\n", | ||
61 | info->sequence); | ||
62 | len += sprintf(page + len, "Plant: %-4.4s\n", | ||
63 | info->plant); | ||
64 | len += sprintf(page + len, "Model Capacity: %-16.16s %08u\n", | ||
65 | info->model_capacity, *(u32 *) info->model_cap_rating); | ||
66 | if (info->model_perm_cap[0] != '\0') | ||
67 | len += sprintf(page + len, | ||
68 | "Model Perm. Capacity: %-16.16s %08u\n", | ||
69 | info->model_perm_cap, | ||
70 | *(u32 *) info->model_perm_cap_rating); | ||
71 | if (info->model_temp_cap[0] != '\0') | ||
72 | len += sprintf(page + len, | ||
73 | "Model Temp. Capacity: %-16.16s %08u\n", | ||
74 | info->model_temp_cap, | ||
75 | *(u32 *) info->model_temp_cap_rating); | ||
76 | return len; | ||
77 | } | ||
78 | |||
79 | static int stsi_1_2_2(struct sysinfo_1_2_2 *info, char *page, int len) | ||
80 | { | ||
81 | struct sysinfo_1_2_2_extension *ext; | ||
82 | int i; | ||
83 | |||
84 | if (stsi(info, 1, 2, 2) == -ENOSYS) | ||
85 | return len; | ||
86 | ext = (struct sysinfo_1_2_2_extension *) | ||
87 | ((unsigned long) info + info->acc_offset); | ||
88 | |||
89 | len += sprintf(page + len, "\n"); | ||
90 | len += sprintf(page + len, "CPUs Total: %d\n", | ||
91 | info->cpus_total); | ||
92 | len += sprintf(page + len, "CPUs Configured: %d\n", | ||
93 | info->cpus_configured); | ||
94 | len += sprintf(page + len, "CPUs Standby: %d\n", | ||
95 | info->cpus_standby); | ||
96 | len += sprintf(page + len, "CPUs Reserved: %d\n", | ||
97 | info->cpus_reserved); | ||
98 | |||
99 | if (info->format == 1) { | ||
100 | /* | ||
101 | * Sigh 2. According to the specification the alternate | ||
102 | * capability field is a 32 bit floating point number | ||
103 | * if the higher order 8 bits are not zero. Printing | ||
104 | * a floating point number in the kernel is a no-no, | ||
105 | * always print the number as 32 bit unsigned integer. | ||
106 | * The user-space needs to know about the strange | ||
107 | * encoding of the alternate cpu capability. | ||
108 | */ | ||
109 | len += sprintf(page + len, "Capability: %u %u\n", | ||
110 | info->capability, ext->alt_capability); | ||
111 | for (i = 2; i <= info->cpus_total; i++) | ||
112 | len += sprintf(page + len, | ||
113 | "Adjustment %02d-way: %u %u\n", | ||
114 | i, info->adjustment[i-2], | ||
115 | ext->alt_adjustment[i-2]); | ||
116 | |||
117 | } else { | ||
118 | len += sprintf(page + len, "Capability: %u\n", | ||
119 | info->capability); | ||
120 | for (i = 2; i <= info->cpus_total; i++) | ||
121 | len += sprintf(page + len, | ||
122 | "Adjustment %02d-way: %u\n", | ||
123 | i, info->adjustment[i-2]); | ||
124 | } | ||
125 | |||
126 | if (info->secondary_capability != 0) | ||
127 | len += sprintf(page + len, "Secondary Capability: %d\n", | ||
128 | info->secondary_capability); | ||
129 | return len; | ||
130 | } | ||
131 | |||
132 | static int stsi_2_2_2(struct sysinfo_2_2_2 *info, char *page, int len) | ||
133 | { | ||
134 | if (stsi(info, 2, 2, 2) == -ENOSYS) | ||
135 | return len; | ||
136 | |||
137 | EBCASC(info->name, sizeof(info->name)); | ||
138 | |||
139 | len += sprintf(page + len, "\n"); | ||
140 | len += sprintf(page + len, "LPAR Number: %d\n", | ||
141 | info->lpar_number); | ||
142 | |||
143 | len += sprintf(page + len, "LPAR Characteristics: "); | ||
144 | if (info->characteristics & LPAR_CHAR_DEDICATED) | ||
145 | len += sprintf(page + len, "Dedicated "); | ||
146 | if (info->characteristics & LPAR_CHAR_SHARED) | ||
147 | len += sprintf(page + len, "Shared "); | ||
148 | if (info->characteristics & LPAR_CHAR_LIMITED) | ||
149 | len += sprintf(page + len, "Limited "); | ||
150 | len += sprintf(page + len, "\n"); | ||
151 | |||
152 | len += sprintf(page + len, "LPAR Name: %-8.8s\n", | ||
153 | info->name); | ||
154 | |||
155 | len += sprintf(page + len, "LPAR Adjustment: %d\n", | ||
156 | info->caf); | ||
157 | |||
158 | len += sprintf(page + len, "LPAR CPUs Total: %d\n", | ||
159 | info->cpus_total); | ||
160 | len += sprintf(page + len, "LPAR CPUs Configured: %d\n", | ||
161 | info->cpus_configured); | ||
162 | len += sprintf(page + len, "LPAR CPUs Standby: %d\n", | ||
163 | info->cpus_standby); | ||
164 | len += sprintf(page + len, "LPAR CPUs Reserved: %d\n", | ||
165 | info->cpus_reserved); | ||
166 | len += sprintf(page + len, "LPAR CPUs Dedicated: %d\n", | ||
167 | info->cpus_dedicated); | ||
168 | len += sprintf(page + len, "LPAR CPUs Shared: %d\n", | ||
169 | info->cpus_shared); | ||
170 | return len; | ||
171 | } | ||
172 | |||
173 | static int stsi_3_2_2(struct sysinfo_3_2_2 *info, char *page, int len) | ||
174 | { | ||
175 | int i; | ||
176 | |||
177 | if (stsi(info, 3, 2, 2) == -ENOSYS) | ||
178 | return len; | ||
179 | for (i = 0; i < info->count; i++) { | ||
180 | EBCASC(info->vm[i].name, sizeof(info->vm[i].name)); | ||
181 | EBCASC(info->vm[i].cpi, sizeof(info->vm[i].cpi)); | ||
182 | len += sprintf(page + len, "\n"); | ||
183 | len += sprintf(page + len, "VM%02d Name: %-8.8s\n", | ||
184 | i, info->vm[i].name); | ||
185 | len += sprintf(page + len, "VM%02d Control Program: %-16.16s\n", | ||
186 | i, info->vm[i].cpi); | ||
187 | |||
188 | len += sprintf(page + len, "VM%02d Adjustment: %d\n", | ||
189 | i, info->vm[i].caf); | ||
190 | |||
191 | len += sprintf(page + len, "VM%02d CPUs Total: %d\n", | ||
192 | i, info->vm[i].cpus_total); | ||
193 | len += sprintf(page + len, "VM%02d CPUs Configured: %d\n", | ||
194 | i, info->vm[i].cpus_configured); | ||
195 | len += sprintf(page + len, "VM%02d CPUs Standby: %d\n", | ||
196 | i, info->vm[i].cpus_standby); | ||
197 | len += sprintf(page + len, "VM%02d CPUs Reserved: %d\n", | ||
198 | i, info->vm[i].cpus_reserved); | ||
199 | } | ||
200 | return len; | ||
201 | } | ||
202 | |||
203 | static int proc_read_sysinfo(char *page, char **start, | ||
204 | off_t off, int count, | ||
205 | int *eof, void *data) | ||
206 | { | ||
207 | unsigned long info = get_zeroed_page(GFP_KERNEL); | ||
208 | int level, len; | ||
209 | |||
210 | if (!info) | ||
211 | return 0; | ||
212 | |||
213 | len = 0; | ||
214 | level = stsi_0(); | ||
215 | if (level >= 1) | ||
216 | len = stsi_1_1_1((struct sysinfo_1_1_1 *) info, page, len); | ||
217 | |||
218 | if (level >= 1) | ||
219 | len = stsi_1_2_2((struct sysinfo_1_2_2 *) info, page, len); | ||
220 | |||
221 | if (level >= 2) | ||
222 | len = stsi_2_2_2((struct sysinfo_2_2_2 *) info, page, len); | ||
223 | |||
224 | if (level >= 3) | ||
225 | len = stsi_3_2_2((struct sysinfo_3_2_2 *) info, page, len); | ||
226 | |||
227 | free_page(info); | ||
228 | return len; | ||
229 | } | ||
230 | |||
231 | static __init int create_proc_sysinfo(void) | ||
232 | { | ||
233 | create_proc_read_entry("sysinfo", 0444, NULL, | ||
234 | proc_read_sysinfo, NULL); | ||
235 | return 0; | ||
236 | } | ||
237 | device_initcall(create_proc_sysinfo); | ||
238 | |||
239 | /* | ||
240 | * Service levels interface. | ||
241 | */ | ||
242 | |||
243 | static DECLARE_RWSEM(service_level_sem); | ||
244 | static LIST_HEAD(service_level_list); | ||
245 | |||
246 | int register_service_level(struct service_level *slr) | ||
247 | { | ||
248 | struct service_level *ptr; | ||
249 | |||
250 | down_write(&service_level_sem); | ||
251 | list_for_each_entry(ptr, &service_level_list, list) | ||
252 | if (ptr == slr) { | ||
253 | up_write(&service_level_sem); | ||
254 | return -EEXIST; | ||
255 | } | ||
256 | list_add_tail(&slr->list, &service_level_list); | ||
257 | up_write(&service_level_sem); | ||
258 | return 0; | ||
259 | } | ||
260 | EXPORT_SYMBOL(register_service_level); | ||
261 | |||
262 | int unregister_service_level(struct service_level *slr) | ||
263 | { | ||
264 | struct service_level *ptr, *next; | ||
265 | int rc = -ENOENT; | ||
266 | |||
267 | down_write(&service_level_sem); | ||
268 | list_for_each_entry_safe(ptr, next, &service_level_list, list) { | ||
269 | if (ptr != slr) | ||
270 | continue; | ||
271 | list_del(&ptr->list); | ||
272 | rc = 0; | ||
273 | break; | ||
274 | } | ||
275 | up_write(&service_level_sem); | ||
276 | return rc; | ||
277 | } | ||
278 | EXPORT_SYMBOL(unregister_service_level); | ||
279 | |||
280 | static void *service_level_start(struct seq_file *m, loff_t *pos) | ||
281 | { | ||
282 | down_read(&service_level_sem); | ||
283 | return seq_list_start(&service_level_list, *pos); | ||
284 | } | ||
285 | |||
286 | static void *service_level_next(struct seq_file *m, void *p, loff_t *pos) | ||
287 | { | ||
288 | return seq_list_next(p, &service_level_list, pos); | ||
289 | } | ||
290 | |||
291 | static void service_level_stop(struct seq_file *m, void *p) | ||
292 | { | ||
293 | up_read(&service_level_sem); | ||
294 | } | ||
295 | |||
296 | static int service_level_show(struct seq_file *m, void *p) | ||
297 | { | ||
298 | struct service_level *slr; | ||
299 | |||
300 | slr = list_entry(p, struct service_level, list); | ||
301 | slr->seq_print(m, slr); | ||
302 | return 0; | ||
303 | } | ||
304 | |||
305 | static const struct seq_operations service_level_seq_ops = { | ||
306 | .start = service_level_start, | ||
307 | .next = service_level_next, | ||
308 | .stop = service_level_stop, | ||
309 | .show = service_level_show | ||
310 | }; | ||
311 | |||
312 | static int service_level_open(struct inode *inode, struct file *file) | ||
313 | { | ||
314 | return seq_open(file, &service_level_seq_ops); | ||
315 | } | ||
316 | |||
317 | static const struct file_operations service_level_ops = { | ||
318 | .open = service_level_open, | ||
319 | .read = seq_read, | ||
320 | .llseek = seq_lseek, | ||
321 | .release = seq_release | ||
322 | }; | ||
323 | |||
324 | static void service_level_vm_print(struct seq_file *m, | ||
325 | struct service_level *slr) | ||
326 | { | ||
327 | char *query_buffer, *str; | ||
328 | |||
329 | query_buffer = kmalloc(1024, GFP_KERNEL | GFP_DMA); | ||
330 | if (!query_buffer) | ||
331 | return; | ||
332 | cpcmd("QUERY CPLEVEL", query_buffer, 1024, NULL); | ||
333 | str = strchr(query_buffer, '\n'); | ||
334 | if (str) | ||
335 | *str = 0; | ||
336 | seq_printf(m, "VM: %s\n", query_buffer); | ||
337 | kfree(query_buffer); | ||
338 | } | ||
339 | |||
340 | static struct service_level service_level_vm = { | ||
341 | .seq_print = service_level_vm_print | ||
342 | }; | ||
343 | |||
344 | static __init int create_proc_service_level(void) | ||
345 | { | ||
346 | proc_create("service_levels", 0, NULL, &service_level_ops); | ||
347 | if (MACHINE_IS_VM) | ||
348 | register_service_level(&service_level_vm); | ||
349 | return 0; | ||
350 | } | ||
351 | subsys_initcall(create_proc_service_level); | ||
352 | |||
353 | /* | ||
354 | * Bogomips calculation based on cpu capability. | ||
355 | */ | ||
356 | int get_cpu_capability(unsigned int *capability) | ||
357 | { | ||
358 | struct sysinfo_1_2_2 *info; | ||
359 | int rc; | ||
360 | |||
361 | info = (void *) get_zeroed_page(GFP_KERNEL); | ||
362 | if (!info) | ||
363 | return -ENOMEM; | ||
364 | rc = stsi(info, 1, 2, 2); | ||
365 | if (rc == -ENOSYS) | ||
366 | goto out; | ||
367 | rc = 0; | ||
368 | *capability = info->capability; | ||
369 | out: | ||
370 | free_page((unsigned long) info); | ||
371 | return rc; | ||
372 | } | ||
373 | |||
374 | /* | ||
375 | * CPU capability might have changed. Therefore recalculate loops_per_jiffy. | ||
376 | */ | ||
377 | void s390_adjust_jiffies(void) | ||
378 | { | ||
379 | struct sysinfo_1_2_2 *info; | ||
380 | const unsigned int fmil = 0x4b189680; /* 1e7 as 32-bit float. */ | ||
381 | FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR); | ||
382 | FP_DECL_EX; | ||
383 | unsigned int capability; | ||
384 | |||
385 | info = (void *) get_zeroed_page(GFP_KERNEL); | ||
386 | if (!info) | ||
387 | return; | ||
388 | |||
389 | if (stsi(info, 1, 2, 2) != -ENOSYS) { | ||
390 | /* | ||
391 | * Major sigh. The cpu capability encoding is "special". | ||
392 | * If the first 9 bits of info->capability are 0 then it | ||
393 | * is a 32 bit unsigned integer in the range 0 .. 2^23. | ||
394 | * If the first 9 bits are != 0 then it is a 32 bit float. | ||
395 | * In addition a lower value indicates a proportionally | ||
396 | * higher cpu capacity. Bogomips are the other way round. | ||
397 | * To get to a halfway suitable number we divide 1e7 | ||
398 | * by the cpu capability number. Yes, that means a floating | ||
399 | * point division .. math-emu here we come :-) | ||
400 | */ | ||
401 | FP_UNPACK_SP(SA, &fmil); | ||
402 | if ((info->capability >> 23) == 0) | ||
403 | FP_FROM_INT_S(SB, info->capability, 32, int); | ||
404 | else | ||
405 | FP_UNPACK_SP(SB, &info->capability); | ||
406 | FP_DIV_S(SR, SA, SB); | ||
407 | FP_TO_INT_S(capability, SR, 32, 0); | ||
408 | } else | ||
409 | /* | ||
410 | * Really old machine without stsi block for basic | ||
411 | * cpu information. Report 42.0 bogomips. | ||
412 | */ | ||
413 | capability = 42; | ||
414 | loops_per_jiffy = capability * (500000/HZ); | ||
415 | free_page((unsigned long) info); | ||
416 | } | ||
417 | |||
418 | /* | ||
419 | * calibrate the delay loop | ||
420 | */ | ||
421 | void __cpuinit calibrate_delay(void) | ||
422 | { | ||
423 | s390_adjust_jiffies(); | ||
424 | /* Print the good old Bogomips line .. */ | ||
425 | printk(KERN_DEBUG "Calibrating delay loop (skipped)... " | ||
426 | "%lu.%02lu BogoMIPS preset\n", loops_per_jiffy/(500000/HZ), | ||
427 | (loops_per_jiffy/(5000/HZ)) % 100); | ||
428 | } | ||
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index fc468cae4460..f72d41068dc2 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -331,6 +331,7 @@ static unsigned long long adjust_time(unsigned long long old, | |||
331 | } | 331 | } |
332 | 332 | ||
333 | static DEFINE_PER_CPU(atomic_t, clock_sync_word); | 333 | static DEFINE_PER_CPU(atomic_t, clock_sync_word); |
334 | static DEFINE_MUTEX(clock_sync_mutex); | ||
334 | static unsigned long clock_sync_flags; | 335 | static unsigned long clock_sync_flags; |
335 | 336 | ||
336 | #define CLOCK_SYNC_HAS_ETR 0 | 337 | #define CLOCK_SYNC_HAS_ETR 0 |
@@ -394,6 +395,20 @@ static void enable_sync_clock(void) | |||
394 | atomic_set_mask(0x80000000, sw_ptr); | 395 | atomic_set_mask(0x80000000, sw_ptr); |
395 | } | 396 | } |
396 | 397 | ||
398 | /* | ||
399 | * Function to check if the clock is in sync. | ||
400 | */ | ||
401 | static inline int check_sync_clock(void) | ||
402 | { | ||
403 | atomic_t *sw_ptr; | ||
404 | int rc; | ||
405 | |||
406 | sw_ptr = &get_cpu_var(clock_sync_word); | ||
407 | rc = (atomic_read(sw_ptr) & 0x80000000U) != 0; | ||
408 | put_cpu_var(clock_sync_sync); | ||
409 | return rc; | ||
410 | } | ||
411 | |||
397 | /* Single threaded workqueue used for etr and stp sync events */ | 412 | /* Single threaded workqueue used for etr and stp sync events */ |
398 | static struct workqueue_struct *time_sync_wq; | 413 | static struct workqueue_struct *time_sync_wq; |
399 | 414 | ||
@@ -485,6 +500,8 @@ static void etr_reset(void) | |||
485 | if (etr_setr(&etr_eacr) == 0) { | 500 | if (etr_setr(&etr_eacr) == 0) { |
486 | etr_tolec = get_clock(); | 501 | etr_tolec = get_clock(); |
487 | set_bit(CLOCK_SYNC_HAS_ETR, &clock_sync_flags); | 502 | set_bit(CLOCK_SYNC_HAS_ETR, &clock_sync_flags); |
503 | if (etr_port0_online && etr_port1_online) | ||
504 | set_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
488 | } else if (etr_port0_online || etr_port1_online) { | 505 | } else if (etr_port0_online || etr_port1_online) { |
489 | pr_warning("The real or virtual hardware system does " | 506 | pr_warning("The real or virtual hardware system does " |
490 | "not provide an ETR interface\n"); | 507 | "not provide an ETR interface\n"); |
@@ -533,8 +550,7 @@ void etr_switch_to_local(void) | |||
533 | { | 550 | { |
534 | if (!etr_eacr.sl) | 551 | if (!etr_eacr.sl) |
535 | return; | 552 | return; |
536 | if (test_bit(CLOCK_SYNC_ETR, &clock_sync_flags)) | 553 | disable_sync_clock(NULL); |
537 | disable_sync_clock(NULL); | ||
538 | set_bit(ETR_EVENT_SWITCH_LOCAL, &etr_events); | 554 | set_bit(ETR_EVENT_SWITCH_LOCAL, &etr_events); |
539 | queue_work(time_sync_wq, &etr_work); | 555 | queue_work(time_sync_wq, &etr_work); |
540 | } | 556 | } |
@@ -549,8 +565,7 @@ void etr_sync_check(void) | |||
549 | { | 565 | { |
550 | if (!etr_eacr.es) | 566 | if (!etr_eacr.es) |
551 | return; | 567 | return; |
552 | if (test_bit(CLOCK_SYNC_ETR, &clock_sync_flags)) | 568 | disable_sync_clock(NULL); |
553 | disable_sync_clock(NULL); | ||
554 | set_bit(ETR_EVENT_SYNC_CHECK, &etr_events); | 569 | set_bit(ETR_EVENT_SYNC_CHECK, &etr_events); |
555 | queue_work(time_sync_wq, &etr_work); | 570 | queue_work(time_sync_wq, &etr_work); |
556 | } | 571 | } |
@@ -914,7 +929,7 @@ static struct etr_eacr etr_handle_update(struct etr_aib *aib, | |||
914 | * Do not try to get the alternate port aib if the clock | 929 | * Do not try to get the alternate port aib if the clock |
915 | * is not in sync yet. | 930 | * is not in sync yet. |
916 | */ | 931 | */ |
917 | if (!test_bit(CLOCK_SYNC_STP, &clock_sync_flags) && !eacr.es) | 932 | if (!check_sync_clock()) |
918 | return eacr; | 933 | return eacr; |
919 | 934 | ||
920 | /* | 935 | /* |
@@ -997,7 +1012,6 @@ static void etr_work_fn(struct work_struct *work) | |||
997 | on_each_cpu(disable_sync_clock, NULL, 1); | 1012 | on_each_cpu(disable_sync_clock, NULL, 1); |
998 | del_timer_sync(&etr_timer); | 1013 | del_timer_sync(&etr_timer); |
999 | etr_update_eacr(eacr); | 1014 | etr_update_eacr(eacr); |
1000 | clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1001 | goto out_unlock; | 1015 | goto out_unlock; |
1002 | } | 1016 | } |
1003 | 1017 | ||
@@ -1071,18 +1085,13 @@ static void etr_work_fn(struct work_struct *work) | |||
1071 | /* Both ports not usable. */ | 1085 | /* Both ports not usable. */ |
1072 | eacr.es = eacr.sl = 0; | 1086 | eacr.es = eacr.sl = 0; |
1073 | sync_port = -1; | 1087 | sync_port = -1; |
1074 | clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1075 | } | 1088 | } |
1076 | 1089 | ||
1077 | if (!test_bit(CLOCK_SYNC_ETR, &clock_sync_flags)) | ||
1078 | eacr.es = 0; | ||
1079 | |||
1080 | /* | 1090 | /* |
1081 | * If the clock is in sync just update the eacr and return. | 1091 | * If the clock is in sync just update the eacr and return. |
1082 | * If there is no valid sync port wait for a port update. | 1092 | * If there is no valid sync port wait for a port update. |
1083 | */ | 1093 | */ |
1084 | if (test_bit(CLOCK_SYNC_STP, &clock_sync_flags) || | 1094 | if (check_sync_clock() || sync_port < 0) { |
1085 | eacr.es || sync_port < 0) { | ||
1086 | etr_update_eacr(eacr); | 1095 | etr_update_eacr(eacr); |
1087 | etr_set_tolec_timeout(now); | 1096 | etr_set_tolec_timeout(now); |
1088 | goto out_unlock; | 1097 | goto out_unlock; |
@@ -1103,13 +1112,11 @@ static void etr_work_fn(struct work_struct *work) | |||
1103 | * and set up a timer to try again after 0.5 seconds | 1112 | * and set up a timer to try again after 0.5 seconds |
1104 | */ | 1113 | */ |
1105 | etr_update_eacr(eacr); | 1114 | etr_update_eacr(eacr); |
1106 | set_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1107 | if (now < etr_tolec + (1600000 << 12) || | 1115 | if (now < etr_tolec + (1600000 << 12) || |
1108 | etr_sync_clock_stop(&aib, sync_port) != 0) { | 1116 | etr_sync_clock_stop(&aib, sync_port) != 0) { |
1109 | /* Sync failed. Try again in 1/2 second. */ | 1117 | /* Sync failed. Try again in 1/2 second. */ |
1110 | eacr.es = 0; | 1118 | eacr.es = 0; |
1111 | etr_update_eacr(eacr); | 1119 | etr_update_eacr(eacr); |
1112 | clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1113 | etr_set_sync_timeout(); | 1120 | etr_set_sync_timeout(); |
1114 | } else | 1121 | } else |
1115 | etr_set_tolec_timeout(now); | 1122 | etr_set_tolec_timeout(now); |
@@ -1191,19 +1198,30 @@ static ssize_t etr_online_store(struct sys_device *dev, | |||
1191 | return -EINVAL; | 1198 | return -EINVAL; |
1192 | if (!test_bit(CLOCK_SYNC_HAS_ETR, &clock_sync_flags)) | 1199 | if (!test_bit(CLOCK_SYNC_HAS_ETR, &clock_sync_flags)) |
1193 | return -EOPNOTSUPP; | 1200 | return -EOPNOTSUPP; |
1201 | mutex_lock(&clock_sync_mutex); | ||
1194 | if (dev == &etr_port0_dev) { | 1202 | if (dev == &etr_port0_dev) { |
1195 | if (etr_port0_online == value) | 1203 | if (etr_port0_online == value) |
1196 | return count; /* Nothing to do. */ | 1204 | goto out; /* Nothing to do. */ |
1197 | etr_port0_online = value; | 1205 | etr_port0_online = value; |
1206 | if (etr_port0_online && etr_port1_online) | ||
1207 | set_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1208 | else | ||
1209 | clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1198 | set_bit(ETR_EVENT_PORT0_CHANGE, &etr_events); | 1210 | set_bit(ETR_EVENT_PORT0_CHANGE, &etr_events); |
1199 | queue_work(time_sync_wq, &etr_work); | 1211 | queue_work(time_sync_wq, &etr_work); |
1200 | } else { | 1212 | } else { |
1201 | if (etr_port1_online == value) | 1213 | if (etr_port1_online == value) |
1202 | return count; /* Nothing to do. */ | 1214 | goto out; /* Nothing to do. */ |
1203 | etr_port1_online = value; | 1215 | etr_port1_online = value; |
1216 | if (etr_port0_online && etr_port1_online) | ||
1217 | set_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1218 | else | ||
1219 | clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags); | ||
1204 | set_bit(ETR_EVENT_PORT1_CHANGE, &etr_events); | 1220 | set_bit(ETR_EVENT_PORT1_CHANGE, &etr_events); |
1205 | queue_work(time_sync_wq, &etr_work); | 1221 | queue_work(time_sync_wq, &etr_work); |
1206 | } | 1222 | } |
1223 | out: | ||
1224 | mutex_unlock(&clock_sync_mutex); | ||
1207 | return count; | 1225 | return count; |
1208 | } | 1226 | } |
1209 | 1227 | ||
@@ -1471,8 +1489,6 @@ static void stp_timing_alert(struct stp_irq_parm *intparm) | |||
1471 | */ | 1489 | */ |
1472 | void stp_sync_check(void) | 1490 | void stp_sync_check(void) |
1473 | { | 1491 | { |
1474 | if (!test_bit(CLOCK_SYNC_STP, &clock_sync_flags)) | ||
1475 | return; | ||
1476 | disable_sync_clock(NULL); | 1492 | disable_sync_clock(NULL); |
1477 | queue_work(time_sync_wq, &stp_work); | 1493 | queue_work(time_sync_wq, &stp_work); |
1478 | } | 1494 | } |
@@ -1485,8 +1501,6 @@ void stp_sync_check(void) | |||
1485 | */ | 1501 | */ |
1486 | void stp_island_check(void) | 1502 | void stp_island_check(void) |
1487 | { | 1503 | { |
1488 | if (!test_bit(CLOCK_SYNC_STP, &clock_sync_flags)) | ||
1489 | return; | ||
1490 | disable_sync_clock(NULL); | 1504 | disable_sync_clock(NULL); |
1491 | queue_work(time_sync_wq, &stp_work); | 1505 | queue_work(time_sync_wq, &stp_work); |
1492 | } | 1506 | } |
@@ -1513,10 +1527,6 @@ static int stp_sync_clock(void *data) | |||
1513 | 1527 | ||
1514 | enable_sync_clock(); | 1528 | enable_sync_clock(); |
1515 | 1529 | ||
1516 | set_bit(CLOCK_SYNC_STP, &clock_sync_flags); | ||
1517 | if (test_and_clear_bit(CLOCK_SYNC_ETR, &clock_sync_flags)) | ||
1518 | queue_work(time_sync_wq, &etr_work); | ||
1519 | |||
1520 | rc = 0; | 1530 | rc = 0; |
1521 | if (stp_info.todoff[0] || stp_info.todoff[1] || | 1531 | if (stp_info.todoff[0] || stp_info.todoff[1] || |
1522 | stp_info.todoff[2] || stp_info.todoff[3] || | 1532 | stp_info.todoff[2] || stp_info.todoff[3] || |
@@ -1535,9 +1545,6 @@ static int stp_sync_clock(void *data) | |||
1535 | if (rc) { | 1545 | if (rc) { |
1536 | disable_sync_clock(NULL); | 1546 | disable_sync_clock(NULL); |
1537 | stp_sync->in_sync = -EAGAIN; | 1547 | stp_sync->in_sync = -EAGAIN; |
1538 | clear_bit(CLOCK_SYNC_STP, &clock_sync_flags); | ||
1539 | if (etr_port0_online || etr_port1_online) | ||
1540 | queue_work(time_sync_wq, &etr_work); | ||
1541 | } else | 1548 | } else |
1542 | stp_sync->in_sync = 1; | 1549 | stp_sync->in_sync = 1; |
1543 | xchg(&first, 0); | 1550 | xchg(&first, 0); |
@@ -1569,6 +1576,10 @@ static void stp_work_fn(struct work_struct *work) | |||
1569 | if (rc || stp_info.c == 0) | 1576 | if (rc || stp_info.c == 0) |
1570 | goto out_unlock; | 1577 | goto out_unlock; |
1571 | 1578 | ||
1579 | /* Skip synchronization if the clock is already in sync. */ | ||
1580 | if (check_sync_clock()) | ||
1581 | goto out_unlock; | ||
1582 | |||
1572 | memset(&stp_sync, 0, sizeof(stp_sync)); | 1583 | memset(&stp_sync, 0, sizeof(stp_sync)); |
1573 | get_online_cpus(); | 1584 | get_online_cpus(); |
1574 | atomic_set(&stp_sync.cpus, num_online_cpus() - 1); | 1585 | atomic_set(&stp_sync.cpus, num_online_cpus() - 1); |
@@ -1684,8 +1695,14 @@ static ssize_t stp_online_store(struct sysdev_class *class, | |||
1684 | return -EINVAL; | 1695 | return -EINVAL; |
1685 | if (!test_bit(CLOCK_SYNC_HAS_STP, &clock_sync_flags)) | 1696 | if (!test_bit(CLOCK_SYNC_HAS_STP, &clock_sync_flags)) |
1686 | return -EOPNOTSUPP; | 1697 | return -EOPNOTSUPP; |
1698 | mutex_lock(&clock_sync_mutex); | ||
1687 | stp_online = value; | 1699 | stp_online = value; |
1700 | if (stp_online) | ||
1701 | set_bit(CLOCK_SYNC_STP, &clock_sync_flags); | ||
1702 | else | ||
1703 | clear_bit(CLOCK_SYNC_STP, &clock_sync_flags); | ||
1688 | queue_work(time_sync_wq, &stp_work); | 1704 | queue_work(time_sync_wq, &stp_work); |
1705 | mutex_unlock(&clock_sync_mutex); | ||
1689 | return count; | 1706 | return count; |
1690 | } | 1707 | } |
1691 | 1708 | ||
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index cc362c9ea8f1..3c72c9cf22b6 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -74,7 +74,7 @@ static DEFINE_SPINLOCK(topology_lock); | |||
74 | 74 | ||
75 | cpumask_t cpu_core_map[NR_CPUS]; | 75 | cpumask_t cpu_core_map[NR_CPUS]; |
76 | 76 | ||
77 | cpumask_t cpu_coregroup_map(unsigned int cpu) | 77 | static cpumask_t cpu_coregroup_map(unsigned int cpu) |
78 | { | 78 | { |
79 | struct core_info *core = &core_info; | 79 | struct core_info *core = &core_info; |
80 | unsigned long flags; | 80 | unsigned long flags; |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 4584d81984c0..c2e42cc65ce7 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -61,9 +61,11 @@ extern pgm_check_handler_t do_asce_exception; | |||
61 | #define stack_pointer ({ void **sp; asm("la %0,0(15)" : "=&d" (sp)); sp; }) | 61 | #define stack_pointer ({ void **sp; asm("la %0,0(15)" : "=&d" (sp)); sp; }) |
62 | 62 | ||
63 | #ifndef CONFIG_64BIT | 63 | #ifndef CONFIG_64BIT |
64 | #define LONG "%08lx " | ||
64 | #define FOURLONG "%08lx %08lx %08lx %08lx\n" | 65 | #define FOURLONG "%08lx %08lx %08lx %08lx\n" |
65 | static int kstack_depth_to_print = 12; | 66 | static int kstack_depth_to_print = 12; |
66 | #else /* CONFIG_64BIT */ | 67 | #else /* CONFIG_64BIT */ |
68 | #define LONG "%016lx " | ||
67 | #define FOURLONG "%016lx %016lx %016lx %016lx\n" | 69 | #define FOURLONG "%016lx %016lx %016lx %016lx\n" |
68 | static int kstack_depth_to_print = 20; | 70 | static int kstack_depth_to_print = 20; |
69 | #endif /* CONFIG_64BIT */ | 71 | #endif /* CONFIG_64BIT */ |
@@ -155,7 +157,7 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
155 | break; | 157 | break; |
156 | if (i && ((i * sizeof (long) % 32) == 0)) | 158 | if (i && ((i * sizeof (long) % 32) == 0)) |
157 | printk("\n "); | 159 | printk("\n "); |
158 | printk("%p ", (void *)*stack++); | 160 | printk(LONG, *stack++); |
159 | } | 161 | } |
160 | printk("\n"); | 162 | printk("\n"); |
161 | show_trace(task, sp); | 163 | show_trace(task, sp); |
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index 690e17819686..89b2e7f1b7a9 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c | |||
@@ -144,7 +144,6 @@ out: | |||
144 | return -ENOMEM; | 144 | return -ENOMEM; |
145 | } | 145 | } |
146 | 146 | ||
147 | #ifdef CONFIG_HOTPLUG_CPU | ||
148 | void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore) | 147 | void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore) |
149 | { | 148 | { |
150 | unsigned long segment_table, page_table, page_frame; | 149 | unsigned long segment_table, page_table, page_frame; |
@@ -163,7 +162,6 @@ void vdso_free_per_cpu(int cpu, struct _lowcore *lowcore) | |||
163 | free_page(page_table); | 162 | free_page(page_table); |
164 | free_pages(segment_table, SEGMENT_ORDER); | 163 | free_pages(segment_table, SEGMENT_ORDER); |
165 | } | 164 | } |
166 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
167 | 165 | ||
168 | static void __vdso_init_cr5(void *dummy) | 166 | static void __vdso_init_cr5(void *dummy) |
169 | { | 167 | { |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index d796d05c9c01..7a2063eb88f0 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -108,6 +108,8 @@ SECTIONS | |||
108 | EXIT_TEXT | 108 | EXIT_TEXT |
109 | } | 109 | } |
110 | 110 | ||
111 | /* early.c uses stsi, which requires page aligned data. */ | ||
112 | . = ALIGN(PAGE_SIZE); | ||
111 | .init.data : { | 113 | .init.data : { |
112 | INIT_DATA | 114 | INIT_DATA |
113 | } | 115 | } |
diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index e051cad1f1e0..3e260b7e37b2 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig | |||
@@ -4,6 +4,9 @@ | |||
4 | config HAVE_KVM | 4 | config HAVE_KVM |
5 | bool | 5 | bool |
6 | 6 | ||
7 | config HAVE_KVM_IRQCHIP | ||
8 | bool | ||
9 | |||
7 | menuconfig VIRTUALIZATION | 10 | menuconfig VIRTUALIZATION |
8 | bool "Virtualization" | 11 | bool "Virtualization" |
9 | default y | 12 | default y |
diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c index 61236102203e..9d19803111ba 100644 --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c | |||
@@ -103,7 +103,7 @@ static int handle_lctl(struct kvm_vcpu *vcpu) | |||
103 | static intercept_handler_t instruction_handlers[256] = { | 103 | static intercept_handler_t instruction_handlers[256] = { |
104 | [0x83] = kvm_s390_handle_diag, | 104 | [0x83] = kvm_s390_handle_diag, |
105 | [0xae] = kvm_s390_handle_sigp, | 105 | [0xae] = kvm_s390_handle_sigp, |
106 | [0xb2] = kvm_s390_handle_priv, | 106 | [0xb2] = kvm_s390_handle_b2, |
107 | [0xb7] = handle_lctl, | 107 | [0xb7] = handle_lctl, |
108 | [0xeb] = handle_lctlg, | 108 | [0xeb] = handle_lctlg, |
109 | }; | 109 | }; |
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index f4fe28a2521a..0189356fe209 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c | |||
@@ -555,9 +555,14 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
555 | VCPU_EVENT(vcpu, 3, "inject: program check %d (from user)", | 555 | VCPU_EVENT(vcpu, 3, "inject: program check %d (from user)", |
556 | s390int->parm); | 556 | s390int->parm); |
557 | break; | 557 | break; |
558 | case KVM_S390_SIGP_SET_PREFIX: | ||
559 | inti->prefix.address = s390int->parm; | ||
560 | inti->type = s390int->type; | ||
561 | VCPU_EVENT(vcpu, 3, "inject: set prefix to %x (from user)", | ||
562 | s390int->parm); | ||
563 | break; | ||
558 | case KVM_S390_SIGP_STOP: | 564 | case KVM_S390_SIGP_STOP: |
559 | case KVM_S390_RESTART: | 565 | case KVM_S390_RESTART: |
560 | case KVM_S390_SIGP_SET_PREFIX: | ||
561 | case KVM_S390_INT_EMERGENCY: | 566 | case KVM_S390_INT_EMERGENCY: |
562 | VCPU_EVENT(vcpu, 3, "inject: type %x", s390int->type); | 567 | VCPU_EVENT(vcpu, 3, "inject: type %x", s390int->type); |
563 | inti->type = s390int->type; | 568 | inti->type = s390int->type; |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 0d33893e1e89..f4d56e9939c9 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/timer.h> | 23 | #include <linux/timer.h> |
24 | #include <asm/lowcore.h> | 24 | #include <asm/lowcore.h> |
25 | #include <asm/pgtable.h> | 25 | #include <asm/pgtable.h> |
26 | 26 | #include <asm/nmi.h> | |
27 | #include "kvm-s390.h" | 27 | #include "kvm-s390.h" |
28 | #include "gaccess.h" | 28 | #include "gaccess.h" |
29 | 29 | ||
@@ -286,7 +286,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
286 | setup_timer(&vcpu->arch.ckc_timer, kvm_s390_idle_wakeup, | 286 | setup_timer(&vcpu->arch.ckc_timer, kvm_s390_idle_wakeup, |
287 | (unsigned long) vcpu); | 287 | (unsigned long) vcpu); |
288 | get_cpu_id(&vcpu->arch.cpu_id); | 288 | get_cpu_id(&vcpu->arch.cpu_id); |
289 | vcpu->arch.cpu_id.version = 0xfe; | 289 | vcpu->arch.cpu_id.version = 0xff; |
290 | return 0; | 290 | return 0; |
291 | } | 291 | } |
292 | 292 | ||
@@ -422,8 +422,8 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, | |||
422 | return -EINVAL; /* not implemented yet */ | 422 | return -EINVAL; /* not implemented yet */ |
423 | } | 423 | } |
424 | 424 | ||
425 | int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, | 425 | int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, |
426 | struct kvm_debug_guest *dbg) | 426 | struct kvm_guest_debug *dbg) |
427 | { | 427 | { |
428 | return -EINVAL; /* not implemented yet */ | 428 | return -EINVAL; /* not implemented yet */ |
429 | } | 429 | } |
@@ -440,8 +440,6 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | |||
440 | return -EINVAL; /* not implemented yet */ | 440 | return -EINVAL; /* not implemented yet */ |
441 | } | 441 | } |
442 | 442 | ||
443 | extern void s390_handle_mcck(void); | ||
444 | |||
445 | static void __vcpu_run(struct kvm_vcpu *vcpu) | 443 | static void __vcpu_run(struct kvm_vcpu *vcpu) |
446 | { | 444 | { |
447 | memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16); | 445 | memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16); |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 3893cf12eacf..00bbe69b78da 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
@@ -50,7 +50,7 @@ int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | |||
50 | int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); | 50 | int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); |
51 | 51 | ||
52 | /* implemented in priv.c */ | 52 | /* implemented in priv.c */ |
53 | int kvm_s390_handle_priv(struct kvm_vcpu *vcpu); | 53 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu); |
54 | 54 | ||
55 | /* implemented in sigp.c */ | 55 | /* implemented in sigp.c */ |
56 | int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); | 56 | int kvm_s390_handle_sigp(struct kvm_vcpu *vcpu); |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 3605df45dd41..4b88834b8dd8 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
@@ -304,12 +304,24 @@ static intercept_handler_t priv_handlers[256] = { | |||
304 | [0xb1] = handle_stfl, | 304 | [0xb1] = handle_stfl, |
305 | }; | 305 | }; |
306 | 306 | ||
307 | int kvm_s390_handle_priv(struct kvm_vcpu *vcpu) | 307 | int kvm_s390_handle_b2(struct kvm_vcpu *vcpu) |
308 | { | 308 | { |
309 | intercept_handler_t handler; | 309 | intercept_handler_t handler; |
310 | 310 | ||
311 | /* | ||
312 | * a lot of B2 instructions are priviledged. We first check for | ||
313 | * the priviledges ones, that we can handle in the kernel. If the | ||
314 | * kernel can handle this instruction, we check for the problem | ||
315 | * state bit and (a) handle the instruction or (b) send a code 2 | ||
316 | * program check. | ||
317 | * Anything else goes to userspace.*/ | ||
311 | handler = priv_handlers[vcpu->arch.sie_block->ipa & 0x00ff]; | 318 | handler = priv_handlers[vcpu->arch.sie_block->ipa & 0x00ff]; |
312 | if (handler) | 319 | if (handler) { |
313 | return handler(vcpu); | 320 | if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) |
321 | return kvm_s390_inject_program_int(vcpu, | ||
322 | PGM_PRIVILEGED_OPERATION); | ||
323 | else | ||
324 | return handler(vcpu); | ||
325 | } | ||
314 | return -ENOTSUPP; | 326 | return -ENOTSUPP; |
315 | } | 327 | } |
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 2a01b9e02801..f27dbedf0866 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
@@ -153,8 +153,6 @@ static int __sigp_set_arch(struct kvm_vcpu *vcpu, u32 parameter) | |||
153 | 153 | ||
154 | switch (parameter & 0xff) { | 154 | switch (parameter & 0xff) { |
155 | case 0: | 155 | case 0: |
156 | printk(KERN_WARNING "kvm: request to switch to ESA/390 mode" | ||
157 | " not supported"); | ||
158 | rc = 3; /* not operational */ | 156 | rc = 3; /* not operational */ |
159 | break; | 157 | break; |
160 | case 1: | 158 | case 1: |
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index 6ccb9fab055a..3f5f680726ed 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
10 | #include <linux/delay.h> | 10 | #include <linux/delay.h> |
11 | #include <linux/timex.h> | 11 | #include <linux/timex.h> |
12 | #include <linux/module.h> | ||
12 | #include <linux/irqflags.h> | 13 | #include <linux/irqflags.h> |
13 | #include <linux/interrupt.h> | 14 | #include <linux/interrupt.h> |
14 | 15 | ||
@@ -92,6 +93,7 @@ out: | |||
92 | local_irq_restore(flags); | 93 | local_irq_restore(flags); |
93 | preempt_enable(); | 94 | preempt_enable(); |
94 | } | 95 | } |
96 | EXPORT_SYMBOL(__udelay); | ||
95 | 97 | ||
96 | /* | 98 | /* |
97 | * Simple udelay variant. To be used on startup and reboot | 99 | * Simple udelay variant. To be used on startup and reboot |
diff --git a/arch/s390/lib/string.c b/arch/s390/lib/string.c index ae5cf5d03d41..4143b7c19096 100644 --- a/arch/s390/lib/string.c +++ b/arch/s390/lib/string.c | |||
@@ -44,7 +44,11 @@ static inline char *__strnend(const char *s, size_t n) | |||
44 | */ | 44 | */ |
45 | size_t strlen(const char *s) | 45 | size_t strlen(const char *s) |
46 | { | 46 | { |
47 | #if __GNUC__ < 4 | ||
47 | return __strend(s) - s; | 48 | return __strend(s) - s; |
49 | #else | ||
50 | return __builtin_strlen(s); | ||
51 | #endif | ||
48 | } | 52 | } |
49 | EXPORT_SYMBOL(strlen); | 53 | EXPORT_SYMBOL(strlen); |
50 | 54 | ||
@@ -70,6 +74,7 @@ EXPORT_SYMBOL(strnlen); | |||
70 | */ | 74 | */ |
71 | char *strcpy(char *dest, const char *src) | 75 | char *strcpy(char *dest, const char *src) |
72 | { | 76 | { |
77 | #if __GNUC__ < 4 | ||
73 | register int r0 asm("0") = 0; | 78 | register int r0 asm("0") = 0; |
74 | char *ret = dest; | 79 | char *ret = dest; |
75 | 80 | ||
@@ -78,6 +83,9 @@ char *strcpy(char *dest, const char *src) | |||
78 | : "+&a" (dest), "+&a" (src) : "d" (r0) | 83 | : "+&a" (dest), "+&a" (src) : "d" (r0) |
79 | : "cc", "memory" ); | 84 | : "cc", "memory" ); |
80 | return ret; | 85 | return ret; |
86 | #else | ||
87 | return __builtin_strcpy(dest, src); | ||
88 | #endif | ||
81 | } | 89 | } |
82 | EXPORT_SYMBOL(strcpy); | 90 | EXPORT_SYMBOL(strcpy); |
83 | 91 | ||
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 4d537205e83c..833e8366c351 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -200,29 +200,6 @@ static void do_low_address(struct pt_regs *regs, unsigned long error_code) | |||
200 | do_no_context(regs, error_code, 0); | 200 | do_no_context(regs, error_code, 0); |
201 | } | 201 | } |
202 | 202 | ||
203 | /* | ||
204 | * We ran out of memory, or some other thing happened to us that made | ||
205 | * us unable to handle the page fault gracefully. | ||
206 | */ | ||
207 | static int do_out_of_memory(struct pt_regs *regs, unsigned long error_code, | ||
208 | unsigned long address) | ||
209 | { | ||
210 | struct task_struct *tsk = current; | ||
211 | struct mm_struct *mm = tsk->mm; | ||
212 | |||
213 | up_read(&mm->mmap_sem); | ||
214 | if (is_global_init(tsk)) { | ||
215 | yield(); | ||
216 | down_read(&mm->mmap_sem); | ||
217 | return 1; | ||
218 | } | ||
219 | printk("VM: killing process %s\n", tsk->comm); | ||
220 | if (regs->psw.mask & PSW_MASK_PSTATE) | ||
221 | do_group_exit(SIGKILL); | ||
222 | do_no_context(regs, error_code, address); | ||
223 | return 0; | ||
224 | } | ||
225 | |||
226 | static void do_sigbus(struct pt_regs *regs, unsigned long error_code, | 203 | static void do_sigbus(struct pt_regs *regs, unsigned long error_code, |
227 | unsigned long address) | 204 | unsigned long address) |
228 | { | 205 | { |
@@ -367,7 +344,6 @@ good_area: | |||
367 | goto bad_area; | 344 | goto bad_area; |
368 | } | 345 | } |
369 | 346 | ||
370 | survive: | ||
371 | if (is_vm_hugetlb_page(vma)) | 347 | if (is_vm_hugetlb_page(vma)) |
372 | address &= HPAGE_MASK; | 348 | address &= HPAGE_MASK; |
373 | /* | 349 | /* |
@@ -378,8 +354,8 @@ survive: | |||
378 | fault = handle_mm_fault(mm, vma, address, write); | 354 | fault = handle_mm_fault(mm, vma, address, write); |
379 | if (unlikely(fault & VM_FAULT_ERROR)) { | 355 | if (unlikely(fault & VM_FAULT_ERROR)) { |
380 | if (fault & VM_FAULT_OOM) { | 356 | if (fault & VM_FAULT_OOM) { |
381 | if (do_out_of_memory(regs, error_code, address)) | 357 | up_read(&mm->mmap_sem); |
382 | goto survive; | 358 | pagefault_out_of_memory(); |
383 | return; | 359 | return; |
384 | } else if (fault & VM_FAULT_SIGBUS) { | 360 | } else if (fault & VM_FAULT_SIGBUS) { |
385 | do_sigbus(regs, error_code, address); | 361 | do_sigbus(regs, error_code, address); |
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index f0258ca3b17e..c634dfbe92e9 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -40,7 +40,9 @@ | |||
40 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 40 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
41 | 41 | ||
42 | pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE))); | 42 | pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE))); |
43 | |||
43 | char empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); | 44 | char empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); |
45 | EXPORT_SYMBOL(empty_zero_page); | ||
44 | 46 | ||
45 | /* | 47 | /* |
46 | * paging_init() sets up the page tables | 48 | * paging_init() sets up the page tables |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 6b6ddc4ea02b..be6c1cf4ad5a 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -258,6 +258,10 @@ int s390_enable_sie(void) | |||
258 | struct task_struct *tsk = current; | 258 | struct task_struct *tsk = current; |
259 | struct mm_struct *mm, *old_mm; | 259 | struct mm_struct *mm, *old_mm; |
260 | 260 | ||
261 | /* Do we have switched amode? If no, we cannot do sie */ | ||
262 | if (!switch_amode) | ||
263 | return -EINVAL; | ||
264 | |||
261 | /* Do we have pgstes? if yes, we are done */ | 265 | /* Do we have pgstes? if yes, we are done */ |
262 | if (tsk->mm->context.has_pgste) | 266 | if (tsk->mm->context.has_pgste) |
263 | return 0; | 267 | return 0; |
@@ -292,7 +296,7 @@ int s390_enable_sie(void) | |||
292 | tsk->mm = tsk->active_mm = mm; | 296 | tsk->mm = tsk->active_mm = mm; |
293 | preempt_disable(); | 297 | preempt_disable(); |
294 | update_mm(mm, tsk); | 298 | update_mm(mm, tsk); |
295 | cpu_set(smp_processor_id(), mm->cpu_vm_mask); | 299 | cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm)); |
296 | preempt_enable(); | 300 | preempt_enable(); |
297 | task_unlock(tsk); | 301 | task_unlock(tsk); |
298 | mmput(old_mm); | 302 | mmput(old_mm); |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index ebabe518e729..8d50d527c595 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -107,6 +107,9 @@ config SYS_SUPPORTS_NUMA | |||
107 | config SYS_SUPPORTS_PCI | 107 | config SYS_SUPPORTS_PCI |
108 | bool | 108 | bool |
109 | 109 | ||
110 | config SYS_SUPPORTS_CMT | ||
111 | bool | ||
112 | |||
110 | config STACKTRACE_SUPPORT | 113 | config STACKTRACE_SUPPORT |
111 | def_bool y | 114 | def_bool y |
112 | 115 | ||
@@ -176,6 +179,10 @@ config CPU_SHX2 | |||
176 | config CPU_SHX3 | 179 | config CPU_SHX3 |
177 | bool | 180 | bool |
178 | 181 | ||
182 | config ARCH_SHMOBILE | ||
183 | bool | ||
184 | select ARCH_SUSPEND_POSSIBLE | ||
185 | |||
179 | choice | 186 | choice |
180 | prompt "Processor sub-type selection" | 187 | prompt "Processor sub-type selection" |
181 | 188 | ||
@@ -188,6 +195,7 @@ choice | |||
188 | config CPU_SUBTYPE_SH7619 | 195 | config CPU_SUBTYPE_SH7619 |
189 | bool "Support SH7619 processor" | 196 | bool "Support SH7619 processor" |
190 | select CPU_SH2 | 197 | select CPU_SH2 |
198 | select SYS_SUPPORTS_CMT | ||
191 | 199 | ||
192 | # SH-2A Processor Support | 200 | # SH-2A Processor Support |
193 | 201 | ||
@@ -200,15 +208,18 @@ config CPU_SUBTYPE_SH7203 | |||
200 | bool "Support SH7203 processor" | 208 | bool "Support SH7203 processor" |
201 | select CPU_SH2A | 209 | select CPU_SH2A |
202 | select CPU_HAS_FPU | 210 | select CPU_HAS_FPU |
211 | select SYS_SUPPORTS_CMT | ||
203 | 212 | ||
204 | config CPU_SUBTYPE_SH7206 | 213 | config CPU_SUBTYPE_SH7206 |
205 | bool "Support SH7206 processor" | 214 | bool "Support SH7206 processor" |
206 | select CPU_SH2A | 215 | select CPU_SH2A |
216 | select SYS_SUPPORTS_CMT | ||
207 | 217 | ||
208 | config CPU_SUBTYPE_SH7263 | 218 | config CPU_SUBTYPE_SH7263 |
209 | bool "Support SH7263 processor" | 219 | bool "Support SH7263 processor" |
210 | select CPU_SH2A | 220 | select CPU_SH2A |
211 | select CPU_HAS_FPU | 221 | select CPU_HAS_FPU |
222 | select SYS_SUPPORTS_CMT | ||
212 | 223 | ||
213 | config CPU_SUBTYPE_MXG | 224 | config CPU_SUBTYPE_MXG |
214 | bool "Support MX-G processor" | 225 | bool "Support MX-G processor" |
@@ -323,7 +334,9 @@ config CPU_SUBTYPE_SH7723 | |||
323 | bool "Support SH7723 processor" | 334 | bool "Support SH7723 processor" |
324 | select CPU_SH4A | 335 | select CPU_SH4A |
325 | select CPU_SHX2 | 336 | select CPU_SHX2 |
337 | select ARCH_SHMOBILE | ||
326 | select ARCH_SPARSEMEM_ENABLE | 338 | select ARCH_SPARSEMEM_ENABLE |
339 | select SYS_SUPPORTS_CMT | ||
327 | help | 340 | help |
328 | Select SH7723 if you have an SH-MobileR2 CPU. | 341 | Select SH7723 if you have an SH-MobileR2 CPU. |
329 | 342 | ||
@@ -348,6 +361,14 @@ config CPU_SUBTYPE_SH7785 | |||
348 | select ARCH_SPARSEMEM_ENABLE | 361 | select ARCH_SPARSEMEM_ENABLE |
349 | select SYS_SUPPORTS_NUMA | 362 | select SYS_SUPPORTS_NUMA |
350 | 363 | ||
364 | config CPU_SUBTYPE_SH7786 | ||
365 | bool "Support SH7786 processor" | ||
366 | select CPU_SH4A | ||
367 | select CPU_SHX3 | ||
368 | select CPU_HAS_PTEAEX | ||
369 | select ARCH_SPARSEMEM_ENABLE | ||
370 | select SYS_SUPPORTS_NUMA | ||
371 | |||
351 | config CPU_SUBTYPE_SHX3 | 372 | config CPU_SUBTYPE_SHX3 |
352 | bool "Support SH-X3 processor" | 373 | bool "Support SH-X3 processor" |
353 | select CPU_SH4A | 374 | select CPU_SH4A |
@@ -362,20 +383,26 @@ config CPU_SUBTYPE_SHX3 | |||
362 | config CPU_SUBTYPE_SH7343 | 383 | config CPU_SUBTYPE_SH7343 |
363 | bool "Support SH7343 processor" | 384 | bool "Support SH7343 processor" |
364 | select CPU_SH4AL_DSP | 385 | select CPU_SH4AL_DSP |
386 | select ARCH_SHMOBILE | ||
387 | select SYS_SUPPORTS_CMT | ||
365 | 388 | ||
366 | config CPU_SUBTYPE_SH7722 | 389 | config CPU_SUBTYPE_SH7722 |
367 | bool "Support SH7722 processor" | 390 | bool "Support SH7722 processor" |
368 | select CPU_SH4AL_DSP | 391 | select CPU_SH4AL_DSP |
369 | select CPU_SHX2 | 392 | select CPU_SHX2 |
393 | select ARCH_SHMOBILE | ||
370 | select ARCH_SPARSEMEM_ENABLE | 394 | select ARCH_SPARSEMEM_ENABLE |
371 | select SYS_SUPPORTS_NUMA | 395 | select SYS_SUPPORTS_NUMA |
396 | select SYS_SUPPORTS_CMT | ||
372 | 397 | ||
373 | config CPU_SUBTYPE_SH7366 | 398 | config CPU_SUBTYPE_SH7366 |
374 | bool "Support SH7366 processor" | 399 | bool "Support SH7366 processor" |
375 | select CPU_SH4AL_DSP | 400 | select CPU_SH4AL_DSP |
376 | select CPU_SHX2 | 401 | select CPU_SHX2 |
402 | select ARCH_SHMOBILE | ||
377 | select ARCH_SPARSEMEM_ENABLE | 403 | select ARCH_SPARSEMEM_ENABLE |
378 | select SYS_SUPPORTS_NUMA | 404 | select SYS_SUPPORTS_NUMA |
405 | select SYS_SUPPORTS_CMT | ||
379 | 406 | ||
380 | # SH-5 Processor Support | 407 | # SH-5 Processor Support |
381 | 408 | ||
@@ -398,25 +425,34 @@ source "arch/sh/boards/Kconfig" | |||
398 | menu "Timer and clock configuration" | 425 | menu "Timer and clock configuration" |
399 | 426 | ||
400 | config SH_TMU | 427 | config SH_TMU |
401 | def_bool y | 428 | bool "TMU timer support" |
402 | prompt "TMU timer support" | ||
403 | depends on CPU_SH3 || CPU_SH4 | 429 | depends on CPU_SH3 || CPU_SH4 |
430 | default y | ||
404 | select GENERIC_TIME | 431 | select GENERIC_TIME |
405 | select GENERIC_CLOCKEVENTS | 432 | select GENERIC_CLOCKEVENTS |
406 | help | 433 | help |
407 | This enables the use of the TMU as the system timer. | 434 | This enables the use of the TMU as the system timer. |
408 | 435 | ||
409 | config SH_CMT | 436 | config SH_CMT |
410 | def_bool y | 437 | bool "CMT timer support" |
411 | prompt "CMT timer support" | 438 | depends on SYS_SUPPORTS_CMT && CPU_SH2 |
412 | depends on CPU_SH2 && !CPU_SUBTYPE_MXG | 439 | default y |
413 | help | 440 | help |
414 | This enables the use of the CMT as the system timer. | 441 | This enables the use of the CMT as the system timer. |
415 | 442 | ||
443 | # | ||
444 | # Support for the new-style CMT driver. This will replace SH_CMT | ||
445 | # once its other dependencies are merged. | ||
446 | # | ||
447 | config SH_TIMER_CMT | ||
448 | bool "CMT clockevents driver" | ||
449 | depends on SYS_SUPPORTS_CMT && !SH_CMT | ||
450 | select GENERIC_CLOCKEVENTS | ||
451 | |||
416 | config SH_MTU2 | 452 | config SH_MTU2 |
417 | def_bool n | 453 | bool "MTU2 timer support" |
418 | prompt "MTU2 timer support" | ||
419 | depends on CPU_SH2A | 454 | depends on CPU_SH2A |
455 | default y | ||
420 | help | 456 | help |
421 | This enables the use of the MTU2 as the system timer. | 457 | This enables the use of the MTU2 as the system timer. |
422 | 458 | ||
@@ -426,7 +462,8 @@ config SH_TIMER_IRQ | |||
426 | CPU_SUBTYPE_SH7763 | 462 | CPU_SUBTYPE_SH7763 |
427 | default "86" if CPU_SUBTYPE_SH7619 | 463 | default "86" if CPU_SUBTYPE_SH7619 |
428 | default "140" if CPU_SUBTYPE_SH7206 | 464 | default "140" if CPU_SUBTYPE_SH7206 |
429 | default "142" if CPU_SUBTYPE_SH7203 | 465 | default "142" if CPU_SUBTYPE_SH7203 && SH_CMT |
466 | default "153" if CPU_SUBTYPE_SH7203 && SH_MTU2 | ||
430 | default "238" if CPU_SUBTYPE_MXG | 467 | default "238" if CPU_SUBTYPE_MXG |
431 | default "16" | 468 | default "16" |
432 | 469 | ||
@@ -438,7 +475,8 @@ config SH_PCLK_FREQ | |||
438 | default "33333333" if CPU_SUBTYPE_SH7770 || CPU_SUBTYPE_SH7723 || \ | 475 | default "33333333" if CPU_SUBTYPE_SH7770 || CPU_SUBTYPE_SH7723 || \ |
439 | CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7705 || \ | 476 | CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7705 || \ |
440 | CPU_SUBTYPE_SH7203 || CPU_SUBTYPE_SH7206 || \ | 477 | CPU_SUBTYPE_SH7203 || CPU_SUBTYPE_SH7206 || \ |
441 | CPU_SUBTYPE_SH7263 || CPU_SUBTYPE_MXG | 478 | CPU_SUBTYPE_SH7263 || CPU_SUBTYPE_MXG || \ |
479 | CPU_SUBTYPE_SH7786 | ||
442 | default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R | 480 | default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R |
443 | default "66000000" if CPU_SUBTYPE_SH4_202 | 481 | default "66000000" if CPU_SUBTYPE_SH4_202 |
444 | default "50000000" | 482 | default "50000000" |
@@ -521,6 +559,13 @@ config CRASH_DUMP | |||
521 | 559 | ||
522 | For more details see Documentation/kdump/kdump.txt | 560 | For more details see Documentation/kdump/kdump.txt |
523 | 561 | ||
562 | config KEXEC_JUMP | ||
563 | bool "kexec jump (EXPERIMENTAL)" | ||
564 | depends on SUPERH32 && KEXEC && HIBERNATION && EXPERIMENTAL | ||
565 | help | ||
566 | Jump between original kernel and kexeced kernel and invoke | ||
567 | code via KEXEC | ||
568 | |||
524 | config SECCOMP | 569 | config SECCOMP |
525 | bool "Enable seccomp to safely compute untrusted bytecode" | 570 | bool "Enable seccomp to safely compute untrusted bytecode" |
526 | depends on PROC_FS | 571 | depends on PROC_FS |
diff --git a/arch/sh/Kconfig.cpu b/arch/sh/Kconfig.cpu index 0e27fe3b182b..c7d704381a6d 100644 --- a/arch/sh/Kconfig.cpu +++ b/arch/sh/Kconfig.cpu | |||
@@ -104,6 +104,9 @@ config CPU_HAS_SR_RB | |||
104 | config CPU_HAS_PTEA | 104 | config CPU_HAS_PTEA |
105 | bool | 105 | bool |
106 | 106 | ||
107 | config CPU_HAS_PTEAEX | ||
108 | bool | ||
109 | |||
107 | config CPU_HAS_DSP | 110 | config CPU_HAS_DSP |
108 | bool | 111 | bool |
109 | 112 | ||
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 4067b0d9287b..bece1f7535f2 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -80,6 +80,7 @@ OBJCOPYFLAGS := -O binary -R .note -R .note.gnu.build-id -R .comment \ | |||
80 | defaultimage-$(CONFIG_SUPERH32) := zImage | 80 | defaultimage-$(CONFIG_SUPERH32) := zImage |
81 | defaultimage-$(CONFIG_SH_SH7785LCR) := uImage | 81 | defaultimage-$(CONFIG_SH_SH7785LCR) := uImage |
82 | defaultimage-$(CONFIG_SH_RSK) := uImage | 82 | defaultimage-$(CONFIG_SH_RSK) := uImage |
83 | defaultimage-$(CONFIG_SH_URQUELL) := uImage | ||
83 | defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux | 84 | defaultimage-$(CONFIG_SH_7206_SOLUTION_ENGINE) := vmlinux |
84 | defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux | 85 | defaultimage-$(CONFIG_SH_7619_SOLUTION_ENGINE) := vmlinux |
85 | 86 | ||
diff --git a/arch/sh/boards/Kconfig b/arch/sh/boards/Kconfig index 861914747e4e..dcc1af8a2cfe 100644 --- a/arch/sh/boards/Kconfig +++ b/arch/sh/boards/Kconfig | |||
@@ -155,17 +155,22 @@ config SH_SH7785LCR | |||
155 | 155 | ||
156 | config SH_SH7785LCR_29BIT_PHYSMAPS | 156 | config SH_SH7785LCR_29BIT_PHYSMAPS |
157 | bool "SH7785LCR 29bit physmaps" | 157 | bool "SH7785LCR 29bit physmaps" |
158 | depends on SH_SH7785LCR | 158 | depends on SH_SH7785LCR && 29BIT |
159 | default y | 159 | default y |
160 | help | 160 | help |
161 | This board has 2 physical memory maps. It can be changed with | 161 | This board has 2 physical memory maps. It can be changed with |
162 | DIP switch(S2-5). If you set the DIP switch for S2-5 = ON, | 162 | DIP switch(S2-5). If you set the DIP switch for S2-5 = ON, |
163 | you can access all on-board device in 29bit address mode. | 163 | you can access all on-board device in 29bit address mode. |
164 | 164 | ||
165 | config SH_URQUELL | ||
166 | bool "Urquell" | ||
167 | depends on CPU_SUBTYPE_SH7786 | ||
168 | select ARCH_REQUIRE_GPIOLIB | ||
169 | |||
165 | config SH_MIGOR | 170 | config SH_MIGOR |
166 | bool "Migo-R" | 171 | bool "Migo-R" |
167 | depends on CPU_SUBTYPE_SH7722 | 172 | depends on CPU_SUBTYPE_SH7722 |
168 | select GENERIC_GPIO | 173 | select ARCH_REQUIRE_GPIOLIB |
169 | help | 174 | help |
170 | Select Migo-R if configuring for the SH7722 Migo-R platform | 175 | Select Migo-R if configuring for the SH7722 Migo-R platform |
171 | by Renesas System Solutions Asia Pte. Ltd. | 176 | by Renesas System Solutions Asia Pte. Ltd. |
@@ -173,7 +178,7 @@ config SH_MIGOR | |||
173 | config SH_AP325RXA | 178 | config SH_AP325RXA |
174 | bool "AP-325RXA" | 179 | bool "AP-325RXA" |
175 | depends on CPU_SUBTYPE_SH7723 | 180 | depends on CPU_SUBTYPE_SH7723 |
176 | select GENERIC_GPIO | 181 | select ARCH_REQUIRE_GPIOLIB |
177 | help | 182 | help |
178 | Renesas "AP-325RXA" support. | 183 | Renesas "AP-325RXA" support. |
179 | Compatible with ALGO SYSTEM CO.,LTD. "AP-320A" | 184 | Compatible with ALGO SYSTEM CO.,LTD. "AP-320A" |
@@ -185,6 +190,13 @@ config SH_SH7763RDP | |||
185 | Select SH7763RDP if configuring for a Renesas SH7763 | 190 | Select SH7763RDP if configuring for a Renesas SH7763 |
186 | evaluation board. | 191 | evaluation board. |
187 | 192 | ||
193 | config SH_ESPT | ||
194 | bool "ESPT" | ||
195 | depends on CPU_SUBTYPE_SH7763 | ||
196 | help | ||
197 | Select ESPT if configuring for a Renesas SH7763 | ||
198 | with gigabit ether evaluation board. | ||
199 | |||
188 | config SH_EDOSK7705 | 200 | config SH_EDOSK7705 |
189 | bool "EDOSK7705" | 201 | bool "EDOSK7705" |
190 | depends on CPU_SUBTYPE_SH7705 | 202 | depends on CPU_SUBTYPE_SH7705 |
@@ -240,7 +252,7 @@ config SH_X3PROTO | |||
240 | config SH_MAGIC_PANEL_R2 | 252 | config SH_MAGIC_PANEL_R2 |
241 | bool "Magic Panel R2" | 253 | bool "Magic Panel R2" |
242 | depends on CPU_SUBTYPE_SH7720 | 254 | depends on CPU_SUBTYPE_SH7720 |
243 | select GENERIC_GPIO | 255 | select ARCH_REQUIRE_GPIOLIB |
244 | help | 256 | help |
245 | Select Magic Panel R2 if configuring for Magic Panel R2. | 257 | Select Magic Panel R2 if configuring for Magic Panel R2. |
246 | 258 | ||
@@ -249,6 +261,13 @@ config SH_CAYMAN | |||
249 | depends on CPU_SUBTYPE_SH5_101 || CPU_SUBTYPE_SH5_103 | 261 | depends on CPU_SUBTYPE_SH5_101 || CPU_SUBTYPE_SH5_103 |
250 | select SYS_SUPPORTS_PCI | 262 | select SYS_SUPPORTS_PCI |
251 | 263 | ||
264 | config SH_POLARIS | ||
265 | bool "SMSC Polaris" | ||
266 | select CPU_HAS_IPR_IRQ | ||
267 | depends on CPU_SUBTYPE_SH7709 | ||
268 | help | ||
269 | Select if configuring for an SMSC Polaris development board | ||
270 | |||
252 | endmenu | 271 | endmenu |
253 | 272 | ||
254 | source "arch/sh/boards/mach-r2d/Kconfig" | 273 | source "arch/sh/boards/mach-r2d/Kconfig" |
diff --git a/arch/sh/boards/Makefile b/arch/sh/boards/Makefile index 269ae2be49ef..7baa21090231 100644 --- a/arch/sh/boards/Makefile +++ b/arch/sh/boards/Makefile | |||
@@ -4,5 +4,8 @@ | |||
4 | obj-$(CONFIG_SH_AP325RXA) += board-ap325rxa.o | 4 | obj-$(CONFIG_SH_AP325RXA) += board-ap325rxa.o |
5 | obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o | 5 | obj-$(CONFIG_SH_MAGIC_PANEL_R2) += board-magicpanelr2.o |
6 | obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o | 6 | obj-$(CONFIG_SH_SH7785LCR) += board-sh7785lcr.o |
7 | obj-$(CONFIG_SH_URQUELL) += board-urquell.o | ||
7 | obj-$(CONFIG_SH_SHMIN) += board-shmin.o | 8 | obj-$(CONFIG_SH_SHMIN) += board-shmin.o |
8 | obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o | 9 | obj-$(CONFIG_SH_EDOSK7760) += board-edosk7760.o |
10 | obj-$(CONFIG_SH_ESPT) += board-espt.o | ||
11 | obj-$(CONFIG_SH_POLARIS) += board-polaris.o | ||
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 15b6d450fbf0..a64e38841c49 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -166,6 +166,16 @@ static void ap320_wvga_power_on(void *board_data) | |||
166 | ctrl_outw(0x100, FPGA_BKLREG); | 166 | ctrl_outw(0x100, FPGA_BKLREG); |
167 | } | 167 | } |
168 | 168 | ||
169 | static void ap320_wvga_power_off(void *board_data) | ||
170 | { | ||
171 | /* backlight */ | ||
172 | ctrl_outw(0, FPGA_BKLREG); | ||
173 | gpio_set_value(GPIO_PTS3, 1); | ||
174 | |||
175 | /* ASD AP-320/325 LCD OFF */ | ||
176 | ctrl_outw(0, FPGA_LCDREG); | ||
177 | } | ||
178 | |||
169 | static struct sh_mobile_lcdc_info lcdc_info = { | 179 | static struct sh_mobile_lcdc_info lcdc_info = { |
170 | .clock_source = LCDC_CLK_EXTERNAL, | 180 | .clock_source = LCDC_CLK_EXTERNAL, |
171 | .ch[0] = { | 181 | .ch[0] = { |
@@ -191,6 +201,7 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
191 | }, | 201 | }, |
192 | .board_cfg = { | 202 | .board_cfg = { |
193 | .display_on = ap320_wvga_power_on, | 203 | .display_on = ap320_wvga_power_on, |
204 | .display_off = ap320_wvga_power_off, | ||
194 | }, | 205 | }, |
195 | } | 206 | } |
196 | }; | 207 | }; |
diff --git a/arch/sh/boards/board-espt.c b/arch/sh/boards/board-espt.c new file mode 100644 index 000000000000..d5ce5e18eb37 --- /dev/null +++ b/arch/sh/boards/board-espt.c | |||
@@ -0,0 +1,102 @@ | |||
1 | /* | ||
2 | * Data Technology Inc. ESPT-GIGA board suport | ||
3 | * | ||
4 | * Copyright (C) 2008, 2009 Renesas Solutions Corp. | ||
5 | * Copyright (C) 2008, 2009 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/interrupt.h> | ||
14 | #include <linux/mtd/physmap.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <asm/machvec.h> | ||
17 | #include <asm/sizes.h> | ||
18 | #include <asm/sh_eth.h> | ||
19 | |||
20 | /* NOR Flash */ | ||
21 | static struct mtd_partition espt_nor_flash_partitions[] = { | ||
22 | { | ||
23 | .name = "U-Boot", | ||
24 | .offset = 0, | ||
25 | .size = (2 * SZ_128K), | ||
26 | .mask_flags = MTD_WRITEABLE, /* Read-only */ | ||
27 | }, { | ||
28 | .name = "Linux-Kernel", | ||
29 | .offset = MTDPART_OFS_APPEND, | ||
30 | .size = (20 * SZ_128K), | ||
31 | }, { | ||
32 | .name = "Root Filesystem", | ||
33 | .offset = MTDPART_OFS_APPEND, | ||
34 | .size = MTDPART_SIZ_FULL, | ||
35 | }, | ||
36 | }; | ||
37 | |||
38 | static struct physmap_flash_data espt_nor_flash_data = { | ||
39 | .width = 2, | ||
40 | .parts = espt_nor_flash_partitions, | ||
41 | .nr_parts = ARRAY_SIZE(espt_nor_flash_partitions), | ||
42 | }; | ||
43 | |||
44 | static struct resource espt_nor_flash_resources[] = { | ||
45 | [0] = { | ||
46 | .name = "NOR Flash", | ||
47 | .start = 0, | ||
48 | .end = SZ_8M - 1, | ||
49 | .flags = IORESOURCE_MEM, | ||
50 | }, | ||
51 | }; | ||
52 | |||
53 | static struct platform_device espt_nor_flash_device = { | ||
54 | .name = "physmap-flash", | ||
55 | .resource = espt_nor_flash_resources, | ||
56 | .num_resources = ARRAY_SIZE(espt_nor_flash_resources), | ||
57 | .dev = { | ||
58 | .platform_data = &espt_nor_flash_data, | ||
59 | }, | ||
60 | }; | ||
61 | |||
62 | /* SH-Ether */ | ||
63 | static struct resource sh_eth_resources[] = { | ||
64 | { | ||
65 | .start = 0xFEE00800, /* use eth1 */ | ||
66 | .end = 0xFEE00F7C - 1, | ||
67 | .flags = IORESOURCE_MEM, | ||
68 | }, { | ||
69 | .start = 57, /* irq number */ | ||
70 | .flags = IORESOURCE_IRQ, | ||
71 | }, | ||
72 | }; | ||
73 | |||
74 | static struct sh_eth_plat_data sh7763_eth_pdata = { | ||
75 | .phy = 0, | ||
76 | .edmac_endian = EDMAC_LITTLE_ENDIAN, | ||
77 | }; | ||
78 | |||
79 | static struct platform_device espt_eth_device = { | ||
80 | .name = "sh-eth", | ||
81 | .resource = sh_eth_resources, | ||
82 | .num_resources = ARRAY_SIZE(sh_eth_resources), | ||
83 | .dev = { | ||
84 | .platform_data = &sh7763_eth_pdata, | ||
85 | }, | ||
86 | }; | ||
87 | |||
88 | static struct platform_device *espt_devices[] __initdata = { | ||
89 | &espt_nor_flash_device, | ||
90 | &espt_eth_device, | ||
91 | }; | ||
92 | |||
93 | static int __init espt_devices_setup(void) | ||
94 | { | ||
95 | return platform_add_devices(espt_devices, | ||
96 | ARRAY_SIZE(espt_devices)); | ||
97 | } | ||
98 | device_initcall(espt_devices_setup); | ||
99 | |||
100 | static struct sh_machine_vector mv_espt __initmv = { | ||
101 | .mv_name = "ESPT-GIGA", | ||
102 | }; | ||
diff --git a/arch/sh/boards/board-polaris.c b/arch/sh/boards/board-polaris.c new file mode 100644 index 000000000000..62607eb51004 --- /dev/null +++ b/arch/sh/boards/board-polaris.c | |||
@@ -0,0 +1,149 @@ | |||
1 | /* | ||
2 | * June 2006 steve.glendinning@smsc.com | ||
3 | * | ||
4 | * Polaris-specific resource declaration | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/init.h> | ||
9 | #include <linux/interrupt.h> | ||
10 | #include <linux/irq.h> | ||
11 | #include <linux/platform_device.h> | ||
12 | #include <linux/smsc911x.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <asm/irq.h> | ||
15 | #include <asm/machvec.h> | ||
16 | #include <asm/heartbeat.h> | ||
17 | #include <cpu/gpio.h> | ||
18 | #include <mach-se/mach/se.h> | ||
19 | |||
20 | #define BCR2 (0xFFFFFF62) | ||
21 | #define WCR2 (0xFFFFFF66) | ||
22 | #define AREA5_WAIT_CTRL (0x1C00) | ||
23 | #define WAIT_STATES_10 (0x7) | ||
24 | |||
25 | static struct resource smsc911x_resources[] = { | ||
26 | [0] = { | ||
27 | .name = "smsc911x-memory", | ||
28 | .start = PA_EXT5, | ||
29 | .end = PA_EXT5 + 0x1fff, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }, | ||
32 | [1] = { | ||
33 | .name = "smsc911x-irq", | ||
34 | .start = IRQ0_IRQ, | ||
35 | .end = IRQ0_IRQ, | ||
36 | .flags = IORESOURCE_IRQ, | ||
37 | }, | ||
38 | }; | ||
39 | |||
40 | static struct smsc911x_platform_config smsc911x_config = { | ||
41 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
42 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
43 | .flags = SMSC911X_USE_32BIT, | ||
44 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
45 | }; | ||
46 | |||
47 | static struct platform_device smsc911x_device = { | ||
48 | .name = "smsc911x", | ||
49 | .id = 0, | ||
50 | .num_resources = ARRAY_SIZE(smsc911x_resources), | ||
51 | .resource = smsc911x_resources, | ||
52 | .dev = { | ||
53 | .platform_data = &smsc911x_config, | ||
54 | }, | ||
55 | }; | ||
56 | |||
57 | static unsigned char heartbeat_bit_pos[] = { 0, 1, 2, 3 }; | ||
58 | |||
59 | static struct heartbeat_data heartbeat_data = { | ||
60 | .bit_pos = heartbeat_bit_pos, | ||
61 | .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), | ||
62 | .regsize = 8, | ||
63 | }; | ||
64 | |||
65 | static struct resource heartbeat_resources[] = { | ||
66 | [0] = { | ||
67 | .start = PORT_PCDR, | ||
68 | .end = PORT_PCDR, | ||
69 | .flags = IORESOURCE_MEM, | ||
70 | }, | ||
71 | }; | ||
72 | |||
73 | static struct platform_device heartbeat_device = { | ||
74 | .name = "heartbeat", | ||
75 | .id = -1, | ||
76 | .dev = { | ||
77 | .platform_data = &heartbeat_data, | ||
78 | }, | ||
79 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
80 | .resource = heartbeat_resources, | ||
81 | }; | ||
82 | |||
83 | static struct platform_device *polaris_devices[] __initdata = { | ||
84 | &smsc911x_device, | ||
85 | &heartbeat_device, | ||
86 | }; | ||
87 | |||
88 | static int __init polaris_initialise(void) | ||
89 | { | ||
90 | u16 wcr, bcr_mask; | ||
91 | |||
92 | printk(KERN_INFO "Configuring Polaris external bus\n"); | ||
93 | |||
94 | /* Configure area 5 with 2 wait states */ | ||
95 | wcr = ctrl_inw(WCR2); | ||
96 | wcr &= (~AREA5_WAIT_CTRL); | ||
97 | wcr |= (WAIT_STATES_10 << 10); | ||
98 | ctrl_outw(wcr, WCR2); | ||
99 | |||
100 | /* Configure area 5 for 32-bit access */ | ||
101 | bcr_mask = ctrl_inw(BCR2); | ||
102 | bcr_mask |= 1 << 10; | ||
103 | ctrl_outw(bcr_mask, BCR2); | ||
104 | |||
105 | return platform_add_devices(polaris_devices, | ||
106 | ARRAY_SIZE(polaris_devices)); | ||
107 | } | ||
108 | arch_initcall(polaris_initialise); | ||
109 | |||
110 | static struct ipr_data ipr_irq_table[] = { | ||
111 | /* External IRQs */ | ||
112 | { IRQ0_IRQ, 0, 0, 1, }, /* IRQ0 */ | ||
113 | { IRQ1_IRQ, 0, 4, 1, }, /* IRQ1 */ | ||
114 | }; | ||
115 | |||
116 | static unsigned long ipr_offsets[] = { | ||
117 | INTC_IPRC | ||
118 | }; | ||
119 | |||
120 | static struct ipr_desc ipr_irq_desc = { | ||
121 | .ipr_offsets = ipr_offsets, | ||
122 | .nr_offsets = ARRAY_SIZE(ipr_offsets), | ||
123 | |||
124 | .ipr_data = ipr_irq_table, | ||
125 | .nr_irqs = ARRAY_SIZE(ipr_irq_table), | ||
126 | .chip = { | ||
127 | .name = "sh7709-ext", | ||
128 | }, | ||
129 | }; | ||
130 | |||
131 | static void __init init_polaris_irq(void) | ||
132 | { | ||
133 | /* Disable all interrupts */ | ||
134 | ctrl_outw(0, BCR_ILCRA); | ||
135 | ctrl_outw(0, BCR_ILCRB); | ||
136 | ctrl_outw(0, BCR_ILCRC); | ||
137 | ctrl_outw(0, BCR_ILCRD); | ||
138 | ctrl_outw(0, BCR_ILCRE); | ||
139 | ctrl_outw(0, BCR_ILCRF); | ||
140 | ctrl_outw(0, BCR_ILCRG); | ||
141 | |||
142 | register_ipr_controller(&ipr_irq_desc); | ||
143 | } | ||
144 | |||
145 | static struct sh_machine_vector mv_polaris __initmv = { | ||
146 | .mv_name = "Polaris", | ||
147 | .mv_nr_irqs = 61, | ||
148 | .mv_init_irq = init_polaris_irq, | ||
149 | }; | ||
diff --git a/arch/sh/boards/board-sh7785lcr.c b/arch/sh/boards/board-sh7785lcr.c index 38a64968d7bf..94c0296bc35d 100644 --- a/arch/sh/boards/board-sh7785lcr.c +++ b/arch/sh/boards/board-sh7785lcr.c | |||
@@ -275,7 +275,18 @@ void __init init_sh7785lcr_IRQ(void) | |||
275 | 275 | ||
276 | static void sh7785lcr_power_off(void) | 276 | static void sh7785lcr_power_off(void) |
277 | { | 277 | { |
278 | ctrl_outb(0x01, P2SEGADDR(PLD_POFCR)); | 278 | unsigned char *p; |
279 | |||
280 | p = ioremap(PLD_POFCR, PLD_POFCR + 1); | ||
281 | if (!p) { | ||
282 | printk(KERN_ERR "%s: ioremap error.\n", __func__); | ||
283 | return; | ||
284 | } | ||
285 | *p = 0x01; | ||
286 | iounmap(p); | ||
287 | set_bl_bit(); | ||
288 | while (1) | ||
289 | cpu_relax(); | ||
279 | } | 290 | } |
280 | 291 | ||
281 | /* Initialize the board */ | 292 | /* Initialize the board */ |
diff --git a/arch/sh/boards/board-urquell.c b/arch/sh/boards/board-urquell.c new file mode 100644 index 000000000000..17036ce20086 --- /dev/null +++ b/arch/sh/boards/board-urquell.c | |||
@@ -0,0 +1,162 @@ | |||
1 | /* | ||
2 | * Renesas Technology Corp. SH7786 Urquell Support. | ||
3 | * | ||
4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
5 | * Copyright (C) 2008 Yoshihiro Shimoda | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/fb.h> | ||
14 | #include <linux/smc91x.h> | ||
15 | #include <linux/mtd/physmap.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/gpio.h> | ||
18 | #include <linux/irq.h> | ||
19 | #include <mach/urquell.h> | ||
20 | #include <cpu/sh7786.h> | ||
21 | #include <asm/heartbeat.h> | ||
22 | #include <asm/sizes.h> | ||
23 | |||
24 | static struct resource heartbeat_resources[] = { | ||
25 | [0] = { | ||
26 | .start = BOARDREG(SLEDR), | ||
27 | .end = BOARDREG(SLEDR), | ||
28 | .flags = IORESOURCE_MEM, | ||
29 | }, | ||
30 | }; | ||
31 | |||
32 | static struct heartbeat_data heartbeat_data = { | ||
33 | .regsize = 16, | ||
34 | }; | ||
35 | |||
36 | static struct platform_device heartbeat_device = { | ||
37 | .name = "heartbeat", | ||
38 | .id = -1, | ||
39 | .dev = { | ||
40 | .platform_data = &heartbeat_data, | ||
41 | }, | ||
42 | .num_resources = ARRAY_SIZE(heartbeat_resources), | ||
43 | .resource = heartbeat_resources, | ||
44 | }; | ||
45 | |||
46 | static struct smc91x_platdata smc91x_info = { | ||
47 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
48 | }; | ||
49 | |||
50 | static struct resource smc91x_eth_resources[] = { | ||
51 | [0] = { | ||
52 | .name = "SMC91C111" , | ||
53 | .start = 0x05800300, | ||
54 | .end = 0x0580030f, | ||
55 | .flags = IORESOURCE_MEM, | ||
56 | }, | ||
57 | [1] = { | ||
58 | .start = 11, | ||
59 | .flags = IORESOURCE_IRQ, | ||
60 | }, | ||
61 | }; | ||
62 | |||
63 | static struct platform_device smc91x_eth_device = { | ||
64 | .name = "smc91x", | ||
65 | .num_resources = ARRAY_SIZE(smc91x_eth_resources), | ||
66 | .resource = smc91x_eth_resources, | ||
67 | .dev = { | ||
68 | .platform_data = &smc91x_info, | ||
69 | }, | ||
70 | }; | ||
71 | |||
72 | static struct mtd_partition nor_flash_partitions[] = { | ||
73 | { | ||
74 | .name = "loader", | ||
75 | .offset = 0x00000000, | ||
76 | .size = SZ_512K, | ||
77 | .mask_flags = MTD_WRITEABLE, /* Read-only */ | ||
78 | }, | ||
79 | { | ||
80 | .name = "bootenv", | ||
81 | .offset = MTDPART_OFS_APPEND, | ||
82 | .size = SZ_512K, | ||
83 | .mask_flags = MTD_WRITEABLE, /* Read-only */ | ||
84 | }, | ||
85 | { | ||
86 | .name = "kernel", | ||
87 | .offset = MTDPART_OFS_APPEND, | ||
88 | .size = SZ_4M, | ||
89 | }, | ||
90 | { | ||
91 | .name = "data", | ||
92 | .offset = MTDPART_OFS_APPEND, | ||
93 | .size = MTDPART_SIZ_FULL, | ||
94 | }, | ||
95 | }; | ||
96 | |||
97 | static struct physmap_flash_data nor_flash_data = { | ||
98 | .width = 2, | ||
99 | .parts = nor_flash_partitions, | ||
100 | .nr_parts = ARRAY_SIZE(nor_flash_partitions), | ||
101 | }; | ||
102 | |||
103 | static struct resource nor_flash_resources[] = { | ||
104 | [0] = { | ||
105 | .start = NOR_FLASH_ADDR, | ||
106 | .end = NOR_FLASH_ADDR + NOR_FLASH_SIZE - 1, | ||
107 | .flags = IORESOURCE_MEM, | ||
108 | } | ||
109 | }; | ||
110 | |||
111 | static struct platform_device nor_flash_device = { | ||
112 | .name = "physmap-flash", | ||
113 | .dev = { | ||
114 | .platform_data = &nor_flash_data, | ||
115 | }, | ||
116 | .num_resources = ARRAY_SIZE(nor_flash_resources), | ||
117 | .resource = nor_flash_resources, | ||
118 | }; | ||
119 | |||
120 | static struct platform_device *urquell_devices[] __initdata = { | ||
121 | &heartbeat_device, | ||
122 | &smc91x_eth_device, | ||
123 | &nor_flash_device, | ||
124 | }; | ||
125 | |||
126 | static int __init urquell_devices_setup(void) | ||
127 | { | ||
128 | /* USB */ | ||
129 | gpio_request(GPIO_FN_USB_OVC0, NULL); | ||
130 | gpio_request(GPIO_FN_USB_PENC0, NULL); | ||
131 | |||
132 | return platform_add_devices(urquell_devices, | ||
133 | ARRAY_SIZE(urquell_devices)); | ||
134 | } | ||
135 | device_initcall(urquell_devices_setup); | ||
136 | |||
137 | static void urquell_power_off(void) | ||
138 | { | ||
139 | __raw_writew(0xa5a5, UBOARDREG(SRSTR)); | ||
140 | } | ||
141 | |||
142 | static void __init urquell_init_irq(void) | ||
143 | { | ||
144 | plat_irq_setup_pins(IRQ_MODE_IRL3210_MASK); | ||
145 | } | ||
146 | |||
147 | /* Initialize the board */ | ||
148 | static void __init urquell_setup(char **cmdline_p) | ||
149 | { | ||
150 | printk(KERN_INFO "Renesas Technology Corp. Urquell support.\n"); | ||
151 | |||
152 | pm_power_off = urquell_power_off; | ||
153 | } | ||
154 | |||
155 | /* | ||
156 | * The Machine Vector | ||
157 | */ | ||
158 | static struct sh_machine_vector mv_urquell __initmv = { | ||
159 | .mv_name = "Urquell", | ||
160 | .mv_setup = urquell_setup, | ||
161 | .mv_init_irq = urquell_init_irq, | ||
162 | }; | ||
diff --git a/arch/sh/boards/mach-highlander/Kconfig b/arch/sh/boards/mach-highlander/Kconfig index 08057f62687b..def49cc0a7b9 100644 --- a/arch/sh/boards/mach-highlander/Kconfig +++ b/arch/sh/boards/mach-highlander/Kconfig | |||
@@ -18,7 +18,7 @@ config SH_R7780MP | |||
18 | config SH_R7785RP | 18 | config SH_R7785RP |
19 | bool "R7785RP board support" | 19 | bool "R7785RP board support" |
20 | depends on CPU_SUBTYPE_SH7785 | 20 | depends on CPU_SUBTYPE_SH7785 |
21 | select GENERIC_GPIO | 21 | select ARCH_REQUIRE_GPIOLIB |
22 | 22 | ||
23 | endchoice | 23 | endchoice |
24 | 24 | ||
diff --git a/arch/sh/boards/mach-hp6xx/pm_wakeup.S b/arch/sh/boards/mach-hp6xx/pm_wakeup.S index 44b648cf6f23..4f18d44e0541 100644 --- a/arch/sh/boards/mach-hp6xx/pm_wakeup.S +++ b/arch/sh/boards/mach-hp6xx/pm_wakeup.S | |||
@@ -10,47 +10,32 @@ | |||
10 | #include <linux/linkage.h> | 10 | #include <linux/linkage.h> |
11 | #include <cpu/mmu_context.h> | 11 | #include <cpu/mmu_context.h> |
12 | 12 | ||
13 | #define k0 r0 | ||
14 | #define k1 r1 | ||
15 | #define k2 r2 | ||
16 | #define k3 r3 | ||
17 | #define k4 r4 | ||
18 | |||
19 | /* | 13 | /* |
20 | * Kernel mode register usage: | 14 | * Kernel mode register usage: |
21 | * k0 scratch | 15 | * k0 scratch |
22 | * k1 scratch | 16 | * k1 scratch |
23 | * k2 scratch (Exception code) | 17 | * For more details, please have a look at entry.S |
24 | * k3 scratch (Return address) | ||
25 | * k4 scratch | ||
26 | * k5 reserved | ||
27 | * k6 Global Interrupt Mask (0--15 << 4) | ||
28 | * k7 CURRENT_THREAD_INFO (pointer to current thread info) | ||
29 | */ | 18 | */ |
30 | 19 | ||
20 | #define k0 r0 | ||
21 | #define k1 r1 | ||
22 | |||
31 | ENTRY(wakeup_start) | 23 | ENTRY(wakeup_start) |
32 | ! clear STBY bit | 24 | ! clear STBY bit |
33 | mov #-126, k2 | 25 | mov #-126, k1 |
34 | and #127, k0 | 26 | and #127, k0 |
35 | mov.b k0, @k2 | 27 | mov.b k0, @k1 |
36 | ! enable refresh | 28 | ! enable refresh |
37 | mov.l 5f, k1 | 29 | mov.l 5f, k1 |
38 | mov.w 6f, k0 | 30 | mov.w 6f, k0 |
39 | mov.w k0, @k1 | 31 | mov.w k0, @k1 |
40 | ! jump to handler | 32 | ! jump to handler |
41 | mov.l 2f, k2 | ||
42 | mov.l 3f, k3 | ||
43 | mov.l @k2, k2 | ||
44 | |||
45 | mov.l 4f, k1 | 33 | mov.l 4f, k1 |
46 | jmp @k1 | 34 | jmp @k1 |
47 | nop | 35 | nop |
48 | 36 | ||
49 | .align 2 | 37 | .align 2 |
50 | 1: .long EXPEVT | 38 | 4: .long handle_interrupt |
51 | 2: .long INTEVT | ||
52 | 3: .long ret_from_irq | ||
53 | 4: .long handle_exception | ||
54 | 5: .long 0xffffff68 | 39 | 5: .long 0xffffff68 |
55 | 6: .word 0x0524 | 40 | 6: .word 0x0524 |
56 | 41 | ||
diff --git a/arch/sh/boards/mach-hp6xx/setup.c b/arch/sh/boards/mach-hp6xx/setup.c index 746742bdc014..8f305b36358b 100644 --- a/arch/sh/boards/mach-hp6xx/setup.c +++ b/arch/sh/boards/mach-hp6xx/setup.c | |||
@@ -115,7 +115,6 @@ static struct sh_machine_vector mv_hp6xx __initmv = { | |||
115 | .mv_setup = hp6xx_setup, | 115 | .mv_setup = hp6xx_setup, |
116 | /* IRQ's : CPU(64) + CCHIP(16) + FREE_TO_USE(6) */ | 116 | /* IRQ's : CPU(64) + CCHIP(16) + FREE_TO_USE(6) */ |
117 | .mv_nr_irqs = HD64461_IRQBASE + HD64461_IRQ_NUM + 6, | 117 | .mv_nr_irqs = HD64461_IRQBASE + HD64461_IRQ_NUM + 6, |
118 | .mv_irq_demux = hd64461_irq_demux, | ||
119 | /* Enable IRQ0 -> IRQ3 in IRQ_MODE */ | 118 | /* Enable IRQ0 -> IRQ3 in IRQ_MODE */ |
120 | .mv_init_irq = hp6xx_init_irq, | 119 | .mv_init_irq = hp6xx_init_irq, |
121 | }; | 120 | }; |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 28e56c5809a2..bc35b4cae6b3 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
@@ -450,6 +450,14 @@ static struct spi_board_info migor_spi_devices[] = { | |||
450 | 450 | ||
451 | static int __init migor_devices_setup(void) | 451 | static int __init migor_devices_setup(void) |
452 | { | 452 | { |
453 | |||
454 | #ifdef CONFIG_PM | ||
455 | /* Let D11 LED show STATUS0 */ | ||
456 | gpio_request(GPIO_FN_STATUS0, NULL); | ||
457 | |||
458 | /* Lit D12 LED show PDSTATUS */ | ||
459 | gpio_request(GPIO_FN_PDSTATUS, NULL); | ||
460 | #else | ||
453 | /* Lit D11 LED */ | 461 | /* Lit D11 LED */ |
454 | gpio_request(GPIO_PTJ7, NULL); | 462 | gpio_request(GPIO_PTJ7, NULL); |
455 | gpio_direction_output(GPIO_PTJ7, 1); | 463 | gpio_direction_output(GPIO_PTJ7, 1); |
@@ -459,6 +467,7 @@ static int __init migor_devices_setup(void) | |||
459 | gpio_request(GPIO_PTJ5, NULL); | 467 | gpio_request(GPIO_PTJ5, NULL); |
460 | gpio_direction_output(GPIO_PTJ5, 1); | 468 | gpio_direction_output(GPIO_PTJ5, 1); |
461 | gpio_export(GPIO_PTJ5, 0); | 469 | gpio_export(GPIO_PTJ5, 0); |
470 | #endif | ||
462 | 471 | ||
463 | /* SMC91C111 - Enable IRQ0, Setup CS4 for 16-bit fast access */ | 472 | /* SMC91C111 - Enable IRQ0, Setup CS4 for 16-bit fast access */ |
464 | gpio_request(GPIO_FN_IRQ0, NULL); | 473 | gpio_request(GPIO_FN_IRQ0, NULL); |
diff --git a/arch/sh/boards/mach-rsk/Kconfig b/arch/sh/boards/mach-rsk/Kconfig index bff095dffc02..aeff3b042205 100644 --- a/arch/sh/boards/mach-rsk/Kconfig +++ b/arch/sh/boards/mach-rsk/Kconfig | |||
@@ -10,7 +10,7 @@ config SH_RSK7201 | |||
10 | 10 | ||
11 | config SH_RSK7203 | 11 | config SH_RSK7203 |
12 | bool "RSK7203" | 12 | bool "RSK7203" |
13 | select GENERIC_GPIO | 13 | select ARCH_REQUIRE_GPIOLIB |
14 | depends on CPU_SUBTYPE_SH7203 | 14 | depends on CPU_SUBTYPE_SH7203 |
15 | 15 | ||
16 | endchoice | 16 | endchoice |
diff --git a/arch/sh/boards/mach-sh7763rdp/setup.c b/arch/sh/boards/mach-sh7763rdp/setup.c index 6f926fd2162b..390534a0b35c 100644 --- a/arch/sh/boards/mach-sh7763rdp/setup.c +++ b/arch/sh/boards/mach-sh7763rdp/setup.c | |||
@@ -63,15 +63,19 @@ static struct platform_device sh7763rdp_nor_flash_device = { | |||
63 | }, | 63 | }, |
64 | }; | 64 | }; |
65 | 65 | ||
66 | /* SH-Ether */ | 66 | /* |
67 | * SH-Ether | ||
68 | * | ||
69 | * SH Ether of SH7763 has multi IRQ handling. | ||
70 | * (57,58,59 -> 57) | ||
71 | */ | ||
67 | static struct resource sh_eth_resources[] = { | 72 | static struct resource sh_eth_resources[] = { |
68 | { | 73 | { |
69 | .start = 0xFEE00800, /* use eth1 */ | 74 | .start = 0xFEE00800, /* use eth1 */ |
70 | .end = 0xFEE00F7C - 1, | 75 | .end = 0xFEE00F7C - 1, |
71 | .flags = IORESOURCE_MEM, | 76 | .flags = IORESOURCE_MEM, |
72 | }, { | 77 | }, { |
73 | .start = 58, /* irq number */ | 78 | .start = 57, /* irq number */ |
74 | .end = 58, | ||
75 | .flags = IORESOURCE_IRQ, | 79 | .flags = IORESOURCE_IRQ, |
76 | }, | 80 | }, |
77 | }; | 81 | }; |
diff --git a/arch/sh/boot/Makefile b/arch/sh/boot/Makefile index c16ccd4bfa16..95483d161258 100644 --- a/arch/sh/boot/Makefile +++ b/arch/sh/boot/Makefile | |||
@@ -33,20 +33,24 @@ $(obj)/zImage: $(obj)/compressed/vmlinux FORCE | |||
33 | $(obj)/compressed/vmlinux: FORCE | 33 | $(obj)/compressed/vmlinux: FORCE |
34 | $(Q)$(MAKE) $(build)=$(obj)/compressed $@ | 34 | $(Q)$(MAKE) $(build)=$(obj)/compressed $@ |
35 | 35 | ||
36 | ifeq ($(CONFIG_32BIT),y) | 36 | KERNEL_MEMORY := 0x00000000 |
37 | KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \ | 37 | ifeq ($(CONFIG_PMB_FIXED),y) |
38 | $$[$(CONFIG_PAGE_OFFSET) + \ | 38 | KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \ |
39 | $(CONFIG_ZERO_PAGE_OFFSET)]') | 39 | $$[$(CONFIG_MEMORY_START) & 0x1fffffff]') |
40 | else | 40 | endif |
41 | ifeq ($(CONFIG_29BIT),y) | ||
42 | KERNEL_MEMORY := $(shell /bin/bash -c 'printf "0x%08x" \ | ||
43 | $$[$(CONFIG_MEMORY_START)]') | ||
44 | endif | ||
45 | |||
41 | KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \ | 46 | KERNEL_LOAD := $(shell /bin/bash -c 'printf "0x%08x" \ |
42 | $$[$(CONFIG_PAGE_OFFSET) + \ | 47 | $$[$(CONFIG_PAGE_OFFSET) + \ |
43 | $(CONFIG_MEMORY_START) + \ | 48 | $(KERNEL_MEMORY) + \ |
44 | $(CONFIG_ZERO_PAGE_OFFSET)]') | 49 | $(CONFIG_ZERO_PAGE_OFFSET)]') |
45 | endif | ||
46 | 50 | ||
47 | KERNEL_ENTRY := $(shell /bin/bash -c 'printf "0x%08x" \ | 51 | KERNEL_ENTRY := $(shell /bin/bash -c 'printf "0x%08x" \ |
48 | $$[$(CONFIG_PAGE_OFFSET) + \ | 52 | $$[$(CONFIG_PAGE_OFFSET) + \ |
49 | $(CONFIG_MEMORY_START) + \ | 53 | $(KERNEL_MEMORY) + \ |
50 | $(CONFIG_ZERO_PAGE_OFFSET) + $(CONFIG_ENTRY_OFFSET)]') | 54 | $(CONFIG_ZERO_PAGE_OFFSET) + $(CONFIG_ENTRY_OFFSET)]') |
51 | 55 | ||
52 | quiet_cmd_uimage = UIMAGE $@ | 56 | quiet_cmd_uimage = UIMAGE $@ |
diff --git a/arch/sh/cchips/hd6446x/hd64461.c b/arch/sh/cchips/hd6446x/hd64461.c index 27ceeb948bb1..25ef91061521 100644 --- a/arch/sh/cchips/hd6446x/hd64461.c +++ b/arch/sh/cchips/hd6446x/hd64461.c | |||
@@ -53,21 +53,22 @@ static struct irq_chip hd64461_irq_chip = { | |||
53 | .unmask = hd64461_unmask_irq, | 53 | .unmask = hd64461_unmask_irq, |
54 | }; | 54 | }; |
55 | 55 | ||
56 | int hd64461_irq_demux(int irq) | 56 | static void hd64461_irq_demux(unsigned int irq, struct irq_desc *desc) |
57 | { | 57 | { |
58 | if (irq == CONFIG_HD64461_IRQ) { | 58 | unsigned short intv = ctrl_inw(HD64461_NIRR); |
59 | unsigned short bit; | 59 | struct irq_desc *ext_desc; |
60 | unsigned short nirr = inw(HD64461_NIRR); | 60 | unsigned int ext_irq = HD64461_IRQBASE; |
61 | unsigned short nimr = inw(HD64461_NIMR); | 61 | |
62 | int i; | 62 | intv &= (1 << HD64461_IRQ_NUM) - 1; |
63 | 63 | ||
64 | nirr &= ~nimr; | 64 | while (intv) { |
65 | for (bit = 1, i = 0; i < 16; bit <<= 1, i++) | 65 | if (intv & 1) { |
66 | if (nirr & bit) | 66 | ext_desc = irq_desc + ext_irq; |
67 | break; | 67 | handle_level_irq(ext_irq, ext_desc); |
68 | irq = HD64461_IRQBASE + i; | 68 | } |
69 | intv >>= 1; | ||
70 | ext_irq++; | ||
69 | } | 71 | } |
70 | return irq; | ||
71 | } | 72 | } |
72 | 73 | ||
73 | int __init setup_hd64461(void) | 74 | int __init setup_hd64461(void) |
@@ -93,6 +94,9 @@ int __init setup_hd64461(void) | |||
93 | set_irq_chip_and_handler(i, &hd64461_irq_chip, | 94 | set_irq_chip_and_handler(i, &hd64461_irq_chip, |
94 | handle_level_irq); | 95 | handle_level_irq); |
95 | 96 | ||
97 | set_irq_chained_handler(CONFIG_HD64461_IRQ, hd64461_irq_demux); | ||
98 | set_irq_type(CONFIG_HD64461_IRQ, IRQ_TYPE_LEVEL_LOW); | ||
99 | |||
96 | #ifdef CONFIG_HD64461_ENABLER | 100 | #ifdef CONFIG_HD64461_ENABLER |
97 | printk(KERN_INFO "HD64461: enabling PCMCIA devices\n"); | 101 | printk(KERN_INFO "HD64461: enabling PCMCIA devices\n"); |
98 | __raw_writeb(0x4c, HD64461_PCC1CSCIER); | 102 | __raw_writeb(0x4c, HD64461_PCC1CSCIER); |
diff --git a/arch/sh/configs/espt_defconfig b/arch/sh/configs/espt_defconfig new file mode 100644 index 000000000000..873ec42c6e69 --- /dev/null +++ b/arch/sh/configs/espt_defconfig | |||
@@ -0,0 +1,1190 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.29-rc7 | ||
4 | # Tue Mar 17 13:25:58 2009 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_SUPERH32=y | ||
8 | CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
10 | CONFIG_GENERIC_BUG=y | ||
11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
15 | CONFIG_GENERIC_IRQ_PROBE=y | ||
16 | # CONFIG_GENERIC_GPIO is not set | ||
17 | CONFIG_GENERIC_TIME=y | ||
18 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
19 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set | ||
20 | # CONFIG_ARCH_HIBERNATION_POSSIBLE is not set | ||
21 | CONFIG_STACKTRACE_SUPPORT=y | ||
22 | CONFIG_LOCKDEP_SUPPORT=y | ||
23 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
24 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
25 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
26 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
28 | |||
29 | # | ||
30 | # General setup | ||
31 | # | ||
32 | CONFIG_EXPERIMENTAL=y | ||
33 | CONFIG_BROKEN_ON_SMP=y | ||
34 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
35 | CONFIG_LOCALVERSION="" | ||
36 | CONFIG_LOCALVERSION_AUTO=y | ||
37 | CONFIG_SWAP=y | ||
38 | CONFIG_SYSVIPC=y | ||
39 | CONFIG_SYSVIPC_SYSCTL=y | ||
40 | # CONFIG_POSIX_MQUEUE is not set | ||
41 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
42 | # CONFIG_TASKSTATS is not set | ||
43 | # CONFIG_AUDIT is not set | ||
44 | |||
45 | # | ||
46 | # RCU Subsystem | ||
47 | # | ||
48 | CONFIG_CLASSIC_RCU=y | ||
49 | # CONFIG_TREE_RCU is not set | ||
50 | # CONFIG_PREEMPT_RCU is not set | ||
51 | # CONFIG_TREE_RCU_TRACE is not set | ||
52 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
53 | CONFIG_IKCONFIG=y | ||
54 | CONFIG_IKCONFIG_PROC=y | ||
55 | CONFIG_LOG_BUF_SHIFT=14 | ||
56 | CONFIG_GROUP_SCHED=y | ||
57 | CONFIG_FAIR_GROUP_SCHED=y | ||
58 | # CONFIG_RT_GROUP_SCHED is not set | ||
59 | CONFIG_USER_SCHED=y | ||
60 | # CONFIG_CGROUP_SCHED is not set | ||
61 | # CONFIG_CGROUPS is not set | ||
62 | CONFIG_SYSFS_DEPRECATED=y | ||
63 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
64 | # CONFIG_RELAY is not set | ||
65 | CONFIG_NAMESPACES=y | ||
66 | CONFIG_UTS_NS=y | ||
67 | CONFIG_IPC_NS=y | ||
68 | # CONFIG_USER_NS is not set | ||
69 | # CONFIG_PID_NS is not set | ||
70 | # CONFIG_NET_NS is not set | ||
71 | # CONFIG_BLK_DEV_INITRD is not set | ||
72 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
73 | CONFIG_SYSCTL=y | ||
74 | CONFIG_EMBEDDED=y | ||
75 | CONFIG_UID16=y | ||
76 | # CONFIG_SYSCTL_SYSCALL is not set | ||
77 | CONFIG_KALLSYMS=y | ||
78 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
79 | CONFIG_HOTPLUG=y | ||
80 | CONFIG_PRINTK=y | ||
81 | CONFIG_BUG=y | ||
82 | CONFIG_ELF_CORE=y | ||
83 | CONFIG_COMPAT_BRK=y | ||
84 | CONFIG_BASE_FULL=y | ||
85 | CONFIG_FUTEX=y | ||
86 | CONFIG_ANON_INODES=y | ||
87 | CONFIG_EPOLL=y | ||
88 | CONFIG_SIGNALFD=y | ||
89 | CONFIG_TIMERFD=y | ||
90 | CONFIG_EVENTFD=y | ||
91 | CONFIG_SHMEM=y | ||
92 | CONFIG_AIO=y | ||
93 | CONFIG_VM_EVENT_COUNTERS=y | ||
94 | CONFIG_SLAB=y | ||
95 | # CONFIG_SLUB is not set | ||
96 | # CONFIG_SLOB is not set | ||
97 | CONFIG_PROFILING=y | ||
98 | CONFIG_TRACEPOINTS=y | ||
99 | # CONFIG_MARKERS is not set | ||
100 | CONFIG_OPROFILE=y | ||
101 | CONFIG_HAVE_OPROFILE=y | ||
102 | # CONFIG_KPROBES is not set | ||
103 | CONFIG_HAVE_IOREMAP_PROT=y | ||
104 | CONFIG_HAVE_KPROBES=y | ||
105 | CONFIG_HAVE_KRETPROBES=y | ||
106 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
107 | CONFIG_HAVE_CLK=y | ||
108 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
109 | CONFIG_SLABINFO=y | ||
110 | CONFIG_RT_MUTEXES=y | ||
111 | CONFIG_BASE_SMALL=0 | ||
112 | CONFIG_MODULES=y | ||
113 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
114 | # CONFIG_MODULE_UNLOAD is not set | ||
115 | # CONFIG_MODVERSIONS is not set | ||
116 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
117 | CONFIG_BLOCK=y | ||
118 | # CONFIG_LBD is not set | ||
119 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
120 | # CONFIG_BLK_DEV_BSG is not set | ||
121 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
122 | |||
123 | # | ||
124 | # IO Schedulers | ||
125 | # | ||
126 | CONFIG_IOSCHED_NOOP=y | ||
127 | CONFIG_IOSCHED_AS=y | ||
128 | CONFIG_IOSCHED_DEADLINE=y | ||
129 | CONFIG_IOSCHED_CFQ=y | ||
130 | CONFIG_DEFAULT_AS=y | ||
131 | # CONFIG_DEFAULT_DEADLINE is not set | ||
132 | # CONFIG_DEFAULT_CFQ is not set | ||
133 | # CONFIG_DEFAULT_NOOP is not set | ||
134 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
135 | # CONFIG_FREEZER is not set | ||
136 | |||
137 | # | ||
138 | # System type | ||
139 | # | ||
140 | CONFIG_CPU_SH4=y | ||
141 | CONFIG_CPU_SH4A=y | ||
142 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | ||
143 | # CONFIG_CPU_SUBTYPE_SH7201 is not set | ||
144 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | ||
145 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | ||
147 | # CONFIG_CPU_SUBTYPE_MXG is not set | ||
148 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
149 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
150 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
151 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
152 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
153 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH7720 is not set | ||
156 | # CONFIG_CPU_SUBTYPE_SH7721 is not set | ||
157 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
158 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
159 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
160 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
161 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
162 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
163 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
164 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
165 | # CONFIG_CPU_SUBTYPE_SH7723 is not set | ||
166 | CONFIG_CPU_SUBTYPE_SH7763=y | ||
167 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
168 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
169 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | ||
170 | # CONFIG_CPU_SUBTYPE_SH7786 is not set | ||
171 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | ||
172 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | ||
173 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | ||
174 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
175 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
176 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
177 | |||
178 | # | ||
179 | # Memory management options | ||
180 | # | ||
181 | CONFIG_QUICKLIST=y | ||
182 | CONFIG_MMU=y | ||
183 | CONFIG_PAGE_OFFSET=0x80000000 | ||
184 | CONFIG_MEMORY_START=0x0c000000 | ||
185 | CONFIG_MEMORY_SIZE=0x04000000 | ||
186 | CONFIG_29BIT=y | ||
187 | CONFIG_VSYSCALL=y | ||
188 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
189 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
190 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
191 | CONFIG_MAX_ACTIVE_REGIONS=1 | ||
192 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
193 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
194 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
195 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
196 | CONFIG_PAGE_SIZE_4KB=y | ||
197 | # CONFIG_PAGE_SIZE_8KB is not set | ||
198 | # CONFIG_PAGE_SIZE_16KB is not set | ||
199 | # CONFIG_PAGE_SIZE_64KB is not set | ||
200 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
201 | CONFIG_SELECT_MEMORY_MODEL=y | ||
202 | # CONFIG_FLATMEM_MANUAL is not set | ||
203 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
204 | CONFIG_SPARSEMEM_MANUAL=y | ||
205 | CONFIG_SPARSEMEM=y | ||
206 | CONFIG_HAVE_MEMORY_PRESENT=y | ||
207 | CONFIG_SPARSEMEM_STATIC=y | ||
208 | # CONFIG_MEMORY_HOTPLUG is not set | ||
209 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
210 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
211 | CONFIG_MIGRATION=y | ||
212 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
213 | CONFIG_ZONE_DMA_FLAG=0 | ||
214 | CONFIG_NR_QUICK=2 | ||
215 | CONFIG_UNEVICTABLE_LRU=y | ||
216 | |||
217 | # | ||
218 | # Cache configuration | ||
219 | # | ||
220 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
221 | CONFIG_CACHE_WRITEBACK=y | ||
222 | # CONFIG_CACHE_WRITETHROUGH is not set | ||
223 | # CONFIG_CACHE_OFF is not set | ||
224 | |||
225 | # | ||
226 | # Processor features | ||
227 | # | ||
228 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
229 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
230 | CONFIG_SH_FPU=y | ||
231 | # CONFIG_SH_STORE_QUEUES is not set | ||
232 | CONFIG_CPU_HAS_INTEVT=y | ||
233 | CONFIG_CPU_HAS_SR_RB=y | ||
234 | CONFIG_CPU_HAS_FPU=y | ||
235 | |||
236 | # | ||
237 | # Board support | ||
238 | # | ||
239 | # CONFIG_SH_SH7763RDP is not set | ||
240 | CONFIG_SH_ESPT=y | ||
241 | |||
242 | # | ||
243 | # Timer and clock configuration | ||
244 | # | ||
245 | CONFIG_SH_TMU=y | ||
246 | CONFIG_SH_TIMER_IRQ=28 | ||
247 | CONFIG_SH_PCLK_FREQ=66666666 | ||
248 | # CONFIG_NO_HZ is not set | ||
249 | # CONFIG_HIGH_RES_TIMERS is not set | ||
250 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
251 | |||
252 | # | ||
253 | # CPU Frequency scaling | ||
254 | # | ||
255 | # CONFIG_CPU_FREQ is not set | ||
256 | |||
257 | # | ||
258 | # DMA support | ||
259 | # | ||
260 | # CONFIG_SH_DMA is not set | ||
261 | |||
262 | # | ||
263 | # Companion Chips | ||
264 | # | ||
265 | |||
266 | # | ||
267 | # Additional SuperH Device Drivers | ||
268 | # | ||
269 | # CONFIG_HEARTBEAT is not set | ||
270 | # CONFIG_PUSH_SWITCH is not set | ||
271 | |||
272 | # | ||
273 | # Kernel features | ||
274 | # | ||
275 | # CONFIG_HZ_100 is not set | ||
276 | CONFIG_HZ_250=y | ||
277 | # CONFIG_HZ_300 is not set | ||
278 | # CONFIG_HZ_1000 is not set | ||
279 | CONFIG_HZ=250 | ||
280 | # CONFIG_SCHED_HRTICK is not set | ||
281 | # CONFIG_KEXEC is not set | ||
282 | # CONFIG_CRASH_DUMP is not set | ||
283 | CONFIG_SECCOMP=y | ||
284 | CONFIG_PREEMPT_NONE=y | ||
285 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
286 | # CONFIG_PREEMPT is not set | ||
287 | CONFIG_GUSA=y | ||
288 | |||
289 | # | ||
290 | # Boot options | ||
291 | # | ||
292 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
293 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
294 | CONFIG_CMDLINE_BOOL=y | ||
295 | CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/nfs ip=bootp" | ||
296 | |||
297 | # | ||
298 | # Bus options | ||
299 | # | ||
300 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
301 | # CONFIG_PCCARD is not set | ||
302 | |||
303 | # | ||
304 | # Executable file formats | ||
305 | # | ||
306 | CONFIG_BINFMT_ELF=y | ||
307 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
308 | # CONFIG_HAVE_AOUT is not set | ||
309 | # CONFIG_BINFMT_MISC is not set | ||
310 | |||
311 | # | ||
312 | # Power management options (EXPERIMENTAL) | ||
313 | # | ||
314 | # CONFIG_PM is not set | ||
315 | # CONFIG_CPU_IDLE is not set | ||
316 | CONFIG_NET=y | ||
317 | |||
318 | # | ||
319 | # Networking options | ||
320 | # | ||
321 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
322 | CONFIG_PACKET=y | ||
323 | # CONFIG_PACKET_MMAP is not set | ||
324 | CONFIG_UNIX=y | ||
325 | CONFIG_XFRM=y | ||
326 | # CONFIG_XFRM_USER is not set | ||
327 | # CONFIG_XFRM_SUB_POLICY is not set | ||
328 | # CONFIG_XFRM_MIGRATE is not set | ||
329 | # CONFIG_XFRM_STATISTICS is not set | ||
330 | # CONFIG_NET_KEY is not set | ||
331 | CONFIG_INET=y | ||
332 | # CONFIG_IP_MULTICAST is not set | ||
333 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
334 | CONFIG_IP_FIB_HASH=y | ||
335 | CONFIG_IP_PNP=y | ||
336 | CONFIG_IP_PNP_DHCP=y | ||
337 | CONFIG_IP_PNP_BOOTP=y | ||
338 | # CONFIG_IP_PNP_RARP is not set | ||
339 | # CONFIG_NET_IPIP is not set | ||
340 | # CONFIG_NET_IPGRE is not set | ||
341 | # CONFIG_ARPD is not set | ||
342 | # CONFIG_SYN_COOKIES is not set | ||
343 | # CONFIG_INET_AH is not set | ||
344 | # CONFIG_INET_ESP is not set | ||
345 | # CONFIG_INET_IPCOMP is not set | ||
346 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
347 | # CONFIG_INET_TUNNEL is not set | ||
348 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
349 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
350 | CONFIG_INET_XFRM_MODE_BEET=y | ||
351 | # CONFIG_INET_LRO is not set | ||
352 | CONFIG_INET_DIAG=y | ||
353 | CONFIG_INET_TCP_DIAG=y | ||
354 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
355 | CONFIG_TCP_CONG_CUBIC=y | ||
356 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
357 | # CONFIG_TCP_MD5SIG is not set | ||
358 | # CONFIG_IPV6 is not set | ||
359 | # CONFIG_NETWORK_SECMARK is not set | ||
360 | # CONFIG_NETFILTER is not set | ||
361 | # CONFIG_IP_DCCP is not set | ||
362 | # CONFIG_IP_SCTP is not set | ||
363 | # CONFIG_TIPC is not set | ||
364 | # CONFIG_ATM is not set | ||
365 | # CONFIG_BRIDGE is not set | ||
366 | # CONFIG_NET_DSA is not set | ||
367 | # CONFIG_VLAN_8021Q is not set | ||
368 | # CONFIG_DECNET is not set | ||
369 | # CONFIG_LLC2 is not set | ||
370 | # CONFIG_IPX is not set | ||
371 | # CONFIG_ATALK is not set | ||
372 | # CONFIG_X25 is not set | ||
373 | # CONFIG_LAPB is not set | ||
374 | # CONFIG_ECONET is not set | ||
375 | # CONFIG_WAN_ROUTER is not set | ||
376 | # CONFIG_NET_SCHED is not set | ||
377 | # CONFIG_DCB is not set | ||
378 | |||
379 | # | ||
380 | # Network testing | ||
381 | # | ||
382 | # CONFIG_NET_PKTGEN is not set | ||
383 | # CONFIG_HAMRADIO is not set | ||
384 | # CONFIG_CAN is not set | ||
385 | # CONFIG_IRDA is not set | ||
386 | # CONFIG_BT is not set | ||
387 | # CONFIG_AF_RXRPC is not set | ||
388 | # CONFIG_PHONET is not set | ||
389 | # CONFIG_WIRELESS is not set | ||
390 | # CONFIG_WIMAX is not set | ||
391 | # CONFIG_RFKILL is not set | ||
392 | # CONFIG_NET_9P is not set | ||
393 | |||
394 | # | ||
395 | # Device Drivers | ||
396 | # | ||
397 | |||
398 | # | ||
399 | # Generic Driver Options | ||
400 | # | ||
401 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
402 | CONFIG_STANDALONE=y | ||
403 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
404 | CONFIG_FW_LOADER=y | ||
405 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
406 | CONFIG_EXTRA_FIRMWARE="" | ||
407 | # CONFIG_SYS_HYPERVISOR is not set | ||
408 | # CONFIG_CONNECTOR is not set | ||
409 | CONFIG_MTD=y | ||
410 | # CONFIG_MTD_DEBUG is not set | ||
411 | # CONFIG_MTD_CONCAT is not set | ||
412 | CONFIG_MTD_PARTITIONS=y | ||
413 | # CONFIG_MTD_TESTS is not set | ||
414 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
415 | CONFIG_MTD_CMDLINE_PARTS=y | ||
416 | # CONFIG_MTD_AR7_PARTS is not set | ||
417 | |||
418 | # | ||
419 | # User Modules And Translation Layers | ||
420 | # | ||
421 | CONFIG_MTD_CHAR=y | ||
422 | CONFIG_MTD_BLKDEVS=y | ||
423 | CONFIG_MTD_BLOCK=y | ||
424 | # CONFIG_FTL is not set | ||
425 | # CONFIG_NFTL is not set | ||
426 | # CONFIG_INFTL is not set | ||
427 | # CONFIG_RFD_FTL is not set | ||
428 | # CONFIG_SSFDC is not set | ||
429 | # CONFIG_MTD_OOPS is not set | ||
430 | |||
431 | # | ||
432 | # RAM/ROM/Flash chip drivers | ||
433 | # | ||
434 | CONFIG_MTD_CFI=y | ||
435 | CONFIG_MTD_JEDECPROBE=y | ||
436 | CONFIG_MTD_GEN_PROBE=y | ||
437 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
438 | CONFIG_MTD_CFI_NOSWAP=y | ||
439 | # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
440 | # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set | ||
441 | CONFIG_MTD_CFI_GEOMETRY=y | ||
442 | # CONFIG_MTD_MAP_BANK_WIDTH_1 is not set | ||
443 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
444 | # CONFIG_MTD_MAP_BANK_WIDTH_4 is not set | ||
445 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
446 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
447 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
448 | CONFIG_MTD_CFI_I1=y | ||
449 | CONFIG_MTD_CFI_I2=y | ||
450 | # CONFIG_MTD_CFI_I4 is not set | ||
451 | # CONFIG_MTD_CFI_I8 is not set | ||
452 | # CONFIG_MTD_OTP is not set | ||
453 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
454 | CONFIG_MTD_CFI_AMDSTD=y | ||
455 | # CONFIG_MTD_CFI_STAA is not set | ||
456 | CONFIG_MTD_CFI_UTIL=y | ||
457 | # CONFIG_MTD_RAM is not set | ||
458 | # CONFIG_MTD_ROM is not set | ||
459 | # CONFIG_MTD_ABSENT is not set | ||
460 | |||
461 | # | ||
462 | # Mapping drivers for chip access | ||
463 | # | ||
464 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
465 | CONFIG_MTD_PHYSMAP=y | ||
466 | # CONFIG_MTD_PHYSMAP_COMPAT is not set | ||
467 | # CONFIG_MTD_PLATRAM is not set | ||
468 | |||
469 | # | ||
470 | # Self-contained MTD device drivers | ||
471 | # | ||
472 | # CONFIG_MTD_SLRAM is not set | ||
473 | # CONFIG_MTD_PHRAM is not set | ||
474 | # CONFIG_MTD_MTDRAM is not set | ||
475 | # CONFIG_MTD_BLOCK2MTD is not set | ||
476 | |||
477 | # | ||
478 | # Disk-On-Chip Device Drivers | ||
479 | # | ||
480 | # CONFIG_MTD_DOC2000 is not set | ||
481 | # CONFIG_MTD_DOC2001 is not set | ||
482 | # CONFIG_MTD_DOC2001PLUS is not set | ||
483 | # CONFIG_MTD_NAND is not set | ||
484 | # CONFIG_MTD_ONENAND is not set | ||
485 | |||
486 | # | ||
487 | # LPDDR flash memory drivers | ||
488 | # | ||
489 | # CONFIG_MTD_LPDDR is not set | ||
490 | |||
491 | # | ||
492 | # UBI - Unsorted block images | ||
493 | # | ||
494 | # CONFIG_MTD_UBI is not set | ||
495 | # CONFIG_PARPORT is not set | ||
496 | CONFIG_BLK_DEV=y | ||
497 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
498 | # CONFIG_BLK_DEV_LOOP is not set | ||
499 | # CONFIG_BLK_DEV_NBD is not set | ||
500 | # CONFIG_BLK_DEV_UB is not set | ||
501 | # CONFIG_BLK_DEV_RAM is not set | ||
502 | # CONFIG_CDROM_PKTCDVD is not set | ||
503 | # CONFIG_ATA_OVER_ETH is not set | ||
504 | # CONFIG_BLK_DEV_HD is not set | ||
505 | # CONFIG_MISC_DEVICES is not set | ||
506 | CONFIG_HAVE_IDE=y | ||
507 | # CONFIG_IDE is not set | ||
508 | |||
509 | # | ||
510 | # SCSI device support | ||
511 | # | ||
512 | # CONFIG_RAID_ATTRS is not set | ||
513 | CONFIG_SCSI=y | ||
514 | CONFIG_SCSI_DMA=y | ||
515 | # CONFIG_SCSI_TGT is not set | ||
516 | # CONFIG_SCSI_NETLINK is not set | ||
517 | CONFIG_SCSI_PROC_FS=y | ||
518 | |||
519 | # | ||
520 | # SCSI support type (disk, tape, CD-ROM) | ||
521 | # | ||
522 | CONFIG_BLK_DEV_SD=y | ||
523 | # CONFIG_CHR_DEV_ST is not set | ||
524 | # CONFIG_CHR_DEV_OSST is not set | ||
525 | # CONFIG_BLK_DEV_SR is not set | ||
526 | # CONFIG_CHR_DEV_SG is not set | ||
527 | # CONFIG_CHR_DEV_SCH is not set | ||
528 | |||
529 | # | ||
530 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
531 | # | ||
532 | # CONFIG_SCSI_MULTI_LUN is not set | ||
533 | # CONFIG_SCSI_CONSTANTS is not set | ||
534 | # CONFIG_SCSI_LOGGING is not set | ||
535 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
536 | CONFIG_SCSI_WAIT_SCAN=m | ||
537 | |||
538 | # | ||
539 | # SCSI Transports | ||
540 | # | ||
541 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
542 | # CONFIG_SCSI_FC_ATTRS is not set | ||
543 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
544 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
545 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
546 | CONFIG_SCSI_LOWLEVEL=y | ||
547 | # CONFIG_ISCSI_TCP is not set | ||
548 | # CONFIG_LIBFC is not set | ||
549 | # CONFIG_SCSI_DEBUG is not set | ||
550 | # CONFIG_SCSI_DH is not set | ||
551 | # CONFIG_ATA is not set | ||
552 | # CONFIG_MD is not set | ||
553 | CONFIG_NETDEVICES=y | ||
554 | # CONFIG_DUMMY is not set | ||
555 | # CONFIG_BONDING is not set | ||
556 | # CONFIG_MACVLAN is not set | ||
557 | # CONFIG_EQUALIZER is not set | ||
558 | # CONFIG_TUN is not set | ||
559 | # CONFIG_VETH is not set | ||
560 | CONFIG_PHYLIB=y | ||
561 | |||
562 | # | ||
563 | # MII PHY device drivers | ||
564 | # | ||
565 | # CONFIG_MARVELL_PHY is not set | ||
566 | # CONFIG_DAVICOM_PHY is not set | ||
567 | # CONFIG_QSEMI_PHY is not set | ||
568 | # CONFIG_LXT_PHY is not set | ||
569 | # CONFIG_CICADA_PHY is not set | ||
570 | # CONFIG_VITESSE_PHY is not set | ||
571 | # CONFIG_SMSC_PHY is not set | ||
572 | # CONFIG_BROADCOM_PHY is not set | ||
573 | # CONFIG_ICPLUS_PHY is not set | ||
574 | # CONFIG_REALTEK_PHY is not set | ||
575 | # CONFIG_NATIONAL_PHY is not set | ||
576 | # CONFIG_STE10XP is not set | ||
577 | # CONFIG_LSI_ET1011C_PHY is not set | ||
578 | # CONFIG_FIXED_PHY is not set | ||
579 | CONFIG_MDIO_BITBANG=y | ||
580 | CONFIG_NET_ETHERNET=y | ||
581 | CONFIG_MII=y | ||
582 | # CONFIG_AX88796 is not set | ||
583 | # CONFIG_STNIC is not set | ||
584 | CONFIG_SH_ETH=y | ||
585 | # CONFIG_SMC91X is not set | ||
586 | # CONFIG_SMC911X is not set | ||
587 | # CONFIG_SMSC911X is not set | ||
588 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
589 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
590 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
591 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
592 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
593 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
594 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
595 | # CONFIG_B44 is not set | ||
596 | # CONFIG_NETDEV_1000 is not set | ||
597 | # CONFIG_NETDEV_10000 is not set | ||
598 | |||
599 | # | ||
600 | # Wireless LAN | ||
601 | # | ||
602 | # CONFIG_WLAN_PRE80211 is not set | ||
603 | # CONFIG_WLAN_80211 is not set | ||
604 | # CONFIG_IWLWIFI_LEDS is not set | ||
605 | |||
606 | # | ||
607 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
608 | # | ||
609 | |||
610 | # | ||
611 | # USB Network Adapters | ||
612 | # | ||
613 | # CONFIG_USB_CATC is not set | ||
614 | # CONFIG_USB_KAWETH is not set | ||
615 | # CONFIG_USB_PEGASUS is not set | ||
616 | # CONFIG_USB_RTL8150 is not set | ||
617 | # CONFIG_USB_USBNET is not set | ||
618 | # CONFIG_WAN is not set | ||
619 | # CONFIG_PPP is not set | ||
620 | # CONFIG_SLIP is not set | ||
621 | # CONFIG_NETCONSOLE is not set | ||
622 | # CONFIG_NETPOLL is not set | ||
623 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
624 | # CONFIG_ISDN is not set | ||
625 | # CONFIG_PHONE is not set | ||
626 | |||
627 | # | ||
628 | # Input device support | ||
629 | # | ||
630 | CONFIG_INPUT=y | ||
631 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
632 | # CONFIG_INPUT_POLLDEV is not set | ||
633 | |||
634 | # | ||
635 | # Userland interfaces | ||
636 | # | ||
637 | # CONFIG_INPUT_MOUSEDEV is not set | ||
638 | # CONFIG_INPUT_JOYDEV is not set | ||
639 | # CONFIG_INPUT_EVDEV is not set | ||
640 | # CONFIG_INPUT_EVBUG is not set | ||
641 | |||
642 | # | ||
643 | # Input Device Drivers | ||
644 | # | ||
645 | # CONFIG_INPUT_KEYBOARD is not set | ||
646 | # CONFIG_INPUT_MOUSE is not set | ||
647 | # CONFIG_INPUT_JOYSTICK is not set | ||
648 | # CONFIG_INPUT_TABLET is not set | ||
649 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
650 | # CONFIG_INPUT_MISC is not set | ||
651 | |||
652 | # | ||
653 | # Hardware I/O ports | ||
654 | # | ||
655 | # CONFIG_SERIO is not set | ||
656 | # CONFIG_GAMEPORT is not set | ||
657 | |||
658 | # | ||
659 | # Character devices | ||
660 | # | ||
661 | CONFIG_VT=y | ||
662 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
663 | CONFIG_VT_CONSOLE=y | ||
664 | CONFIG_HW_CONSOLE=y | ||
665 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
666 | CONFIG_DEVKMEM=y | ||
667 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
668 | |||
669 | # | ||
670 | # Serial drivers | ||
671 | # | ||
672 | # CONFIG_SERIAL_8250 is not set | ||
673 | |||
674 | # | ||
675 | # Non-8250 serial port support | ||
676 | # | ||
677 | CONFIG_SERIAL_SH_SCI=y | ||
678 | CONFIG_SERIAL_SH_SCI_NR_UARTS=3 | ||
679 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
680 | CONFIG_SERIAL_CORE=y | ||
681 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
682 | CONFIG_UNIX98_PTYS=y | ||
683 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
684 | CONFIG_LEGACY_PTYS=y | ||
685 | CONFIG_LEGACY_PTY_COUNT=256 | ||
686 | # CONFIG_IPMI_HANDLER is not set | ||
687 | CONFIG_HW_RANDOM=y | ||
688 | # CONFIG_R3964 is not set | ||
689 | # CONFIG_RAW_DRIVER is not set | ||
690 | # CONFIG_TCG_TPM is not set | ||
691 | # CONFIG_I2C is not set | ||
692 | # CONFIG_SPI is not set | ||
693 | # CONFIG_W1 is not set | ||
694 | # CONFIG_POWER_SUPPLY is not set | ||
695 | # CONFIG_HWMON is not set | ||
696 | # CONFIG_THERMAL is not set | ||
697 | # CONFIG_THERMAL_HWMON is not set | ||
698 | # CONFIG_WATCHDOG is not set | ||
699 | CONFIG_SSB_POSSIBLE=y | ||
700 | |||
701 | # | ||
702 | # Sonics Silicon Backplane | ||
703 | # | ||
704 | # CONFIG_SSB is not set | ||
705 | |||
706 | # | ||
707 | # Multifunction device drivers | ||
708 | # | ||
709 | # CONFIG_MFD_CORE is not set | ||
710 | # CONFIG_MFD_SM501 is not set | ||
711 | # CONFIG_HTC_PASIC3 is not set | ||
712 | # CONFIG_MFD_TMIO is not set | ||
713 | # CONFIG_REGULATOR is not set | ||
714 | |||
715 | # | ||
716 | # Multimedia devices | ||
717 | # | ||
718 | |||
719 | # | ||
720 | # Multimedia core support | ||
721 | # | ||
722 | # CONFIG_VIDEO_DEV is not set | ||
723 | # CONFIG_DVB_CORE is not set | ||
724 | # CONFIG_VIDEO_MEDIA is not set | ||
725 | |||
726 | # | ||
727 | # Multimedia drivers | ||
728 | # | ||
729 | # CONFIG_DAB is not set | ||
730 | |||
731 | # | ||
732 | # Graphics support | ||
733 | # | ||
734 | # CONFIG_VGASTATE is not set | ||
735 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
736 | CONFIG_FB=y | ||
737 | # CONFIG_FIRMWARE_EDID is not set | ||
738 | # CONFIG_FB_DDC is not set | ||
739 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
740 | CONFIG_FB_CFB_FILLRECT=y | ||
741 | CONFIG_FB_CFB_COPYAREA=y | ||
742 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
743 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
744 | # CONFIG_FB_SYS_FILLRECT is not set | ||
745 | # CONFIG_FB_SYS_COPYAREA is not set | ||
746 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
747 | CONFIG_FB_FOREIGN_ENDIAN=y | ||
748 | CONFIG_FB_BOTH_ENDIAN=y | ||
749 | # CONFIG_FB_BIG_ENDIAN is not set | ||
750 | # CONFIG_FB_LITTLE_ENDIAN is not set | ||
751 | # CONFIG_FB_SYS_FOPS is not set | ||
752 | # CONFIG_FB_SVGALIB is not set | ||
753 | # CONFIG_FB_MACMODES is not set | ||
754 | # CONFIG_FB_BACKLIGHT is not set | ||
755 | # CONFIG_FB_MODE_HELPERS is not set | ||
756 | # CONFIG_FB_TILEBLITTING is not set | ||
757 | |||
758 | # | ||
759 | # Frame buffer hardware drivers | ||
760 | # | ||
761 | # CONFIG_FB_S1D13XXX is not set | ||
762 | # CONFIG_FB_SH_MOBILE_LCDC is not set | ||
763 | CONFIG_FB_SH7760=y | ||
764 | # CONFIG_FB_VIRTUAL is not set | ||
765 | # CONFIG_FB_METRONOME is not set | ||
766 | # CONFIG_FB_MB862XX is not set | ||
767 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
768 | |||
769 | # | ||
770 | # Display device support | ||
771 | # | ||
772 | # CONFIG_DISPLAY_SUPPORT is not set | ||
773 | |||
774 | # | ||
775 | # Console display driver support | ||
776 | # | ||
777 | CONFIG_DUMMY_CONSOLE=y | ||
778 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
779 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
780 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
781 | # CONFIG_FONTS is not set | ||
782 | CONFIG_FONT_8x8=y | ||
783 | CONFIG_FONT_8x16=y | ||
784 | CONFIG_LOGO=y | ||
785 | CONFIG_LOGO_LINUX_MONO=y | ||
786 | CONFIG_LOGO_LINUX_VGA16=y | ||
787 | CONFIG_LOGO_LINUX_CLUT224=y | ||
788 | CONFIG_LOGO_SUPERH_MONO=y | ||
789 | CONFIG_LOGO_SUPERH_VGA16=y | ||
790 | CONFIG_LOGO_SUPERH_CLUT224=y | ||
791 | # CONFIG_SOUND is not set | ||
792 | # CONFIG_HID_SUPPORT is not set | ||
793 | CONFIG_USB_SUPPORT=y | ||
794 | CONFIG_USB_ARCH_HAS_HCD=y | ||
795 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
796 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
797 | CONFIG_USB=y | ||
798 | # CONFIG_USB_DEBUG is not set | ||
799 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
800 | |||
801 | # | ||
802 | # Miscellaneous USB options | ||
803 | # | ||
804 | # CONFIG_USB_DEVICEFS is not set | ||
805 | CONFIG_USB_DEVICE_CLASS=y | ||
806 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
807 | # CONFIG_USB_OTG is not set | ||
808 | # CONFIG_USB_OTG_WHITELIST is not set | ||
809 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
810 | CONFIG_USB_MON=y | ||
811 | # CONFIG_USB_WUSB is not set | ||
812 | # CONFIG_USB_WUSB_CBAF is not set | ||
813 | |||
814 | # | ||
815 | # USB Host Controller Drivers | ||
816 | # | ||
817 | # CONFIG_USB_C67X00_HCD is not set | ||
818 | # CONFIG_USB_OXU210HP_HCD is not set | ||
819 | # CONFIG_USB_ISP116X_HCD is not set | ||
820 | CONFIG_USB_OHCI_HCD=y | ||
821 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
822 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
823 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
824 | # CONFIG_USB_SL811_HCD is not set | ||
825 | # CONFIG_USB_R8A66597_HCD is not set | ||
826 | # CONFIG_USB_HWA_HCD is not set | ||
827 | |||
828 | # | ||
829 | # USB Device Class drivers | ||
830 | # | ||
831 | # CONFIG_USB_ACM is not set | ||
832 | # CONFIG_USB_PRINTER is not set | ||
833 | # CONFIG_USB_WDM is not set | ||
834 | # CONFIG_USB_TMC is not set | ||
835 | |||
836 | # | ||
837 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; | ||
838 | # | ||
839 | |||
840 | # | ||
841 | # see USB_STORAGE Help for more information | ||
842 | # | ||
843 | CONFIG_USB_STORAGE=y | ||
844 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
845 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
846 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
847 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
848 | # CONFIG_USB_STORAGE_USBAT is not set | ||
849 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
850 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
851 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
852 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
853 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
854 | # CONFIG_USB_STORAGE_KARMA is not set | ||
855 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
856 | # CONFIG_USB_LIBUSUAL is not set | ||
857 | |||
858 | # | ||
859 | # USB Imaging devices | ||
860 | # | ||
861 | # CONFIG_USB_MDC800 is not set | ||
862 | # CONFIG_USB_MICROTEK is not set | ||
863 | |||
864 | # | ||
865 | # USB port drivers | ||
866 | # | ||
867 | # CONFIG_USB_SERIAL is not set | ||
868 | |||
869 | # | ||
870 | # USB Miscellaneous drivers | ||
871 | # | ||
872 | # CONFIG_USB_EMI62 is not set | ||
873 | # CONFIG_USB_EMI26 is not set | ||
874 | # CONFIG_USB_ADUTUX is not set | ||
875 | # CONFIG_USB_SEVSEG is not set | ||
876 | # CONFIG_USB_RIO500 is not set | ||
877 | # CONFIG_USB_LEGOTOWER is not set | ||
878 | # CONFIG_USB_LCD is not set | ||
879 | # CONFIG_USB_BERRY_CHARGE is not set | ||
880 | # CONFIG_USB_LED is not set | ||
881 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
882 | # CONFIG_USB_CYTHERM is not set | ||
883 | # CONFIG_USB_PHIDGET is not set | ||
884 | # CONFIG_USB_IDMOUSE is not set | ||
885 | # CONFIG_USB_FTDI_ELAN is not set | ||
886 | # CONFIG_USB_APPLEDISPLAY is not set | ||
887 | # CONFIG_USB_LD is not set | ||
888 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
889 | # CONFIG_USB_IOWARRIOR is not set | ||
890 | # CONFIG_USB_ISIGHTFW is not set | ||
891 | # CONFIG_USB_VST is not set | ||
892 | # CONFIG_USB_GADGET is not set | ||
893 | |||
894 | # | ||
895 | # OTG and related infrastructure | ||
896 | # | ||
897 | # CONFIG_MMC is not set | ||
898 | # CONFIG_MEMSTICK is not set | ||
899 | # CONFIG_NEW_LEDS is not set | ||
900 | # CONFIG_ACCESSIBILITY is not set | ||
901 | # CONFIG_RTC_CLASS is not set | ||
902 | # CONFIG_DMADEVICES is not set | ||
903 | # CONFIG_UIO is not set | ||
904 | # CONFIG_STAGING is not set | ||
905 | |||
906 | # | ||
907 | # File systems | ||
908 | # | ||
909 | CONFIG_EXT2_FS=y | ||
910 | # CONFIG_EXT2_FS_XATTR is not set | ||
911 | # CONFIG_EXT2_FS_XIP is not set | ||
912 | CONFIG_EXT3_FS=y | ||
913 | CONFIG_EXT3_FS_XATTR=y | ||
914 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
915 | # CONFIG_EXT3_FS_SECURITY is not set | ||
916 | # CONFIG_EXT4_FS is not set | ||
917 | CONFIG_JBD=y | ||
918 | # CONFIG_JBD_DEBUG is not set | ||
919 | CONFIG_FS_MBCACHE=y | ||
920 | # CONFIG_REISERFS_FS is not set | ||
921 | # CONFIG_JFS_FS is not set | ||
922 | CONFIG_FS_POSIX_ACL=y | ||
923 | CONFIG_FILE_LOCKING=y | ||
924 | # CONFIG_XFS_FS is not set | ||
925 | # CONFIG_OCFS2_FS is not set | ||
926 | # CONFIG_BTRFS_FS is not set | ||
927 | CONFIG_DNOTIFY=y | ||
928 | CONFIG_INOTIFY=y | ||
929 | CONFIG_INOTIFY_USER=y | ||
930 | # CONFIG_QUOTA is not set | ||
931 | CONFIG_AUTOFS_FS=y | ||
932 | CONFIG_AUTOFS4_FS=y | ||
933 | # CONFIG_FUSE_FS is not set | ||
934 | CONFIG_GENERIC_ACL=y | ||
935 | |||
936 | # | ||
937 | # CD-ROM/DVD Filesystems | ||
938 | # | ||
939 | # CONFIG_ISO9660_FS is not set | ||
940 | # CONFIG_UDF_FS is not set | ||
941 | |||
942 | # | ||
943 | # DOS/FAT/NT Filesystems | ||
944 | # | ||
945 | # CONFIG_MSDOS_FS is not set | ||
946 | # CONFIG_VFAT_FS is not set | ||
947 | # CONFIG_NTFS_FS is not set | ||
948 | |||
949 | # | ||
950 | # Pseudo filesystems | ||
951 | # | ||
952 | CONFIG_PROC_FS=y | ||
953 | CONFIG_PROC_KCORE=y | ||
954 | CONFIG_PROC_SYSCTL=y | ||
955 | CONFIG_PROC_PAGE_MONITOR=y | ||
956 | CONFIG_SYSFS=y | ||
957 | CONFIG_TMPFS=y | ||
958 | CONFIG_TMPFS_POSIX_ACL=y | ||
959 | # CONFIG_HUGETLBFS is not set | ||
960 | # CONFIG_HUGETLB_PAGE is not set | ||
961 | # CONFIG_CONFIGFS_FS is not set | ||
962 | CONFIG_MISC_FILESYSTEMS=y | ||
963 | # CONFIG_ADFS_FS is not set | ||
964 | # CONFIG_AFFS_FS is not set | ||
965 | # CONFIG_HFS_FS is not set | ||
966 | # CONFIG_HFSPLUS_FS is not set | ||
967 | # CONFIG_BEFS_FS is not set | ||
968 | # CONFIG_BFS_FS is not set | ||
969 | # CONFIG_EFS_FS is not set | ||
970 | # CONFIG_JFFS2_FS is not set | ||
971 | CONFIG_CRAMFS=y | ||
972 | # CONFIG_SQUASHFS is not set | ||
973 | # CONFIG_VXFS_FS is not set | ||
974 | # CONFIG_MINIX_FS is not set | ||
975 | # CONFIG_OMFS_FS is not set | ||
976 | # CONFIG_HPFS_FS is not set | ||
977 | # CONFIG_QNX4FS_FS is not set | ||
978 | CONFIG_ROMFS_FS=y | ||
979 | # CONFIG_SYSV_FS is not set | ||
980 | # CONFIG_UFS_FS is not set | ||
981 | CONFIG_NETWORK_FILESYSTEMS=y | ||
982 | CONFIG_NFS_FS=y | ||
983 | # CONFIG_NFS_V3 is not set | ||
984 | # CONFIG_NFS_V4 is not set | ||
985 | CONFIG_ROOT_NFS=y | ||
986 | # CONFIG_NFSD is not set | ||
987 | CONFIG_LOCKD=y | ||
988 | CONFIG_NFS_COMMON=y | ||
989 | CONFIG_SUNRPC=y | ||
990 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
991 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
992 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
993 | # CONFIG_SMB_FS is not set | ||
994 | # CONFIG_CIFS is not set | ||
995 | # CONFIG_NCP_FS is not set | ||
996 | # CONFIG_CODA_FS is not set | ||
997 | # CONFIG_AFS_FS is not set | ||
998 | |||
999 | # | ||
1000 | # Partition Types | ||
1001 | # | ||
1002 | # CONFIG_PARTITION_ADVANCED is not set | ||
1003 | CONFIG_MSDOS_PARTITION=y | ||
1004 | CONFIG_NLS=y | ||
1005 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1006 | CONFIG_NLS_CODEPAGE_437=y | ||
1007 | CONFIG_NLS_CODEPAGE_737=y | ||
1008 | CONFIG_NLS_CODEPAGE_775=y | ||
1009 | CONFIG_NLS_CODEPAGE_850=y | ||
1010 | CONFIG_NLS_CODEPAGE_852=y | ||
1011 | CONFIG_NLS_CODEPAGE_855=y | ||
1012 | CONFIG_NLS_CODEPAGE_857=y | ||
1013 | CONFIG_NLS_CODEPAGE_860=y | ||
1014 | CONFIG_NLS_CODEPAGE_861=y | ||
1015 | CONFIG_NLS_CODEPAGE_862=y | ||
1016 | CONFIG_NLS_CODEPAGE_863=y | ||
1017 | CONFIG_NLS_CODEPAGE_864=y | ||
1018 | CONFIG_NLS_CODEPAGE_865=y | ||
1019 | CONFIG_NLS_CODEPAGE_866=y | ||
1020 | CONFIG_NLS_CODEPAGE_869=y | ||
1021 | CONFIG_NLS_CODEPAGE_936=y | ||
1022 | CONFIG_NLS_CODEPAGE_950=y | ||
1023 | CONFIG_NLS_CODEPAGE_932=y | ||
1024 | CONFIG_NLS_CODEPAGE_949=y | ||
1025 | CONFIG_NLS_CODEPAGE_874=y | ||
1026 | CONFIG_NLS_ISO8859_8=y | ||
1027 | CONFIG_NLS_CODEPAGE_1250=y | ||
1028 | CONFIG_NLS_CODEPAGE_1251=y | ||
1029 | CONFIG_NLS_ASCII=y | ||
1030 | CONFIG_NLS_ISO8859_1=y | ||
1031 | CONFIG_NLS_ISO8859_2=y | ||
1032 | CONFIG_NLS_ISO8859_3=y | ||
1033 | CONFIG_NLS_ISO8859_4=y | ||
1034 | CONFIG_NLS_ISO8859_5=y | ||
1035 | CONFIG_NLS_ISO8859_6=y | ||
1036 | CONFIG_NLS_ISO8859_7=y | ||
1037 | CONFIG_NLS_ISO8859_9=y | ||
1038 | CONFIG_NLS_ISO8859_13=y | ||
1039 | CONFIG_NLS_ISO8859_14=y | ||
1040 | CONFIG_NLS_ISO8859_15=y | ||
1041 | CONFIG_NLS_KOI8_R=y | ||
1042 | CONFIG_NLS_KOI8_U=y | ||
1043 | CONFIG_NLS_UTF8=y | ||
1044 | # CONFIG_DLM is not set | ||
1045 | |||
1046 | # | ||
1047 | # Kernel hacking | ||
1048 | # | ||
1049 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
1050 | # CONFIG_PRINTK_TIME is not set | ||
1051 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
1052 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
1053 | CONFIG_FRAME_WARN=1024 | ||
1054 | # CONFIG_MAGIC_SYSRQ is not set | ||
1055 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1056 | CONFIG_DEBUG_FS=y | ||
1057 | # CONFIG_HEADERS_CHECK is not set | ||
1058 | # CONFIG_DEBUG_KERNEL is not set | ||
1059 | CONFIG_STACKTRACE=y | ||
1060 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
1061 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1062 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1063 | # CONFIG_LATENCYTOP is not set | ||
1064 | CONFIG_NOP_TRACER=y | ||
1065 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1066 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
1067 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
1068 | CONFIG_RING_BUFFER=y | ||
1069 | CONFIG_TRACING=y | ||
1070 | |||
1071 | # | ||
1072 | # Tracers | ||
1073 | # | ||
1074 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1075 | # CONFIG_SAMPLES is not set | ||
1076 | CONFIG_HAVE_ARCH_KGDB=y | ||
1077 | # CONFIG_SH_STANDARD_BIOS is not set | ||
1078 | # CONFIG_EARLY_SCIF_CONSOLE is not set | ||
1079 | # CONFIG_MORE_COMPILE_OPTIONS is not set | ||
1080 | |||
1081 | # | ||
1082 | # Security options | ||
1083 | # | ||
1084 | # CONFIG_KEYS is not set | ||
1085 | # CONFIG_SECURITY is not set | ||
1086 | # CONFIG_SECURITYFS is not set | ||
1087 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
1088 | CONFIG_CRYPTO=y | ||
1089 | |||
1090 | # | ||
1091 | # Crypto core or helper | ||
1092 | # | ||
1093 | # CONFIG_CRYPTO_FIPS is not set | ||
1094 | # CONFIG_CRYPTO_MANAGER is not set | ||
1095 | # CONFIG_CRYPTO_MANAGER2 is not set | ||
1096 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1097 | # CONFIG_CRYPTO_NULL is not set | ||
1098 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1099 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1100 | # CONFIG_CRYPTO_TEST is not set | ||
1101 | |||
1102 | # | ||
1103 | # Authenticated Encryption with Associated Data | ||
1104 | # | ||
1105 | # CONFIG_CRYPTO_CCM is not set | ||
1106 | # CONFIG_CRYPTO_GCM is not set | ||
1107 | # CONFIG_CRYPTO_SEQIV is not set | ||
1108 | |||
1109 | # | ||
1110 | # Block modes | ||
1111 | # | ||
1112 | # CONFIG_CRYPTO_CBC is not set | ||
1113 | # CONFIG_CRYPTO_CTR is not set | ||
1114 | # CONFIG_CRYPTO_CTS is not set | ||
1115 | # CONFIG_CRYPTO_ECB is not set | ||
1116 | # CONFIG_CRYPTO_LRW is not set | ||
1117 | # CONFIG_CRYPTO_PCBC is not set | ||
1118 | # CONFIG_CRYPTO_XTS is not set | ||
1119 | |||
1120 | # | ||
1121 | # Hash modes | ||
1122 | # | ||
1123 | # CONFIG_CRYPTO_HMAC is not set | ||
1124 | # CONFIG_CRYPTO_XCBC is not set | ||
1125 | |||
1126 | # | ||
1127 | # Digest | ||
1128 | # | ||
1129 | # CONFIG_CRYPTO_CRC32C is not set | ||
1130 | # CONFIG_CRYPTO_MD4 is not set | ||
1131 | # CONFIG_CRYPTO_MD5 is not set | ||
1132 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1133 | # CONFIG_CRYPTO_RMD128 is not set | ||
1134 | # CONFIG_CRYPTO_RMD160 is not set | ||
1135 | # CONFIG_CRYPTO_RMD256 is not set | ||
1136 | # CONFIG_CRYPTO_RMD320 is not set | ||
1137 | # CONFIG_CRYPTO_SHA1 is not set | ||
1138 | # CONFIG_CRYPTO_SHA256 is not set | ||
1139 | # CONFIG_CRYPTO_SHA512 is not set | ||
1140 | # CONFIG_CRYPTO_TGR192 is not set | ||
1141 | # CONFIG_CRYPTO_WP512 is not set | ||
1142 | |||
1143 | # | ||
1144 | # Ciphers | ||
1145 | # | ||
1146 | # CONFIG_CRYPTO_AES is not set | ||
1147 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1148 | # CONFIG_CRYPTO_ARC4 is not set | ||
1149 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1150 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1151 | # CONFIG_CRYPTO_CAST5 is not set | ||
1152 | # CONFIG_CRYPTO_CAST6 is not set | ||
1153 | # CONFIG_CRYPTO_DES is not set | ||
1154 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1155 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1156 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1157 | # CONFIG_CRYPTO_SEED is not set | ||
1158 | # CONFIG_CRYPTO_SERPENT is not set | ||
1159 | # CONFIG_CRYPTO_TEA is not set | ||
1160 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1161 | |||
1162 | # | ||
1163 | # Compression | ||
1164 | # | ||
1165 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1166 | # CONFIG_CRYPTO_LZO is not set | ||
1167 | |||
1168 | # | ||
1169 | # Random Number Generation | ||
1170 | # | ||
1171 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1172 | CONFIG_CRYPTO_HW=y | ||
1173 | |||
1174 | # | ||
1175 | # Library routines | ||
1176 | # | ||
1177 | CONFIG_BITREVERSE=y | ||
1178 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
1179 | # CONFIG_CRC_CCITT is not set | ||
1180 | # CONFIG_CRC16 is not set | ||
1181 | CONFIG_CRC_T10DIF=y | ||
1182 | # CONFIG_CRC_ITU_T is not set | ||
1183 | CONFIG_CRC32=y | ||
1184 | # CONFIG_CRC7 is not set | ||
1185 | # CONFIG_LIBCRC32C is not set | ||
1186 | CONFIG_ZLIB_INFLATE=y | ||
1187 | CONFIG_PLIST=y | ||
1188 | CONFIG_HAS_IOMEM=y | ||
1189 | CONFIG_HAS_IOPORT=y | ||
1190 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/sh/configs/polaris_defconfig b/arch/sh/configs/polaris_defconfig new file mode 100644 index 000000000000..320def233b2f --- /dev/null +++ b/arch/sh/configs/polaris_defconfig | |||
@@ -0,0 +1,969 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.29-rc4 | ||
4 | # Wed Feb 11 18:41:59 2009 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_SUPERH32=y | ||
8 | CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
10 | CONFIG_GENERIC_BUG=y | ||
11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
15 | CONFIG_GENERIC_IRQ_PROBE=y | ||
16 | # CONFIG_GENERIC_GPIO is not set | ||
17 | CONFIG_GENERIC_TIME=y | ||
18 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
19 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set | ||
20 | # CONFIG_ARCH_HIBERNATION_POSSIBLE is not set | ||
21 | CONFIG_STACKTRACE_SUPPORT=y | ||
22 | CONFIG_LOCKDEP_SUPPORT=y | ||
23 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
24 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
25 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
26 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
28 | |||
29 | # | ||
30 | # General setup | ||
31 | # | ||
32 | CONFIG_EXPERIMENTAL=y | ||
33 | CONFIG_BROKEN_ON_SMP=y | ||
34 | CONFIG_LOCK_KERNEL=y | ||
35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
36 | CONFIG_LOCALVERSION="" | ||
37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
38 | # CONFIG_SWAP is not set | ||
39 | CONFIG_SYSVIPC=y | ||
40 | CONFIG_SYSVIPC_SYSCTL=y | ||
41 | CONFIG_POSIX_MQUEUE=y | ||
42 | CONFIG_BSD_PROCESS_ACCT=y | ||
43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
44 | # CONFIG_TASKSTATS is not set | ||
45 | CONFIG_AUDIT=y | ||
46 | # CONFIG_AUDITSYSCALL is not set | ||
47 | |||
48 | # | ||
49 | # RCU Subsystem | ||
50 | # | ||
51 | CONFIG_CLASSIC_RCU=y | ||
52 | # CONFIG_TREE_RCU is not set | ||
53 | # CONFIG_PREEMPT_RCU is not set | ||
54 | # CONFIG_TREE_RCU_TRACE is not set | ||
55 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
56 | # CONFIG_IKCONFIG is not set | ||
57 | CONFIG_LOG_BUF_SHIFT=14 | ||
58 | CONFIG_GROUP_SCHED=y | ||
59 | CONFIG_FAIR_GROUP_SCHED=y | ||
60 | # CONFIG_RT_GROUP_SCHED is not set | ||
61 | CONFIG_USER_SCHED=y | ||
62 | # CONFIG_CGROUP_SCHED is not set | ||
63 | # CONFIG_CGROUPS is not set | ||
64 | CONFIG_SYSFS_DEPRECATED=y | ||
65 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
66 | # CONFIG_RELAY is not set | ||
67 | # CONFIG_NAMESPACES is not set | ||
68 | # CONFIG_BLK_DEV_INITRD is not set | ||
69 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
70 | CONFIG_SYSCTL=y | ||
71 | CONFIG_EMBEDDED=y | ||
72 | CONFIG_UID16=y | ||
73 | CONFIG_SYSCTL_SYSCALL=y | ||
74 | CONFIG_KALLSYMS=y | ||
75 | CONFIG_KALLSYMS_ALL=y | ||
76 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
77 | CONFIG_HOTPLUG=y | ||
78 | CONFIG_PRINTK=y | ||
79 | CONFIG_BUG=y | ||
80 | CONFIG_ELF_CORE=y | ||
81 | CONFIG_COMPAT_BRK=y | ||
82 | CONFIG_BASE_FULL=y | ||
83 | CONFIG_FUTEX=y | ||
84 | CONFIG_ANON_INODES=y | ||
85 | CONFIG_EPOLL=y | ||
86 | CONFIG_SIGNALFD=y | ||
87 | CONFIG_TIMERFD=y | ||
88 | CONFIG_EVENTFD=y | ||
89 | CONFIG_SHMEM=y | ||
90 | CONFIG_AIO=y | ||
91 | CONFIG_VM_EVENT_COUNTERS=y | ||
92 | CONFIG_SLAB=y | ||
93 | # CONFIG_SLUB is not set | ||
94 | # CONFIG_SLOB is not set | ||
95 | # CONFIG_PROFILING is not set | ||
96 | CONFIG_HAVE_OPROFILE=y | ||
97 | # CONFIG_KPROBES is not set | ||
98 | CONFIG_HAVE_IOREMAP_PROT=y | ||
99 | CONFIG_HAVE_KPROBES=y | ||
100 | CONFIG_HAVE_KRETPROBES=y | ||
101 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
102 | CONFIG_HAVE_CLK=y | ||
103 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
104 | CONFIG_SLABINFO=y | ||
105 | CONFIG_RT_MUTEXES=y | ||
106 | CONFIG_BASE_SMALL=0 | ||
107 | CONFIG_MODULES=y | ||
108 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
109 | CONFIG_MODULE_UNLOAD=y | ||
110 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
111 | CONFIG_MODVERSIONS=y | ||
112 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
113 | CONFIG_BLOCK=y | ||
114 | # CONFIG_LBD is not set | ||
115 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
116 | # CONFIG_BLK_DEV_BSG is not set | ||
117 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
118 | |||
119 | # | ||
120 | # IO Schedulers | ||
121 | # | ||
122 | CONFIG_IOSCHED_NOOP=y | ||
123 | # CONFIG_IOSCHED_AS is not set | ||
124 | # CONFIG_IOSCHED_DEADLINE is not set | ||
125 | CONFIG_IOSCHED_CFQ=y | ||
126 | # CONFIG_DEFAULT_AS is not set | ||
127 | # CONFIG_DEFAULT_DEADLINE is not set | ||
128 | CONFIG_DEFAULT_CFQ=y | ||
129 | # CONFIG_DEFAULT_NOOP is not set | ||
130 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
131 | # CONFIG_FREEZER is not set | ||
132 | |||
133 | # | ||
134 | # System type | ||
135 | # | ||
136 | CONFIG_CPU_SH3=y | ||
137 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | ||
138 | # CONFIG_CPU_SUBTYPE_SH7201 is not set | ||
139 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | ||
140 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | ||
141 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | ||
142 | # CONFIG_CPU_SUBTYPE_MXG is not set | ||
143 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
144 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
145 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
147 | CONFIG_CPU_SUBTYPE_SH7709=y | ||
148 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | ||
149 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | ||
150 | # CONFIG_CPU_SUBTYPE_SH7720 is not set | ||
151 | # CONFIG_CPU_SUBTYPE_SH7721 is not set | ||
152 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
153 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
156 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
157 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
158 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
159 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
160 | # CONFIG_CPU_SUBTYPE_SH7723 is not set | ||
161 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | ||
162 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
163 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
164 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | ||
165 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | ||
166 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | ||
167 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | ||
168 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
169 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
170 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
171 | |||
172 | # | ||
173 | # Memory management options | ||
174 | # | ||
175 | CONFIG_QUICKLIST=y | ||
176 | CONFIG_MMU=y | ||
177 | CONFIG_PAGE_OFFSET=0x80000000 | ||
178 | CONFIG_MEMORY_START=0x0C000000 | ||
179 | CONFIG_MEMORY_SIZE=0x04000000 | ||
180 | CONFIG_29BIT=y | ||
181 | CONFIG_VSYSCALL=y | ||
182 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
183 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
184 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
185 | CONFIG_MAX_ACTIVE_REGIONS=1 | ||
186 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
187 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
188 | CONFIG_PAGE_SIZE_4KB=y | ||
189 | # CONFIG_PAGE_SIZE_8KB is not set | ||
190 | # CONFIG_PAGE_SIZE_16KB is not set | ||
191 | # CONFIG_PAGE_SIZE_64KB is not set | ||
192 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
193 | CONFIG_SELECT_MEMORY_MODEL=y | ||
194 | CONFIG_FLATMEM_MANUAL=y | ||
195 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
196 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
197 | CONFIG_FLATMEM=y | ||
198 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
199 | CONFIG_SPARSEMEM_STATIC=y | ||
200 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
201 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
202 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
203 | CONFIG_ZONE_DMA_FLAG=0 | ||
204 | CONFIG_NR_QUICK=2 | ||
205 | CONFIG_UNEVICTABLE_LRU=y | ||
206 | |||
207 | # | ||
208 | # Cache configuration | ||
209 | # | ||
210 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
211 | CONFIG_CACHE_WRITEBACK=y | ||
212 | # CONFIG_CACHE_WRITETHROUGH is not set | ||
213 | # CONFIG_CACHE_OFF is not set | ||
214 | |||
215 | # | ||
216 | # Processor features | ||
217 | # | ||
218 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
219 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
220 | CONFIG_SH_FPU_EMU=y | ||
221 | CONFIG_SH_ADC=y | ||
222 | CONFIG_CPU_HAS_INTEVT=y | ||
223 | CONFIG_CPU_HAS_IPR_IRQ=y | ||
224 | CONFIG_CPU_HAS_SR_RB=y | ||
225 | |||
226 | # | ||
227 | # Board support | ||
228 | # | ||
229 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
230 | # CONFIG_SH_HP6XX is not set | ||
231 | CONFIG_SH_POLARIS=y | ||
232 | |||
233 | # | ||
234 | # Timer and clock configuration | ||
235 | # | ||
236 | CONFIG_SH_TMU=y | ||
237 | CONFIG_SH_TIMER_IRQ=16 | ||
238 | CONFIG_SH_PCLK_FREQ=33000000 | ||
239 | CONFIG_TICK_ONESHOT=y | ||
240 | CONFIG_NO_HZ=y | ||
241 | CONFIG_HIGH_RES_TIMERS=y | ||
242 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
243 | |||
244 | # | ||
245 | # CPU Frequency scaling | ||
246 | # | ||
247 | # CONFIG_CPU_FREQ is not set | ||
248 | |||
249 | # | ||
250 | # DMA support | ||
251 | # | ||
252 | CONFIG_SH_DMA_API=y | ||
253 | CONFIG_SH_DMA=y | ||
254 | CONFIG_NR_ONCHIP_DMA_CHANNELS=4 | ||
255 | # CONFIG_NR_DMA_CHANNELS_BOOL is not set | ||
256 | |||
257 | # | ||
258 | # Companion Chips | ||
259 | # | ||
260 | |||
261 | # | ||
262 | # Additional SuperH Device Drivers | ||
263 | # | ||
264 | CONFIG_HEARTBEAT=y | ||
265 | # CONFIG_PUSH_SWITCH is not set | ||
266 | |||
267 | # | ||
268 | # Kernel features | ||
269 | # | ||
270 | CONFIG_HZ_100=y | ||
271 | # CONFIG_HZ_250 is not set | ||
272 | # CONFIG_HZ_300 is not set | ||
273 | # CONFIG_HZ_1000 is not set | ||
274 | CONFIG_HZ=100 | ||
275 | CONFIG_SCHED_HRTICK=y | ||
276 | # CONFIG_KEXEC is not set | ||
277 | # CONFIG_CRASH_DUMP is not set | ||
278 | # CONFIG_SECCOMP is not set | ||
279 | # CONFIG_PREEMPT_NONE is not set | ||
280 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
281 | CONFIG_PREEMPT=y | ||
282 | CONFIG_GUSA=y | ||
283 | # CONFIG_GUSA_RB is not set | ||
284 | |||
285 | # | ||
286 | # Boot options | ||
287 | # | ||
288 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
289 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
290 | CONFIG_CMDLINE_BOOL=y | ||
291 | CONFIG_CMDLINE="console=ttySC1,115200 root=/dev/mtdblock2 rootfstype=jffs2 mem=63M mtdparts=physmap-flash.0:0x00100000(bootloader)ro,0x00500000(Kernel)ro,0x00A00000(Filesystem)" | ||
292 | |||
293 | # | ||
294 | # Bus options | ||
295 | # | ||
296 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
297 | # CONFIG_PCCARD is not set | ||
298 | |||
299 | # | ||
300 | # Executable file formats | ||
301 | # | ||
302 | CONFIG_BINFMT_ELF=y | ||
303 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
304 | # CONFIG_HAVE_AOUT is not set | ||
305 | # CONFIG_BINFMT_MISC is not set | ||
306 | |||
307 | # | ||
308 | # Power management options (EXPERIMENTAL) | ||
309 | # | ||
310 | # CONFIG_PM is not set | ||
311 | # CONFIG_CPU_IDLE is not set | ||
312 | CONFIG_NET=y | ||
313 | |||
314 | # | ||
315 | # Networking options | ||
316 | # | ||
317 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
318 | CONFIG_PACKET=y | ||
319 | CONFIG_PACKET_MMAP=y | ||
320 | CONFIG_UNIX=y | ||
321 | # CONFIG_NET_KEY is not set | ||
322 | CONFIG_INET=y | ||
323 | CONFIG_IP_MULTICAST=y | ||
324 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
325 | CONFIG_IP_FIB_HASH=y | ||
326 | # CONFIG_IP_PNP is not set | ||
327 | # CONFIG_NET_IPIP is not set | ||
328 | # CONFIG_NET_IPGRE is not set | ||
329 | # CONFIG_IP_MROUTE is not set | ||
330 | # CONFIG_ARPD is not set | ||
331 | # CONFIG_SYN_COOKIES is not set | ||
332 | # CONFIG_INET_AH is not set | ||
333 | # CONFIG_INET_ESP is not set | ||
334 | # CONFIG_INET_IPCOMP is not set | ||
335 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
336 | # CONFIG_INET_TUNNEL is not set | ||
337 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
338 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
339 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
340 | # CONFIG_INET_LRO is not set | ||
341 | CONFIG_INET_DIAG=y | ||
342 | CONFIG_INET_TCP_DIAG=y | ||
343 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
344 | CONFIG_TCP_CONG_CUBIC=y | ||
345 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
346 | # CONFIG_TCP_MD5SIG is not set | ||
347 | # CONFIG_IPV6 is not set | ||
348 | # CONFIG_NETWORK_SECMARK is not set | ||
349 | # CONFIG_NETFILTER is not set | ||
350 | # CONFIG_IP_DCCP is not set | ||
351 | # CONFIG_IP_SCTP is not set | ||
352 | # CONFIG_TIPC is not set | ||
353 | # CONFIG_ATM is not set | ||
354 | # CONFIG_BRIDGE is not set | ||
355 | # CONFIG_NET_DSA is not set | ||
356 | # CONFIG_VLAN_8021Q is not set | ||
357 | # CONFIG_DECNET is not set | ||
358 | # CONFIG_LLC2 is not set | ||
359 | # CONFIG_IPX is not set | ||
360 | # CONFIG_ATALK is not set | ||
361 | # CONFIG_X25 is not set | ||
362 | # CONFIG_LAPB is not set | ||
363 | # CONFIG_ECONET is not set | ||
364 | # CONFIG_WAN_ROUTER is not set | ||
365 | # CONFIG_NET_SCHED is not set | ||
366 | # CONFIG_DCB is not set | ||
367 | |||
368 | # | ||
369 | # Network testing | ||
370 | # | ||
371 | # CONFIG_NET_PKTGEN is not set | ||
372 | # CONFIG_HAMRADIO is not set | ||
373 | # CONFIG_CAN is not set | ||
374 | # CONFIG_IRDA is not set | ||
375 | # CONFIG_BT is not set | ||
376 | # CONFIG_AF_RXRPC is not set | ||
377 | # CONFIG_PHONET is not set | ||
378 | # CONFIG_WIRELESS is not set | ||
379 | # CONFIG_WIMAX is not set | ||
380 | # CONFIG_RFKILL is not set | ||
381 | # CONFIG_NET_9P is not set | ||
382 | |||
383 | # | ||
384 | # Device Drivers | ||
385 | # | ||
386 | |||
387 | # | ||
388 | # Generic Driver Options | ||
389 | # | ||
390 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
391 | CONFIG_STANDALONE=y | ||
392 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
393 | CONFIG_FW_LOADER=y | ||
394 | # CONFIG_FIRMWARE_IN_KERNEL is not set | ||
395 | CONFIG_EXTRA_FIRMWARE="" | ||
396 | # CONFIG_DEBUG_DRIVER is not set | ||
397 | # CONFIG_DEBUG_DEVRES is not set | ||
398 | # CONFIG_SYS_HYPERVISOR is not set | ||
399 | # CONFIG_CONNECTOR is not set | ||
400 | CONFIG_MTD=y | ||
401 | # CONFIG_MTD_DEBUG is not set | ||
402 | # CONFIG_MTD_CONCAT is not set | ||
403 | CONFIG_MTD_PARTITIONS=y | ||
404 | # CONFIG_MTD_TESTS is not set | ||
405 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
406 | CONFIG_MTD_CMDLINE_PARTS=y | ||
407 | # CONFIG_MTD_AR7_PARTS is not set | ||
408 | |||
409 | # | ||
410 | # User Modules And Translation Layers | ||
411 | # | ||
412 | CONFIG_MTD_CHAR=y | ||
413 | CONFIG_MTD_BLKDEVS=y | ||
414 | CONFIG_MTD_BLOCK=y | ||
415 | # CONFIG_FTL is not set | ||
416 | # CONFIG_NFTL is not set | ||
417 | # CONFIG_INFTL is not set | ||
418 | # CONFIG_RFD_FTL is not set | ||
419 | # CONFIG_SSFDC is not set | ||
420 | # CONFIG_MTD_OOPS is not set | ||
421 | |||
422 | # | ||
423 | # RAM/ROM/Flash chip drivers | ||
424 | # | ||
425 | CONFIG_MTD_CFI=y | ||
426 | # CONFIG_MTD_JEDECPROBE is not set | ||
427 | CONFIG_MTD_GEN_PROBE=y | ||
428 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
429 | CONFIG_MTD_CFI_NOSWAP=y | ||
430 | # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
431 | # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set | ||
432 | # CONFIG_MTD_CFI_GEOMETRY is not set | ||
433 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
434 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
435 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
436 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
437 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
438 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
439 | CONFIG_MTD_CFI_I1=y | ||
440 | CONFIG_MTD_CFI_I2=y | ||
441 | # CONFIG_MTD_CFI_I4 is not set | ||
442 | # CONFIG_MTD_CFI_I8 is not set | ||
443 | # CONFIG_MTD_OTP is not set | ||
444 | CONFIG_MTD_CFI_INTELEXT=y | ||
445 | # CONFIG_MTD_CFI_AMDSTD is not set | ||
446 | # CONFIG_MTD_CFI_STAA is not set | ||
447 | CONFIG_MTD_CFI_UTIL=y | ||
448 | # CONFIG_MTD_RAM is not set | ||
449 | # CONFIG_MTD_ROM is not set | ||
450 | # CONFIG_MTD_ABSENT is not set | ||
451 | |||
452 | # | ||
453 | # Mapping drivers for chip access | ||
454 | # | ||
455 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
456 | CONFIG_MTD_PHYSMAP=y | ||
457 | CONFIG_MTD_PHYSMAP_COMPAT=y | ||
458 | CONFIG_MTD_PHYSMAP_START=0x00000000 | ||
459 | CONFIG_MTD_PHYSMAP_LEN=0x01000000 | ||
460 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
461 | # CONFIG_MTD_PLATRAM is not set | ||
462 | |||
463 | # | ||
464 | # Self-contained MTD device drivers | ||
465 | # | ||
466 | # CONFIG_MTD_SLRAM is not set | ||
467 | # CONFIG_MTD_PHRAM is not set | ||
468 | # CONFIG_MTD_MTDRAM is not set | ||
469 | # CONFIG_MTD_BLOCK2MTD is not set | ||
470 | |||
471 | # | ||
472 | # Disk-On-Chip Device Drivers | ||
473 | # | ||
474 | # CONFIG_MTD_DOC2000 is not set | ||
475 | # CONFIG_MTD_DOC2001 is not set | ||
476 | # CONFIG_MTD_DOC2001PLUS is not set | ||
477 | # CONFIG_MTD_NAND is not set | ||
478 | # CONFIG_MTD_ONENAND is not set | ||
479 | |||
480 | # | ||
481 | # LPDDR flash memory drivers | ||
482 | # | ||
483 | # CONFIG_MTD_LPDDR is not set | ||
484 | # CONFIG_MTD_QINFO_PROBE is not set | ||
485 | |||
486 | # | ||
487 | # UBI - Unsorted block images | ||
488 | # | ||
489 | # CONFIG_MTD_UBI is not set | ||
490 | # CONFIG_PARPORT is not set | ||
491 | CONFIG_BLK_DEV=y | ||
492 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
493 | # CONFIG_BLK_DEV_LOOP is not set | ||
494 | # CONFIG_BLK_DEV_NBD is not set | ||
495 | # CONFIG_BLK_DEV_RAM is not set | ||
496 | # CONFIG_CDROM_PKTCDVD is not set | ||
497 | # CONFIG_ATA_OVER_ETH is not set | ||
498 | # CONFIG_BLK_DEV_HD is not set | ||
499 | CONFIG_MISC_DEVICES=y | ||
500 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
501 | # CONFIG_C2PORT is not set | ||
502 | |||
503 | # | ||
504 | # EEPROM support | ||
505 | # | ||
506 | # CONFIG_EEPROM_93CX6 is not set | ||
507 | CONFIG_HAVE_IDE=y | ||
508 | # CONFIG_IDE is not set | ||
509 | |||
510 | # | ||
511 | # SCSI device support | ||
512 | # | ||
513 | # CONFIG_RAID_ATTRS is not set | ||
514 | # CONFIG_SCSI is not set | ||
515 | # CONFIG_SCSI_DMA is not set | ||
516 | # CONFIG_SCSI_NETLINK is not set | ||
517 | # CONFIG_ATA is not set | ||
518 | # CONFIG_MD is not set | ||
519 | CONFIG_NETDEVICES=y | ||
520 | # CONFIG_DUMMY is not set | ||
521 | # CONFIG_BONDING is not set | ||
522 | # CONFIG_MACVLAN is not set | ||
523 | # CONFIG_EQUALIZER is not set | ||
524 | # CONFIG_TUN is not set | ||
525 | # CONFIG_VETH is not set | ||
526 | CONFIG_PHYLIB=y | ||
527 | |||
528 | # | ||
529 | # MII PHY device drivers | ||
530 | # | ||
531 | # CONFIG_MARVELL_PHY is not set | ||
532 | # CONFIG_DAVICOM_PHY is not set | ||
533 | # CONFIG_QSEMI_PHY is not set | ||
534 | # CONFIG_LXT_PHY is not set | ||
535 | # CONFIG_CICADA_PHY is not set | ||
536 | # CONFIG_VITESSE_PHY is not set | ||
537 | CONFIG_SMSC_PHY=y | ||
538 | # CONFIG_BROADCOM_PHY is not set | ||
539 | # CONFIG_ICPLUS_PHY is not set | ||
540 | # CONFIG_REALTEK_PHY is not set | ||
541 | # CONFIG_NATIONAL_PHY is not set | ||
542 | # CONFIG_STE10XP is not set | ||
543 | # CONFIG_LSI_ET1011C_PHY is not set | ||
544 | # CONFIG_FIXED_PHY is not set | ||
545 | # CONFIG_MDIO_BITBANG is not set | ||
546 | CONFIG_NET_ETHERNET=y | ||
547 | CONFIG_MII=y | ||
548 | # CONFIG_AX88796 is not set | ||
549 | # CONFIG_STNIC is not set | ||
550 | # CONFIG_SMC91X is not set | ||
551 | # CONFIG_SMC911X is not set | ||
552 | CONFIG_SMSC911X=y | ||
553 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
554 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
555 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
556 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
557 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
558 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
559 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
560 | # CONFIG_B44 is not set | ||
561 | # CONFIG_NETDEV_1000 is not set | ||
562 | # CONFIG_NETDEV_10000 is not set | ||
563 | |||
564 | # | ||
565 | # Wireless LAN | ||
566 | # | ||
567 | # CONFIG_WLAN_PRE80211 is not set | ||
568 | # CONFIG_WLAN_80211 is not set | ||
569 | # CONFIG_IWLWIFI_LEDS is not set | ||
570 | |||
571 | # | ||
572 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
573 | # | ||
574 | # CONFIG_WAN is not set | ||
575 | # CONFIG_PPP is not set | ||
576 | # CONFIG_SLIP is not set | ||
577 | # CONFIG_NETCONSOLE is not set | ||
578 | # CONFIG_NETPOLL is not set | ||
579 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
580 | # CONFIG_ISDN is not set | ||
581 | # CONFIG_PHONE is not set | ||
582 | |||
583 | # | ||
584 | # Input device support | ||
585 | # | ||
586 | CONFIG_INPUT=y | ||
587 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
588 | # CONFIG_INPUT_POLLDEV is not set | ||
589 | |||
590 | # | ||
591 | # Userland interfaces | ||
592 | # | ||
593 | # CONFIG_INPUT_MOUSEDEV is not set | ||
594 | # CONFIG_INPUT_JOYDEV is not set | ||
595 | # CONFIG_INPUT_EVDEV is not set | ||
596 | # CONFIG_INPUT_EVBUG is not set | ||
597 | |||
598 | # | ||
599 | # Input Device Drivers | ||
600 | # | ||
601 | # CONFIG_INPUT_KEYBOARD is not set | ||
602 | # CONFIG_INPUT_MOUSE is not set | ||
603 | # CONFIG_INPUT_JOYSTICK is not set | ||
604 | # CONFIG_INPUT_TABLET is not set | ||
605 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
606 | # CONFIG_INPUT_MISC is not set | ||
607 | |||
608 | # | ||
609 | # Hardware I/O ports | ||
610 | # | ||
611 | # CONFIG_SERIO is not set | ||
612 | # CONFIG_GAMEPORT is not set | ||
613 | |||
614 | # | ||
615 | # Character devices | ||
616 | # | ||
617 | CONFIG_VT=y | ||
618 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
619 | CONFIG_VT_CONSOLE=y | ||
620 | CONFIG_HW_CONSOLE=y | ||
621 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
622 | CONFIG_DEVKMEM=y | ||
623 | CONFIG_SERIAL_NONSTANDARD=y | ||
624 | # CONFIG_N_HDLC is not set | ||
625 | # CONFIG_RISCOM8 is not set | ||
626 | # CONFIG_SPECIALIX is not set | ||
627 | # CONFIG_RIO is not set | ||
628 | # CONFIG_STALDRV is not set | ||
629 | |||
630 | # | ||
631 | # Serial drivers | ||
632 | # | ||
633 | # CONFIG_SERIAL_8250 is not set | ||
634 | |||
635 | # | ||
636 | # Non-8250 serial port support | ||
637 | # | ||
638 | CONFIG_SERIAL_SH_SCI=y | ||
639 | CONFIG_SERIAL_SH_SCI_NR_UARTS=3 | ||
640 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
641 | CONFIG_SERIAL_CORE=y | ||
642 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
643 | CONFIG_UNIX98_PTYS=y | ||
644 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
645 | # CONFIG_LEGACY_PTYS is not set | ||
646 | # CONFIG_IPMI_HANDLER is not set | ||
647 | # CONFIG_HW_RANDOM is not set | ||
648 | # CONFIG_R3964 is not set | ||
649 | # CONFIG_RAW_DRIVER is not set | ||
650 | # CONFIG_TCG_TPM is not set | ||
651 | # CONFIG_I2C is not set | ||
652 | # CONFIG_SPI is not set | ||
653 | # CONFIG_W1 is not set | ||
654 | # CONFIG_POWER_SUPPLY is not set | ||
655 | # CONFIG_HWMON is not set | ||
656 | # CONFIG_THERMAL is not set | ||
657 | # CONFIG_THERMAL_HWMON is not set | ||
658 | # CONFIG_WATCHDOG is not set | ||
659 | CONFIG_SSB_POSSIBLE=y | ||
660 | |||
661 | # | ||
662 | # Sonics Silicon Backplane | ||
663 | # | ||
664 | # CONFIG_SSB is not set | ||
665 | |||
666 | # | ||
667 | # Multifunction device drivers | ||
668 | # | ||
669 | # CONFIG_MFD_CORE is not set | ||
670 | # CONFIG_MFD_SM501 is not set | ||
671 | # CONFIG_HTC_PASIC3 is not set | ||
672 | # CONFIG_MFD_TMIO is not set | ||
673 | # CONFIG_REGULATOR is not set | ||
674 | |||
675 | # | ||
676 | # Multimedia devices | ||
677 | # | ||
678 | |||
679 | # | ||
680 | # Multimedia core support | ||
681 | # | ||
682 | # CONFIG_VIDEO_DEV is not set | ||
683 | # CONFIG_DVB_CORE is not set | ||
684 | # CONFIG_VIDEO_MEDIA is not set | ||
685 | |||
686 | # | ||
687 | # Multimedia drivers | ||
688 | # | ||
689 | # CONFIG_DAB is not set | ||
690 | |||
691 | # | ||
692 | # Graphics support | ||
693 | # | ||
694 | # CONFIG_VGASTATE is not set | ||
695 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
696 | # CONFIG_FB is not set | ||
697 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
698 | |||
699 | # | ||
700 | # Display device support | ||
701 | # | ||
702 | # CONFIG_DISPLAY_SUPPORT is not set | ||
703 | |||
704 | # | ||
705 | # Console display driver support | ||
706 | # | ||
707 | CONFIG_DUMMY_CONSOLE=y | ||
708 | # CONFIG_SOUND is not set | ||
709 | # CONFIG_HID_SUPPORT is not set | ||
710 | # CONFIG_USB_SUPPORT is not set | ||
711 | # CONFIG_MMC is not set | ||
712 | # CONFIG_MEMSTICK is not set | ||
713 | # CONFIG_NEW_LEDS is not set | ||
714 | # CONFIG_ACCESSIBILITY is not set | ||
715 | CONFIG_RTC_LIB=y | ||
716 | CONFIG_RTC_CLASS=y | ||
717 | CONFIG_RTC_HCTOSYS=y | ||
718 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
719 | # CONFIG_RTC_DEBUG is not set | ||
720 | |||
721 | # | ||
722 | # RTC interfaces | ||
723 | # | ||
724 | CONFIG_RTC_INTF_SYSFS=y | ||
725 | CONFIG_RTC_INTF_PROC=y | ||
726 | CONFIG_RTC_INTF_DEV=y | ||
727 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
728 | # CONFIG_RTC_DRV_TEST is not set | ||
729 | |||
730 | # | ||
731 | # SPI RTC drivers | ||
732 | # | ||
733 | |||
734 | # | ||
735 | # Platform RTC drivers | ||
736 | # | ||
737 | # CONFIG_RTC_DRV_DS1286 is not set | ||
738 | # CONFIG_RTC_DRV_DS1511 is not set | ||
739 | # CONFIG_RTC_DRV_DS1553 is not set | ||
740 | # CONFIG_RTC_DRV_DS1742 is not set | ||
741 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
742 | # CONFIG_RTC_DRV_M48T86 is not set | ||
743 | # CONFIG_RTC_DRV_M48T35 is not set | ||
744 | # CONFIG_RTC_DRV_M48T59 is not set | ||
745 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
746 | # CONFIG_RTC_DRV_V3020 is not set | ||
747 | |||
748 | # | ||
749 | # on-CPU RTC drivers | ||
750 | # | ||
751 | CONFIG_RTC_DRV_SH=y | ||
752 | # CONFIG_DMADEVICES is not set | ||
753 | # CONFIG_UIO is not set | ||
754 | # CONFIG_STAGING is not set | ||
755 | |||
756 | # | ||
757 | # File systems | ||
758 | # | ||
759 | # CONFIG_EXT2_FS is not set | ||
760 | # CONFIG_EXT3_FS is not set | ||
761 | # CONFIG_EXT4_FS is not set | ||
762 | # CONFIG_REISERFS_FS is not set | ||
763 | # CONFIG_JFS_FS is not set | ||
764 | # CONFIG_FS_POSIX_ACL is not set | ||
765 | CONFIG_FILE_LOCKING=y | ||
766 | # CONFIG_XFS_FS is not set | ||
767 | # CONFIG_OCFS2_FS is not set | ||
768 | # CONFIG_BTRFS_FS is not set | ||
769 | # CONFIG_DNOTIFY is not set | ||
770 | # CONFIG_INOTIFY is not set | ||
771 | # CONFIG_QUOTA is not set | ||
772 | # CONFIG_AUTOFS_FS is not set | ||
773 | # CONFIG_AUTOFS4_FS is not set | ||
774 | # CONFIG_FUSE_FS is not set | ||
775 | |||
776 | # | ||
777 | # CD-ROM/DVD Filesystems | ||
778 | # | ||
779 | # CONFIG_ISO9660_FS is not set | ||
780 | # CONFIG_UDF_FS is not set | ||
781 | |||
782 | # | ||
783 | # DOS/FAT/NT Filesystems | ||
784 | # | ||
785 | # CONFIG_MSDOS_FS is not set | ||
786 | # CONFIG_VFAT_FS is not set | ||
787 | # CONFIG_NTFS_FS is not set | ||
788 | |||
789 | # | ||
790 | # Pseudo filesystems | ||
791 | # | ||
792 | CONFIG_PROC_FS=y | ||
793 | CONFIG_PROC_KCORE=y | ||
794 | CONFIG_PROC_SYSCTL=y | ||
795 | CONFIG_PROC_PAGE_MONITOR=y | ||
796 | CONFIG_SYSFS=y | ||
797 | CONFIG_TMPFS=y | ||
798 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
799 | # CONFIG_HUGETLBFS is not set | ||
800 | # CONFIG_HUGETLB_PAGE is not set | ||
801 | # CONFIG_CONFIGFS_FS is not set | ||
802 | CONFIG_MISC_FILESYSTEMS=y | ||
803 | # CONFIG_ADFS_FS is not set | ||
804 | # CONFIG_AFFS_FS is not set | ||
805 | # CONFIG_HFS_FS is not set | ||
806 | # CONFIG_HFSPLUS_FS is not set | ||
807 | # CONFIG_BEFS_FS is not set | ||
808 | # CONFIG_BFS_FS is not set | ||
809 | # CONFIG_EFS_FS is not set | ||
810 | CONFIG_JFFS2_FS=y | ||
811 | CONFIG_JFFS2_FS_DEBUG=0 | ||
812 | # CONFIG_JFFS2_FS_WRITEBUFFER is not set | ||
813 | # CONFIG_JFFS2_SUMMARY is not set | ||
814 | # CONFIG_JFFS2_FS_XATTR is not set | ||
815 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
816 | CONFIG_JFFS2_ZLIB=y | ||
817 | # CONFIG_JFFS2_LZO is not set | ||
818 | CONFIG_JFFS2_RTIME=y | ||
819 | # CONFIG_JFFS2_RUBIN is not set | ||
820 | # CONFIG_CRAMFS is not set | ||
821 | # CONFIG_SQUASHFS is not set | ||
822 | # CONFIG_VXFS_FS is not set | ||
823 | # CONFIG_MINIX_FS is not set | ||
824 | # CONFIG_OMFS_FS is not set | ||
825 | # CONFIG_HPFS_FS is not set | ||
826 | # CONFIG_QNX4FS_FS is not set | ||
827 | # CONFIG_ROMFS_FS is not set | ||
828 | # CONFIG_SYSV_FS is not set | ||
829 | # CONFIG_UFS_FS is not set | ||
830 | CONFIG_NETWORK_FILESYSTEMS=y | ||
831 | CONFIG_NFS_FS=y | ||
832 | CONFIG_NFS_V3=y | ||
833 | # CONFIG_NFS_V3_ACL is not set | ||
834 | # CONFIG_NFS_V4 is not set | ||
835 | # CONFIG_NFSD is not set | ||
836 | CONFIG_LOCKD=y | ||
837 | CONFIG_LOCKD_V4=y | ||
838 | CONFIG_NFS_COMMON=y | ||
839 | CONFIG_SUNRPC=y | ||
840 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
841 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
842 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
843 | # CONFIG_SMB_FS is not set | ||
844 | # CONFIG_CIFS is not set | ||
845 | # CONFIG_NCP_FS is not set | ||
846 | # CONFIG_CODA_FS is not set | ||
847 | # CONFIG_AFS_FS is not set | ||
848 | |||
849 | # | ||
850 | # Partition Types | ||
851 | # | ||
852 | # CONFIG_PARTITION_ADVANCED is not set | ||
853 | CONFIG_MSDOS_PARTITION=y | ||
854 | # CONFIG_NLS is not set | ||
855 | # CONFIG_DLM is not set | ||
856 | |||
857 | # | ||
858 | # Kernel hacking | ||
859 | # | ||
860 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
861 | # CONFIG_PRINTK_TIME is not set | ||
862 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
863 | CONFIG_ENABLE_MUST_CHECK=y | ||
864 | CONFIG_FRAME_WARN=1024 | ||
865 | # CONFIG_MAGIC_SYSRQ is not set | ||
866 | # CONFIG_UNUSED_SYMBOLS is not set | ||
867 | # CONFIG_DEBUG_FS is not set | ||
868 | # CONFIG_HEADERS_CHECK is not set | ||
869 | CONFIG_DEBUG_KERNEL=y | ||
870 | CONFIG_DEBUG_SHIRQ=y | ||
871 | CONFIG_DETECT_SOFTLOCKUP=y | ||
872 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
873 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
874 | # CONFIG_SCHED_DEBUG is not set | ||
875 | # CONFIG_SCHEDSTATS is not set | ||
876 | # CONFIG_TIMER_STATS is not set | ||
877 | # CONFIG_DEBUG_OBJECTS is not set | ||
878 | # CONFIG_DEBUG_SLAB is not set | ||
879 | CONFIG_DEBUG_PREEMPT=y | ||
880 | CONFIG_DEBUG_RT_MUTEXES=y | ||
881 | CONFIG_DEBUG_PI_LIST=y | ||
882 | # CONFIG_RT_MUTEX_TESTER is not set | ||
883 | CONFIG_DEBUG_SPINLOCK=y | ||
884 | CONFIG_DEBUG_MUTEXES=y | ||
885 | CONFIG_DEBUG_LOCK_ALLOC=y | ||
886 | # CONFIG_PROVE_LOCKING is not set | ||
887 | CONFIG_LOCKDEP=y | ||
888 | # CONFIG_LOCK_STAT is not set | ||
889 | # CONFIG_DEBUG_LOCKDEP is not set | ||
890 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | ||
891 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
892 | CONFIG_STACKTRACE=y | ||
893 | # CONFIG_DEBUG_KOBJECT is not set | ||
894 | CONFIG_DEBUG_BUGVERBOSE=y | ||
895 | CONFIG_DEBUG_INFO=y | ||
896 | # CONFIG_DEBUG_VM is not set | ||
897 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
898 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
899 | # CONFIG_DEBUG_LIST is not set | ||
900 | CONFIG_DEBUG_SG=y | ||
901 | # CONFIG_DEBUG_NOTIFIERS is not set | ||
902 | CONFIG_FRAME_POINTER=y | ||
903 | # CONFIG_RCU_TORTURE_TEST is not set | ||
904 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
905 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
906 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
907 | # CONFIG_FAULT_INJECTION is not set | ||
908 | # CONFIG_LATENCYTOP is not set | ||
909 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
910 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
911 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
912 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
913 | |||
914 | # | ||
915 | # Tracers | ||
916 | # | ||
917 | # CONFIG_FUNCTION_TRACER is not set | ||
918 | # CONFIG_IRQSOFF_TRACER is not set | ||
919 | # CONFIG_PREEMPT_TRACER is not set | ||
920 | # CONFIG_SCHED_TRACER is not set | ||
921 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
922 | # CONFIG_BOOT_TRACER is not set | ||
923 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
924 | # CONFIG_STACK_TRACER is not set | ||
925 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
926 | # CONFIG_SAMPLES is not set | ||
927 | CONFIG_HAVE_ARCH_KGDB=y | ||
928 | # CONFIG_KGDB is not set | ||
929 | # CONFIG_SH_STANDARD_BIOS is not set | ||
930 | CONFIG_EARLY_SCIF_CONSOLE=y | ||
931 | CONFIG_EARLY_SCIF_CONSOLE_PORT=0x00000000 | ||
932 | CONFIG_EARLY_PRINTK=y | ||
933 | # CONFIG_DEBUG_BOOTMEM is not set | ||
934 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
935 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
936 | # CONFIG_4KSTACKS is not set | ||
937 | # CONFIG_IRQSTACKS is not set | ||
938 | CONFIG_DUMP_CODE=y | ||
939 | # CONFIG_SH_NO_BSS_INIT is not set | ||
940 | # CONFIG_MORE_COMPILE_OPTIONS is not set | ||
941 | |||
942 | # | ||
943 | # Security options | ||
944 | # | ||
945 | # CONFIG_KEYS is not set | ||
946 | # CONFIG_SECURITY is not set | ||
947 | # CONFIG_SECURITYFS is not set | ||
948 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
949 | # CONFIG_CRYPTO is not set | ||
950 | |||
951 | # | ||
952 | # Library routines | ||
953 | # | ||
954 | CONFIG_BITREVERSE=y | ||
955 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
956 | # CONFIG_CRC_CCITT is not set | ||
957 | # CONFIG_CRC16 is not set | ||
958 | # CONFIG_CRC_T10DIF is not set | ||
959 | # CONFIG_CRC_ITU_T is not set | ||
960 | CONFIG_CRC32=y | ||
961 | # CONFIG_CRC7 is not set | ||
962 | # CONFIG_LIBCRC32C is not set | ||
963 | CONFIG_AUDIT_GENERIC=y | ||
964 | CONFIG_ZLIB_INFLATE=y | ||
965 | CONFIG_ZLIB_DEFLATE=y | ||
966 | CONFIG_PLIST=y | ||
967 | CONFIG_HAS_IOMEM=y | ||
968 | CONFIG_HAS_IOPORT=y | ||
969 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/sh/configs/sh7785lcr_32bit_defconfig b/arch/sh/configs/sh7785lcr_32bit_defconfig new file mode 100644 index 000000000000..54e1dee8e24a --- /dev/null +++ b/arch/sh/configs/sh7785lcr_32bit_defconfig | |||
@@ -0,0 +1,1553 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.29-rc4 | ||
4 | # Fri Feb 20 18:25:29 2009 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_SUPERH32=y | ||
8 | CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
10 | CONFIG_GENERIC_BUG=y | ||
11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
15 | CONFIG_GENERIC_IRQ_PROBE=y | ||
16 | # CONFIG_GENERIC_GPIO is not set | ||
17 | CONFIG_GENERIC_TIME=y | ||
18 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
19 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set | ||
20 | # CONFIG_ARCH_HIBERNATION_POSSIBLE is not set | ||
21 | CONFIG_SYS_SUPPORTS_NUMA=y | ||
22 | CONFIG_SYS_SUPPORTS_PCI=y | ||
23 | CONFIG_STACKTRACE_SUPPORT=y | ||
24 | CONFIG_LOCKDEP_SUPPORT=y | ||
25 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
26 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
27 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
28 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
29 | CONFIG_IO_TRAPPED=y | ||
30 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
31 | |||
32 | # | ||
33 | # General setup | ||
34 | # | ||
35 | CONFIG_EXPERIMENTAL=y | ||
36 | CONFIG_BROKEN_ON_SMP=y | ||
37 | CONFIG_LOCK_KERNEL=y | ||
38 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
39 | CONFIG_LOCALVERSION="" | ||
40 | CONFIG_LOCALVERSION_AUTO=y | ||
41 | CONFIG_SWAP=y | ||
42 | CONFIG_SYSVIPC=y | ||
43 | CONFIG_SYSVIPC_SYSCTL=y | ||
44 | # CONFIG_POSIX_MQUEUE is not set | ||
45 | CONFIG_BSD_PROCESS_ACCT=y | ||
46 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
47 | # CONFIG_TASKSTATS is not set | ||
48 | # CONFIG_AUDIT is not set | ||
49 | |||
50 | # | ||
51 | # RCU Subsystem | ||
52 | # | ||
53 | CONFIG_CLASSIC_RCU=y | ||
54 | # CONFIG_TREE_RCU is not set | ||
55 | # CONFIG_PREEMPT_RCU is not set | ||
56 | # CONFIG_TREE_RCU_TRACE is not set | ||
57 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
58 | CONFIG_IKCONFIG=y | ||
59 | CONFIG_IKCONFIG_PROC=y | ||
60 | CONFIG_LOG_BUF_SHIFT=14 | ||
61 | CONFIG_GROUP_SCHED=y | ||
62 | CONFIG_FAIR_GROUP_SCHED=y | ||
63 | # CONFIG_RT_GROUP_SCHED is not set | ||
64 | CONFIG_USER_SCHED=y | ||
65 | # CONFIG_CGROUP_SCHED is not set | ||
66 | # CONFIG_CGROUPS is not set | ||
67 | CONFIG_SYSFS_DEPRECATED=y | ||
68 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
69 | # CONFIG_RELAY is not set | ||
70 | # CONFIG_NAMESPACES is not set | ||
71 | # CONFIG_BLK_DEV_INITRD is not set | ||
72 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
73 | CONFIG_SYSCTL=y | ||
74 | CONFIG_EMBEDDED=y | ||
75 | CONFIG_UID16=y | ||
76 | CONFIG_SYSCTL_SYSCALL=y | ||
77 | CONFIG_KALLSYMS=y | ||
78 | # CONFIG_KALLSYMS_ALL is not set | ||
79 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
80 | CONFIG_HOTPLUG=y | ||
81 | CONFIG_PRINTK=y | ||
82 | CONFIG_BUG=y | ||
83 | CONFIG_ELF_CORE=y | ||
84 | CONFIG_COMPAT_BRK=y | ||
85 | CONFIG_BASE_FULL=y | ||
86 | CONFIG_FUTEX=y | ||
87 | CONFIG_ANON_INODES=y | ||
88 | CONFIG_EPOLL=y | ||
89 | CONFIG_SIGNALFD=y | ||
90 | CONFIG_TIMERFD=y | ||
91 | CONFIG_EVENTFD=y | ||
92 | CONFIG_SHMEM=y | ||
93 | CONFIG_AIO=y | ||
94 | CONFIG_VM_EVENT_COUNTERS=y | ||
95 | CONFIG_PCI_QUIRKS=y | ||
96 | CONFIG_SLAB=y | ||
97 | # CONFIG_SLUB is not set | ||
98 | # CONFIG_SLOB is not set | ||
99 | CONFIG_PROFILING=y | ||
100 | # CONFIG_OPROFILE is not set | ||
101 | CONFIG_HAVE_OPROFILE=y | ||
102 | # CONFIG_KPROBES is not set | ||
103 | CONFIG_HAVE_IOREMAP_PROT=y | ||
104 | CONFIG_HAVE_KPROBES=y | ||
105 | CONFIG_HAVE_KRETPROBES=y | ||
106 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
107 | CONFIG_HAVE_CLK=y | ||
108 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
109 | CONFIG_SLABINFO=y | ||
110 | CONFIG_RT_MUTEXES=y | ||
111 | CONFIG_BASE_SMALL=0 | ||
112 | CONFIG_MODULES=y | ||
113 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
114 | CONFIG_MODULE_UNLOAD=y | ||
115 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
116 | # CONFIG_MODVERSIONS is not set | ||
117 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
118 | CONFIG_BLOCK=y | ||
119 | # CONFIG_LBD is not set | ||
120 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
121 | # CONFIG_BLK_DEV_BSG is not set | ||
122 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
123 | |||
124 | # | ||
125 | # IO Schedulers | ||
126 | # | ||
127 | CONFIG_IOSCHED_NOOP=y | ||
128 | CONFIG_IOSCHED_AS=y | ||
129 | CONFIG_IOSCHED_DEADLINE=y | ||
130 | CONFIG_IOSCHED_CFQ=y | ||
131 | # CONFIG_DEFAULT_AS is not set | ||
132 | # CONFIG_DEFAULT_DEADLINE is not set | ||
133 | CONFIG_DEFAULT_CFQ=y | ||
134 | # CONFIG_DEFAULT_NOOP is not set | ||
135 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
136 | # CONFIG_FREEZER is not set | ||
137 | |||
138 | # | ||
139 | # System type | ||
140 | # | ||
141 | CONFIG_CPU_SH4=y | ||
142 | CONFIG_CPU_SH4A=y | ||
143 | CONFIG_CPU_SHX2=y | ||
144 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | ||
145 | # CONFIG_CPU_SUBTYPE_SH7201 is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | ||
147 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | ||
148 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | ||
149 | # CONFIG_CPU_SUBTYPE_MXG is not set | ||
150 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
151 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
152 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
153 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | ||
156 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | ||
157 | # CONFIG_CPU_SUBTYPE_SH7720 is not set | ||
158 | # CONFIG_CPU_SUBTYPE_SH7721 is not set | ||
159 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
160 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
161 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
162 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
163 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
164 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
165 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
166 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
167 | # CONFIG_CPU_SUBTYPE_SH7723 is not set | ||
168 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | ||
169 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
170 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
171 | CONFIG_CPU_SUBTYPE_SH7785=y | ||
172 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | ||
173 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | ||
174 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | ||
175 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
176 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
177 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
178 | |||
179 | # | ||
180 | # Memory management options | ||
181 | # | ||
182 | CONFIG_QUICKLIST=y | ||
183 | CONFIG_MMU=y | ||
184 | CONFIG_PAGE_OFFSET=0x80000000 | ||
185 | CONFIG_MEMORY_START=0x40000000 | ||
186 | CONFIG_MEMORY_SIZE=0x20000000 | ||
187 | # CONFIG_29BIT is not set | ||
188 | CONFIG_32BIT=y | ||
189 | CONFIG_PMB_ENABLE=y | ||
190 | # CONFIG_PMB is not set | ||
191 | CONFIG_PMB_FIXED=y | ||
192 | # CONFIG_X2TLB is not set | ||
193 | CONFIG_VSYSCALL=y | ||
194 | # CONFIG_NUMA is not set | ||
195 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
196 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
197 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
198 | CONFIG_MAX_ACTIVE_REGIONS=2 | ||
199 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
200 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
201 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
202 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
203 | CONFIG_PAGE_SIZE_4KB=y | ||
204 | # CONFIG_PAGE_SIZE_8KB is not set | ||
205 | # CONFIG_PAGE_SIZE_16KB is not set | ||
206 | # CONFIG_PAGE_SIZE_64KB is not set | ||
207 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
208 | CONFIG_SELECT_MEMORY_MODEL=y | ||
209 | # CONFIG_FLATMEM_MANUAL is not set | ||
210 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
211 | CONFIG_SPARSEMEM_MANUAL=y | ||
212 | CONFIG_SPARSEMEM=y | ||
213 | CONFIG_HAVE_MEMORY_PRESENT=y | ||
214 | CONFIG_SPARSEMEM_STATIC=y | ||
215 | # CONFIG_MEMORY_HOTPLUG is not set | ||
216 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
217 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
218 | CONFIG_MIGRATION=y | ||
219 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
220 | CONFIG_ZONE_DMA_FLAG=0 | ||
221 | CONFIG_NR_QUICK=2 | ||
222 | CONFIG_UNEVICTABLE_LRU=y | ||
223 | |||
224 | # | ||
225 | # Cache configuration | ||
226 | # | ||
227 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
228 | CONFIG_CACHE_WRITEBACK=y | ||
229 | # CONFIG_CACHE_WRITETHROUGH is not set | ||
230 | # CONFIG_CACHE_OFF is not set | ||
231 | |||
232 | # | ||
233 | # Processor features | ||
234 | # | ||
235 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
236 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
237 | CONFIG_SH_FPU=y | ||
238 | CONFIG_SH_STORE_QUEUES=y | ||
239 | CONFIG_CPU_HAS_INTEVT=y | ||
240 | CONFIG_CPU_HAS_SR_RB=y | ||
241 | CONFIG_CPU_HAS_PTEA=y | ||
242 | CONFIG_CPU_HAS_FPU=y | ||
243 | |||
244 | # | ||
245 | # Board support | ||
246 | # | ||
247 | # CONFIG_SH_HIGHLANDER is not set | ||
248 | CONFIG_SH_SH7785LCR=y | ||
249 | |||
250 | # | ||
251 | # Timer and clock configuration | ||
252 | # | ||
253 | CONFIG_SH_TMU=y | ||
254 | CONFIG_SH_TIMER_IRQ=28 | ||
255 | CONFIG_SH_PCLK_FREQ=50000000 | ||
256 | CONFIG_TICK_ONESHOT=y | ||
257 | # CONFIG_NO_HZ is not set | ||
258 | CONFIG_HIGH_RES_TIMERS=y | ||
259 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
260 | |||
261 | # | ||
262 | # CPU Frequency scaling | ||
263 | # | ||
264 | # CONFIG_CPU_FREQ is not set | ||
265 | |||
266 | # | ||
267 | # DMA support | ||
268 | # | ||
269 | # CONFIG_SH_DMA is not set | ||
270 | |||
271 | # | ||
272 | # Companion Chips | ||
273 | # | ||
274 | |||
275 | # | ||
276 | # Additional SuperH Device Drivers | ||
277 | # | ||
278 | CONFIG_HEARTBEAT=y | ||
279 | # CONFIG_PUSH_SWITCH is not set | ||
280 | |||
281 | # | ||
282 | # Kernel features | ||
283 | # | ||
284 | # CONFIG_HZ_100 is not set | ||
285 | CONFIG_HZ_250=y | ||
286 | # CONFIG_HZ_300 is not set | ||
287 | # CONFIG_HZ_1000 is not set | ||
288 | CONFIG_HZ=250 | ||
289 | CONFIG_SCHED_HRTICK=y | ||
290 | CONFIG_KEXEC=y | ||
291 | # CONFIG_CRASH_DUMP is not set | ||
292 | # CONFIG_SECCOMP is not set | ||
293 | # CONFIG_PREEMPT_NONE is not set | ||
294 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
295 | CONFIG_PREEMPT=y | ||
296 | CONFIG_GUSA=y | ||
297 | |||
298 | # | ||
299 | # Boot options | ||
300 | # | ||
301 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
302 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
303 | # CONFIG_CMDLINE_BOOL is not set | ||
304 | |||
305 | # | ||
306 | # Bus options | ||
307 | # | ||
308 | CONFIG_PCI=y | ||
309 | CONFIG_SH_PCIDMA_NONCOHERENT=y | ||
310 | CONFIG_PCI_AUTO=y | ||
311 | CONFIG_PCI_AUTO_UPDATE_RESOURCES=y | ||
312 | # CONFIG_PCIEPORTBUS is not set | ||
313 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
314 | CONFIG_PCI_LEGACY=y | ||
315 | # CONFIG_PCI_DEBUG is not set | ||
316 | # CONFIG_PCI_STUB is not set | ||
317 | # CONFIG_PCCARD is not set | ||
318 | # CONFIG_HOTPLUG_PCI is not set | ||
319 | |||
320 | # | ||
321 | # Executable file formats | ||
322 | # | ||
323 | CONFIG_BINFMT_ELF=y | ||
324 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
325 | # CONFIG_HAVE_AOUT is not set | ||
326 | # CONFIG_BINFMT_MISC is not set | ||
327 | |||
328 | # | ||
329 | # Power management options (EXPERIMENTAL) | ||
330 | # | ||
331 | # CONFIG_PM is not set | ||
332 | # CONFIG_CPU_IDLE is not set | ||
333 | CONFIG_NET=y | ||
334 | |||
335 | # | ||
336 | # Networking options | ||
337 | # | ||
338 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
339 | CONFIG_PACKET=y | ||
340 | # CONFIG_PACKET_MMAP is not set | ||
341 | CONFIG_UNIX=y | ||
342 | CONFIG_XFRM=y | ||
343 | # CONFIG_XFRM_USER is not set | ||
344 | # CONFIG_XFRM_SUB_POLICY is not set | ||
345 | # CONFIG_XFRM_MIGRATE is not set | ||
346 | # CONFIG_XFRM_STATISTICS is not set | ||
347 | # CONFIG_NET_KEY is not set | ||
348 | CONFIG_INET=y | ||
349 | # CONFIG_IP_MULTICAST is not set | ||
350 | CONFIG_IP_ADVANCED_ROUTER=y | ||
351 | CONFIG_ASK_IP_FIB_HASH=y | ||
352 | # CONFIG_IP_FIB_TRIE is not set | ||
353 | CONFIG_IP_FIB_HASH=y | ||
354 | # CONFIG_IP_MULTIPLE_TABLES is not set | ||
355 | # CONFIG_IP_ROUTE_MULTIPATH is not set | ||
356 | # CONFIG_IP_ROUTE_VERBOSE is not set | ||
357 | CONFIG_IP_PNP=y | ||
358 | CONFIG_IP_PNP_DHCP=y | ||
359 | # CONFIG_IP_PNP_BOOTP is not set | ||
360 | # CONFIG_IP_PNP_RARP is not set | ||
361 | # CONFIG_NET_IPIP is not set | ||
362 | # CONFIG_NET_IPGRE is not set | ||
363 | # CONFIG_ARPD is not set | ||
364 | # CONFIG_SYN_COOKIES is not set | ||
365 | # CONFIG_INET_AH is not set | ||
366 | # CONFIG_INET_ESP is not set | ||
367 | # CONFIG_INET_IPCOMP is not set | ||
368 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
369 | # CONFIG_INET_TUNNEL is not set | ||
370 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
371 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
372 | CONFIG_INET_XFRM_MODE_BEET=y | ||
373 | # CONFIG_INET_LRO is not set | ||
374 | CONFIG_INET_DIAG=y | ||
375 | CONFIG_INET_TCP_DIAG=y | ||
376 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
377 | CONFIG_TCP_CONG_CUBIC=y | ||
378 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
379 | # CONFIG_TCP_MD5SIG is not set | ||
380 | # CONFIG_IPV6 is not set | ||
381 | # CONFIG_NETWORK_SECMARK is not set | ||
382 | # CONFIG_NETFILTER is not set | ||
383 | # CONFIG_IP_DCCP is not set | ||
384 | # CONFIG_IP_SCTP is not set | ||
385 | # CONFIG_TIPC is not set | ||
386 | # CONFIG_ATM is not set | ||
387 | # CONFIG_BRIDGE is not set | ||
388 | # CONFIG_NET_DSA is not set | ||
389 | # CONFIG_VLAN_8021Q is not set | ||
390 | # CONFIG_DECNET is not set | ||
391 | # CONFIG_LLC2 is not set | ||
392 | # CONFIG_IPX is not set | ||
393 | # CONFIG_ATALK is not set | ||
394 | # CONFIG_X25 is not set | ||
395 | # CONFIG_LAPB is not set | ||
396 | # CONFIG_ECONET is not set | ||
397 | # CONFIG_WAN_ROUTER is not set | ||
398 | # CONFIG_NET_SCHED is not set | ||
399 | # CONFIG_DCB is not set | ||
400 | |||
401 | # | ||
402 | # Network testing | ||
403 | # | ||
404 | # CONFIG_NET_PKTGEN is not set | ||
405 | # CONFIG_HAMRADIO is not set | ||
406 | # CONFIG_CAN is not set | ||
407 | # CONFIG_IRDA is not set | ||
408 | # CONFIG_BT is not set | ||
409 | # CONFIG_AF_RXRPC is not set | ||
410 | # CONFIG_PHONET is not set | ||
411 | CONFIG_WIRELESS=y | ||
412 | # CONFIG_CFG80211 is not set | ||
413 | # CONFIG_WIRELESS_OLD_REGULATORY is not set | ||
414 | CONFIG_WIRELESS_EXT=y | ||
415 | CONFIG_WIRELESS_EXT_SYSFS=y | ||
416 | # CONFIG_LIB80211 is not set | ||
417 | # CONFIG_MAC80211 is not set | ||
418 | # CONFIG_WIMAX is not set | ||
419 | # CONFIG_RFKILL is not set | ||
420 | # CONFIG_NET_9P is not set | ||
421 | |||
422 | # | ||
423 | # Device Drivers | ||
424 | # | ||
425 | |||
426 | # | ||
427 | # Generic Driver Options | ||
428 | # | ||
429 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
430 | CONFIG_STANDALONE=y | ||
431 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
432 | # CONFIG_FW_LOADER is not set | ||
433 | # CONFIG_DEBUG_DRIVER is not set | ||
434 | # CONFIG_DEBUG_DEVRES is not set | ||
435 | # CONFIG_SYS_HYPERVISOR is not set | ||
436 | # CONFIG_CONNECTOR is not set | ||
437 | CONFIG_MTD=y | ||
438 | # CONFIG_MTD_DEBUG is not set | ||
439 | CONFIG_MTD_CONCAT=y | ||
440 | CONFIG_MTD_PARTITIONS=y | ||
441 | # CONFIG_MTD_TESTS is not set | ||
442 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
443 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
444 | # CONFIG_MTD_AR7_PARTS is not set | ||
445 | |||
446 | # | ||
447 | # User Modules And Translation Layers | ||
448 | # | ||
449 | CONFIG_MTD_CHAR=y | ||
450 | CONFIG_MTD_BLKDEVS=y | ||
451 | CONFIG_MTD_BLOCK=y | ||
452 | # CONFIG_FTL is not set | ||
453 | # CONFIG_NFTL is not set | ||
454 | # CONFIG_INFTL is not set | ||
455 | # CONFIG_RFD_FTL is not set | ||
456 | # CONFIG_SSFDC is not set | ||
457 | # CONFIG_MTD_OOPS is not set | ||
458 | |||
459 | # | ||
460 | # RAM/ROM/Flash chip drivers | ||
461 | # | ||
462 | CONFIG_MTD_CFI=y | ||
463 | # CONFIG_MTD_JEDECPROBE is not set | ||
464 | CONFIG_MTD_GEN_PROBE=y | ||
465 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
466 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
467 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
468 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
469 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
470 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
471 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
472 | CONFIG_MTD_CFI_I1=y | ||
473 | CONFIG_MTD_CFI_I2=y | ||
474 | # CONFIG_MTD_CFI_I4 is not set | ||
475 | # CONFIG_MTD_CFI_I8 is not set | ||
476 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
477 | CONFIG_MTD_CFI_AMDSTD=y | ||
478 | # CONFIG_MTD_CFI_STAA is not set | ||
479 | CONFIG_MTD_CFI_UTIL=y | ||
480 | # CONFIG_MTD_RAM is not set | ||
481 | # CONFIG_MTD_ROM is not set | ||
482 | # CONFIG_MTD_ABSENT is not set | ||
483 | |||
484 | # | ||
485 | # Mapping drivers for chip access | ||
486 | # | ||
487 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
488 | CONFIG_MTD_PHYSMAP=y | ||
489 | # CONFIG_MTD_PHYSMAP_COMPAT is not set | ||
490 | # CONFIG_MTD_INTEL_VR_NOR is not set | ||
491 | # CONFIG_MTD_PLATRAM is not set | ||
492 | |||
493 | # | ||
494 | # Self-contained MTD device drivers | ||
495 | # | ||
496 | # CONFIG_MTD_PMC551 is not set | ||
497 | # CONFIG_MTD_SLRAM is not set | ||
498 | # CONFIG_MTD_PHRAM is not set | ||
499 | # CONFIG_MTD_MTDRAM is not set | ||
500 | # CONFIG_MTD_BLOCK2MTD is not set | ||
501 | |||
502 | # | ||
503 | # Disk-On-Chip Device Drivers | ||
504 | # | ||
505 | # CONFIG_MTD_DOC2000 is not set | ||
506 | # CONFIG_MTD_DOC2001 is not set | ||
507 | # CONFIG_MTD_DOC2001PLUS is not set | ||
508 | # CONFIG_MTD_NAND is not set | ||
509 | # CONFIG_MTD_ONENAND is not set | ||
510 | |||
511 | # | ||
512 | # LPDDR flash memory drivers | ||
513 | # | ||
514 | # CONFIG_MTD_LPDDR is not set | ||
515 | # CONFIG_MTD_QINFO_PROBE is not set | ||
516 | |||
517 | # | ||
518 | # UBI - Unsorted block images | ||
519 | # | ||
520 | # CONFIG_MTD_UBI is not set | ||
521 | # CONFIG_PARPORT is not set | ||
522 | CONFIG_BLK_DEV=y | ||
523 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
524 | # CONFIG_BLK_DEV_DAC960 is not set | ||
525 | # CONFIG_BLK_DEV_UMEM is not set | ||
526 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
527 | # CONFIG_BLK_DEV_LOOP is not set | ||
528 | # CONFIG_BLK_DEV_NBD is not set | ||
529 | # CONFIG_BLK_DEV_SX8 is not set | ||
530 | # CONFIG_BLK_DEV_UB is not set | ||
531 | CONFIG_BLK_DEV_RAM=y | ||
532 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
533 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
534 | # CONFIG_BLK_DEV_XIP is not set | ||
535 | # CONFIG_CDROM_PKTCDVD is not set | ||
536 | # CONFIG_ATA_OVER_ETH is not set | ||
537 | # CONFIG_BLK_DEV_HD is not set | ||
538 | # CONFIG_MISC_DEVICES is not set | ||
539 | CONFIG_HAVE_IDE=y | ||
540 | # CONFIG_IDE is not set | ||
541 | |||
542 | # | ||
543 | # SCSI device support | ||
544 | # | ||
545 | # CONFIG_RAID_ATTRS is not set | ||
546 | CONFIG_SCSI=y | ||
547 | CONFIG_SCSI_DMA=y | ||
548 | # CONFIG_SCSI_TGT is not set | ||
549 | # CONFIG_SCSI_NETLINK is not set | ||
550 | CONFIG_SCSI_PROC_FS=y | ||
551 | |||
552 | # | ||
553 | # SCSI support type (disk, tape, CD-ROM) | ||
554 | # | ||
555 | CONFIG_BLK_DEV_SD=y | ||
556 | # CONFIG_CHR_DEV_ST is not set | ||
557 | # CONFIG_CHR_DEV_OSST is not set | ||
558 | # CONFIG_BLK_DEV_SR is not set | ||
559 | # CONFIG_CHR_DEV_SG is not set | ||
560 | # CONFIG_CHR_DEV_SCH is not set | ||
561 | |||
562 | # | ||
563 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
564 | # | ||
565 | # CONFIG_SCSI_MULTI_LUN is not set | ||
566 | # CONFIG_SCSI_CONSTANTS is not set | ||
567 | # CONFIG_SCSI_LOGGING is not set | ||
568 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
569 | CONFIG_SCSI_WAIT_SCAN=m | ||
570 | |||
571 | # | ||
572 | # SCSI Transports | ||
573 | # | ||
574 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
575 | # CONFIG_SCSI_FC_ATTRS is not set | ||
576 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
577 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
578 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
579 | # CONFIG_SCSI_LOWLEVEL is not set | ||
580 | # CONFIG_SCSI_DH is not set | ||
581 | CONFIG_ATA=y | ||
582 | # CONFIG_ATA_NONSTANDARD is not set | ||
583 | CONFIG_SATA_PMP=y | ||
584 | # CONFIG_SATA_AHCI is not set | ||
585 | # CONFIG_SATA_SIL24 is not set | ||
586 | CONFIG_ATA_SFF=y | ||
587 | # CONFIG_SATA_SVW is not set | ||
588 | # CONFIG_ATA_PIIX is not set | ||
589 | # CONFIG_SATA_MV is not set | ||
590 | # CONFIG_SATA_NV is not set | ||
591 | # CONFIG_PDC_ADMA is not set | ||
592 | # CONFIG_SATA_QSTOR is not set | ||
593 | # CONFIG_SATA_PROMISE is not set | ||
594 | # CONFIG_SATA_SX4 is not set | ||
595 | CONFIG_SATA_SIL=y | ||
596 | # CONFIG_SATA_SIS is not set | ||
597 | # CONFIG_SATA_ULI is not set | ||
598 | # CONFIG_SATA_VIA is not set | ||
599 | # CONFIG_SATA_VITESSE is not set | ||
600 | # CONFIG_SATA_INIC162X is not set | ||
601 | # CONFIG_PATA_ALI is not set | ||
602 | # CONFIG_PATA_AMD is not set | ||
603 | # CONFIG_PATA_ARTOP is not set | ||
604 | # CONFIG_PATA_ATIIXP is not set | ||
605 | # CONFIG_PATA_CMD640_PCI is not set | ||
606 | # CONFIG_PATA_CMD64X is not set | ||
607 | # CONFIG_PATA_CS5520 is not set | ||
608 | # CONFIG_PATA_CS5530 is not set | ||
609 | # CONFIG_PATA_CYPRESS is not set | ||
610 | # CONFIG_PATA_EFAR is not set | ||
611 | # CONFIG_ATA_GENERIC is not set | ||
612 | # CONFIG_PATA_HPT366 is not set | ||
613 | # CONFIG_PATA_HPT37X is not set | ||
614 | # CONFIG_PATA_HPT3X2N is not set | ||
615 | # CONFIG_PATA_HPT3X3 is not set | ||
616 | # CONFIG_PATA_IT821X is not set | ||
617 | # CONFIG_PATA_IT8213 is not set | ||
618 | # CONFIG_PATA_JMICRON is not set | ||
619 | # CONFIG_PATA_TRIFLEX is not set | ||
620 | # CONFIG_PATA_MARVELL is not set | ||
621 | # CONFIG_PATA_MPIIX is not set | ||
622 | # CONFIG_PATA_OLDPIIX is not set | ||
623 | # CONFIG_PATA_NETCELL is not set | ||
624 | # CONFIG_PATA_NINJA32 is not set | ||
625 | # CONFIG_PATA_NS87410 is not set | ||
626 | # CONFIG_PATA_NS87415 is not set | ||
627 | # CONFIG_PATA_OPTI is not set | ||
628 | # CONFIG_PATA_OPTIDMA is not set | ||
629 | # CONFIG_PATA_PDC_OLD is not set | ||
630 | # CONFIG_PATA_RADISYS is not set | ||
631 | # CONFIG_PATA_RZ1000 is not set | ||
632 | # CONFIG_PATA_SC1200 is not set | ||
633 | # CONFIG_PATA_SERVERWORKS is not set | ||
634 | # CONFIG_PATA_PDC2027X is not set | ||
635 | # CONFIG_PATA_SIL680 is not set | ||
636 | # CONFIG_PATA_SIS is not set | ||
637 | # CONFIG_PATA_VIA is not set | ||
638 | # CONFIG_PATA_WINBOND is not set | ||
639 | # CONFIG_PATA_PLATFORM is not set | ||
640 | # CONFIG_PATA_SCH is not set | ||
641 | # CONFIG_MD is not set | ||
642 | # CONFIG_FUSION is not set | ||
643 | |||
644 | # | ||
645 | # IEEE 1394 (FireWire) support | ||
646 | # | ||
647 | |||
648 | # | ||
649 | # Enable only one of the two stacks, unless you know what you are doing | ||
650 | # | ||
651 | # CONFIG_FIREWIRE is not set | ||
652 | # CONFIG_IEEE1394 is not set | ||
653 | # CONFIG_I2O is not set | ||
654 | CONFIG_NETDEVICES=y | ||
655 | # CONFIG_DUMMY is not set | ||
656 | # CONFIG_BONDING is not set | ||
657 | # CONFIG_MACVLAN is not set | ||
658 | # CONFIG_EQUALIZER is not set | ||
659 | # CONFIG_TUN is not set | ||
660 | # CONFIG_VETH is not set | ||
661 | # CONFIG_ARCNET is not set | ||
662 | # CONFIG_NET_ETHERNET is not set | ||
663 | CONFIG_MII=y | ||
664 | CONFIG_NETDEV_1000=y | ||
665 | # CONFIG_ACENIC is not set | ||
666 | # CONFIG_DL2K is not set | ||
667 | # CONFIG_E1000 is not set | ||
668 | # CONFIG_E1000E is not set | ||
669 | # CONFIG_IP1000 is not set | ||
670 | # CONFIG_IGB is not set | ||
671 | # CONFIG_NS83820 is not set | ||
672 | # CONFIG_HAMACHI is not set | ||
673 | # CONFIG_YELLOWFIN is not set | ||
674 | CONFIG_R8169=y | ||
675 | # CONFIG_SIS190 is not set | ||
676 | # CONFIG_SKGE is not set | ||
677 | # CONFIG_SKY2 is not set | ||
678 | # CONFIG_VIA_VELOCITY is not set | ||
679 | # CONFIG_TIGON3 is not set | ||
680 | # CONFIG_BNX2 is not set | ||
681 | # CONFIG_QLA3XXX is not set | ||
682 | # CONFIG_ATL1 is not set | ||
683 | # CONFIG_ATL1E is not set | ||
684 | # CONFIG_JME is not set | ||
685 | # CONFIG_NETDEV_10000 is not set | ||
686 | # CONFIG_TR is not set | ||
687 | |||
688 | # | ||
689 | # Wireless LAN | ||
690 | # | ||
691 | # CONFIG_WLAN_PRE80211 is not set | ||
692 | # CONFIG_WLAN_80211 is not set | ||
693 | # CONFIG_IWLWIFI_LEDS is not set | ||
694 | |||
695 | # | ||
696 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
697 | # | ||
698 | |||
699 | # | ||
700 | # USB Network Adapters | ||
701 | # | ||
702 | # CONFIG_USB_CATC is not set | ||
703 | # CONFIG_USB_KAWETH is not set | ||
704 | # CONFIG_USB_PEGASUS is not set | ||
705 | # CONFIG_USB_RTL8150 is not set | ||
706 | # CONFIG_USB_USBNET is not set | ||
707 | # CONFIG_WAN is not set | ||
708 | # CONFIG_FDDI is not set | ||
709 | # CONFIG_HIPPI is not set | ||
710 | # CONFIG_PPP is not set | ||
711 | # CONFIG_SLIP is not set | ||
712 | # CONFIG_NET_FC is not set | ||
713 | # CONFIG_NETCONSOLE is not set | ||
714 | # CONFIG_NETPOLL is not set | ||
715 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
716 | # CONFIG_ISDN is not set | ||
717 | # CONFIG_PHONE is not set | ||
718 | |||
719 | # | ||
720 | # Input device support | ||
721 | # | ||
722 | CONFIG_INPUT=y | ||
723 | CONFIG_INPUT_FF_MEMLESS=m | ||
724 | # CONFIG_INPUT_POLLDEV is not set | ||
725 | |||
726 | # | ||
727 | # Userland interfaces | ||
728 | # | ||
729 | CONFIG_INPUT_MOUSEDEV=y | ||
730 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
731 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
732 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
733 | # CONFIG_INPUT_JOYDEV is not set | ||
734 | # CONFIG_INPUT_EVDEV is not set | ||
735 | # CONFIG_INPUT_EVBUG is not set | ||
736 | |||
737 | # | ||
738 | # Input Device Drivers | ||
739 | # | ||
740 | CONFIG_INPUT_KEYBOARD=y | ||
741 | # CONFIG_KEYBOARD_ATKBD is not set | ||
742 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
743 | # CONFIG_KEYBOARD_LKKBD is not set | ||
744 | # CONFIG_KEYBOARD_XTKBD is not set | ||
745 | # CONFIG_KEYBOARD_NEWTON is not set | ||
746 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
747 | # CONFIG_KEYBOARD_SH_KEYSC is not set | ||
748 | # CONFIG_INPUT_MOUSE is not set | ||
749 | # CONFIG_INPUT_JOYSTICK is not set | ||
750 | # CONFIG_INPUT_TABLET is not set | ||
751 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
752 | # CONFIG_INPUT_MISC is not set | ||
753 | |||
754 | # | ||
755 | # Hardware I/O ports | ||
756 | # | ||
757 | # CONFIG_SERIO is not set | ||
758 | # CONFIG_GAMEPORT is not set | ||
759 | |||
760 | # | ||
761 | # Character devices | ||
762 | # | ||
763 | CONFIG_VT=y | ||
764 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
765 | CONFIG_VT_CONSOLE=y | ||
766 | CONFIG_HW_CONSOLE=y | ||
767 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
768 | CONFIG_DEVKMEM=y | ||
769 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
770 | # CONFIG_NOZOMI is not set | ||
771 | |||
772 | # | ||
773 | # Serial drivers | ||
774 | # | ||
775 | # CONFIG_SERIAL_8250 is not set | ||
776 | |||
777 | # | ||
778 | # Non-8250 serial port support | ||
779 | # | ||
780 | CONFIG_SERIAL_SH_SCI=y | ||
781 | CONFIG_SERIAL_SH_SCI_NR_UARTS=6 | ||
782 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
783 | CONFIG_SERIAL_CORE=y | ||
784 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
785 | # CONFIG_SERIAL_JSM is not set | ||
786 | CONFIG_UNIX98_PTYS=y | ||
787 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
788 | CONFIG_LEGACY_PTYS=y | ||
789 | CONFIG_LEGACY_PTY_COUNT=256 | ||
790 | # CONFIG_IPMI_HANDLER is not set | ||
791 | CONFIG_HW_RANDOM=y | ||
792 | # CONFIG_R3964 is not set | ||
793 | # CONFIG_APPLICOM is not set | ||
794 | # CONFIG_RAW_DRIVER is not set | ||
795 | # CONFIG_TCG_TPM is not set | ||
796 | CONFIG_DEVPORT=y | ||
797 | CONFIG_I2C=y | ||
798 | CONFIG_I2C_BOARDINFO=y | ||
799 | # CONFIG_I2C_CHARDEV is not set | ||
800 | CONFIG_I2C_HELPER_AUTO=y | ||
801 | CONFIG_I2C_ALGOPCA=y | ||
802 | |||
803 | # | ||
804 | # I2C Hardware Bus support | ||
805 | # | ||
806 | |||
807 | # | ||
808 | # PC SMBus host controller drivers | ||
809 | # | ||
810 | # CONFIG_I2C_ALI1535 is not set | ||
811 | # CONFIG_I2C_ALI1563 is not set | ||
812 | # CONFIG_I2C_ALI15X3 is not set | ||
813 | # CONFIG_I2C_AMD756 is not set | ||
814 | # CONFIG_I2C_AMD8111 is not set | ||
815 | # CONFIG_I2C_I801 is not set | ||
816 | # CONFIG_I2C_ISCH is not set | ||
817 | # CONFIG_I2C_PIIX4 is not set | ||
818 | # CONFIG_I2C_NFORCE2 is not set | ||
819 | # CONFIG_I2C_SIS5595 is not set | ||
820 | # CONFIG_I2C_SIS630 is not set | ||
821 | # CONFIG_I2C_SIS96X is not set | ||
822 | # CONFIG_I2C_VIA is not set | ||
823 | # CONFIG_I2C_VIAPRO is not set | ||
824 | |||
825 | # | ||
826 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
827 | # | ||
828 | # CONFIG_I2C_OCORES is not set | ||
829 | # CONFIG_I2C_SH_MOBILE is not set | ||
830 | # CONFIG_I2C_SIMTEC is not set | ||
831 | |||
832 | # | ||
833 | # External I2C/SMBus adapter drivers | ||
834 | # | ||
835 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
836 | # CONFIG_I2C_TAOS_EVM is not set | ||
837 | # CONFIG_I2C_TINY_USB is not set | ||
838 | |||
839 | # | ||
840 | # Graphics adapter I2C/DDC channel drivers | ||
841 | # | ||
842 | # CONFIG_I2C_VOODOO3 is not set | ||
843 | |||
844 | # | ||
845 | # Other I2C/SMBus bus drivers | ||
846 | # | ||
847 | CONFIG_I2C_PCA_PLATFORM=y | ||
848 | # CONFIG_I2C_STUB is not set | ||
849 | |||
850 | # | ||
851 | # Miscellaneous I2C Chip support | ||
852 | # | ||
853 | # CONFIG_DS1682 is not set | ||
854 | # CONFIG_SENSORS_PCF8574 is not set | ||
855 | # CONFIG_PCF8575 is not set | ||
856 | # CONFIG_SENSORS_PCA9539 is not set | ||
857 | # CONFIG_SENSORS_PCF8591 is not set | ||
858 | # CONFIG_SENSORS_MAX6875 is not set | ||
859 | # CONFIG_SENSORS_TSL2550 is not set | ||
860 | # CONFIG_I2C_DEBUG_CORE is not set | ||
861 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
862 | # CONFIG_I2C_DEBUG_BUS is not set | ||
863 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
864 | # CONFIG_SPI is not set | ||
865 | # CONFIG_W1 is not set | ||
866 | # CONFIG_POWER_SUPPLY is not set | ||
867 | # CONFIG_HWMON is not set | ||
868 | # CONFIG_THERMAL is not set | ||
869 | # CONFIG_THERMAL_HWMON is not set | ||
870 | # CONFIG_WATCHDOG is not set | ||
871 | CONFIG_SSB_POSSIBLE=y | ||
872 | |||
873 | # | ||
874 | # Sonics Silicon Backplane | ||
875 | # | ||
876 | # CONFIG_SSB is not set | ||
877 | |||
878 | # | ||
879 | # Multifunction device drivers | ||
880 | # | ||
881 | # CONFIG_MFD_CORE is not set | ||
882 | CONFIG_MFD_SM501=y | ||
883 | # CONFIG_HTC_PASIC3 is not set | ||
884 | # CONFIG_TWL4030_CORE is not set | ||
885 | # CONFIG_MFD_TMIO is not set | ||
886 | # CONFIG_PMIC_DA903X is not set | ||
887 | # CONFIG_MFD_WM8400 is not set | ||
888 | # CONFIG_MFD_WM8350_I2C is not set | ||
889 | # CONFIG_MFD_PCF50633 is not set | ||
890 | # CONFIG_REGULATOR is not set | ||
891 | |||
892 | # | ||
893 | # Multimedia devices | ||
894 | # | ||
895 | |||
896 | # | ||
897 | # Multimedia core support | ||
898 | # | ||
899 | # CONFIG_VIDEO_DEV is not set | ||
900 | # CONFIG_DVB_CORE is not set | ||
901 | # CONFIG_VIDEO_MEDIA is not set | ||
902 | |||
903 | # | ||
904 | # Multimedia drivers | ||
905 | # | ||
906 | # CONFIG_DAB is not set | ||
907 | |||
908 | # | ||
909 | # Graphics support | ||
910 | # | ||
911 | # CONFIG_DRM is not set | ||
912 | # CONFIG_VGASTATE is not set | ||
913 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
914 | CONFIG_FB=y | ||
915 | # CONFIG_FIRMWARE_EDID is not set | ||
916 | # CONFIG_FB_DDC is not set | ||
917 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
918 | CONFIG_FB_CFB_FILLRECT=y | ||
919 | CONFIG_FB_CFB_COPYAREA=y | ||
920 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
921 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
922 | CONFIG_FB_SYS_FILLRECT=m | ||
923 | CONFIG_FB_SYS_COPYAREA=m | ||
924 | CONFIG_FB_SYS_IMAGEBLIT=m | ||
925 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
926 | CONFIG_FB_SYS_FOPS=m | ||
927 | CONFIG_FB_DEFERRED_IO=y | ||
928 | # CONFIG_FB_SVGALIB is not set | ||
929 | # CONFIG_FB_MACMODES is not set | ||
930 | # CONFIG_FB_BACKLIGHT is not set | ||
931 | # CONFIG_FB_MODE_HELPERS is not set | ||
932 | # CONFIG_FB_TILEBLITTING is not set | ||
933 | |||
934 | # | ||
935 | # Frame buffer hardware drivers | ||
936 | # | ||
937 | # CONFIG_FB_CIRRUS is not set | ||
938 | # CONFIG_FB_PM2 is not set | ||
939 | # CONFIG_FB_CYBER2000 is not set | ||
940 | # CONFIG_FB_ASILIANT is not set | ||
941 | # CONFIG_FB_IMSTT is not set | ||
942 | # CONFIG_FB_S1D13XXX is not set | ||
943 | # CONFIG_FB_NVIDIA is not set | ||
944 | # CONFIG_FB_RIVA is not set | ||
945 | # CONFIG_FB_MATROX is not set | ||
946 | # CONFIG_FB_RADEON is not set | ||
947 | # CONFIG_FB_ATY128 is not set | ||
948 | # CONFIG_FB_ATY is not set | ||
949 | # CONFIG_FB_S3 is not set | ||
950 | # CONFIG_FB_SAVAGE is not set | ||
951 | # CONFIG_FB_SIS is not set | ||
952 | # CONFIG_FB_VIA is not set | ||
953 | # CONFIG_FB_NEOMAGIC is not set | ||
954 | # CONFIG_FB_KYRO is not set | ||
955 | # CONFIG_FB_3DFX is not set | ||
956 | # CONFIG_FB_VOODOO1 is not set | ||
957 | # CONFIG_FB_VT8623 is not set | ||
958 | # CONFIG_FB_TRIDENT is not set | ||
959 | # CONFIG_FB_ARK is not set | ||
960 | # CONFIG_FB_PM3 is not set | ||
961 | # CONFIG_FB_CARMINE is not set | ||
962 | CONFIG_FB_SH_MOBILE_LCDC=m | ||
963 | CONFIG_FB_SM501=y | ||
964 | # CONFIG_FB_VIRTUAL is not set | ||
965 | # CONFIG_FB_METRONOME is not set | ||
966 | # CONFIG_FB_MB862XX is not set | ||
967 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
968 | |||
969 | # | ||
970 | # Display device support | ||
971 | # | ||
972 | # CONFIG_DISPLAY_SUPPORT is not set | ||
973 | |||
974 | # | ||
975 | # Console display driver support | ||
976 | # | ||
977 | CONFIG_DUMMY_CONSOLE=y | ||
978 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
979 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
980 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
981 | # CONFIG_FONTS is not set | ||
982 | CONFIG_FONT_8x8=y | ||
983 | CONFIG_FONT_8x16=y | ||
984 | CONFIG_LOGO=y | ||
985 | # CONFIG_LOGO_LINUX_MONO is not set | ||
986 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
987 | CONFIG_LOGO_LINUX_CLUT224=y | ||
988 | # CONFIG_LOGO_SUPERH_MONO is not set | ||
989 | # CONFIG_LOGO_SUPERH_VGA16 is not set | ||
990 | # CONFIG_LOGO_SUPERH_CLUT224 is not set | ||
991 | # CONFIG_SOUND is not set | ||
992 | CONFIG_HID_SUPPORT=y | ||
993 | CONFIG_HID=y | ||
994 | # CONFIG_HID_DEBUG is not set | ||
995 | # CONFIG_HIDRAW is not set | ||
996 | |||
997 | # | ||
998 | # USB Input Devices | ||
999 | # | ||
1000 | CONFIG_USB_HID=y | ||
1001 | # CONFIG_HID_PID is not set | ||
1002 | # CONFIG_USB_HIDDEV is not set | ||
1003 | |||
1004 | # | ||
1005 | # Special HID drivers | ||
1006 | # | ||
1007 | CONFIG_HID_COMPAT=y | ||
1008 | CONFIG_HID_A4TECH=y | ||
1009 | CONFIG_HID_APPLE=y | ||
1010 | CONFIG_HID_BELKIN=y | ||
1011 | CONFIG_HID_CHERRY=y | ||
1012 | CONFIG_HID_CHICONY=y | ||
1013 | CONFIG_HID_CYPRESS=y | ||
1014 | CONFIG_HID_EZKEY=y | ||
1015 | CONFIG_HID_GYRATION=y | ||
1016 | CONFIG_HID_LOGITECH=y | ||
1017 | # CONFIG_LOGITECH_FF is not set | ||
1018 | # CONFIG_LOGIRUMBLEPAD2_FF is not set | ||
1019 | CONFIG_HID_MICROSOFT=y | ||
1020 | CONFIG_HID_MONTEREY=y | ||
1021 | # CONFIG_HID_NTRIG is not set | ||
1022 | CONFIG_HID_PANTHERLORD=y | ||
1023 | # CONFIG_PANTHERLORD_FF is not set | ||
1024 | CONFIG_HID_PETALYNX=y | ||
1025 | CONFIG_HID_SAMSUNG=y | ||
1026 | CONFIG_HID_SONY=y | ||
1027 | CONFIG_HID_SUNPLUS=y | ||
1028 | # CONFIG_GREENASIA_FF is not set | ||
1029 | # CONFIG_HID_TOPSEED is not set | ||
1030 | CONFIG_THRUSTMASTER_FF=m | ||
1031 | CONFIG_ZEROPLUS_FF=m | ||
1032 | CONFIG_USB_SUPPORT=y | ||
1033 | CONFIG_USB_ARCH_HAS_HCD=y | ||
1034 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
1035 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
1036 | CONFIG_USB=y | ||
1037 | # CONFIG_USB_DEBUG is not set | ||
1038 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
1039 | |||
1040 | # | ||
1041 | # Miscellaneous USB options | ||
1042 | # | ||
1043 | CONFIG_USB_DEVICEFS=y | ||
1044 | CONFIG_USB_DEVICE_CLASS=y | ||
1045 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
1046 | # CONFIG_USB_OTG is not set | ||
1047 | # CONFIG_USB_OTG_WHITELIST is not set | ||
1048 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
1049 | CONFIG_USB_MON=y | ||
1050 | # CONFIG_USB_WUSB is not set | ||
1051 | # CONFIG_USB_WUSB_CBAF is not set | ||
1052 | |||
1053 | # | ||
1054 | # USB Host Controller Drivers | ||
1055 | # | ||
1056 | # CONFIG_USB_C67X00_HCD is not set | ||
1057 | CONFIG_USB_EHCI_HCD=m | ||
1058 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
1059 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
1060 | # CONFIG_USB_OXU210HP_HCD is not set | ||
1061 | # CONFIG_USB_ISP116X_HCD is not set | ||
1062 | # CONFIG_USB_ISP1760_HCD is not set | ||
1063 | CONFIG_USB_OHCI_HCD=m | ||
1064 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
1065 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
1066 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
1067 | # CONFIG_USB_UHCI_HCD is not set | ||
1068 | # CONFIG_USB_SL811_HCD is not set | ||
1069 | CONFIG_USB_R8A66597_HCD=y | ||
1070 | # CONFIG_USB_WHCI_HCD is not set | ||
1071 | # CONFIG_USB_HWA_HCD is not set | ||
1072 | |||
1073 | # | ||
1074 | # USB Device Class drivers | ||
1075 | # | ||
1076 | # CONFIG_USB_ACM is not set | ||
1077 | # CONFIG_USB_PRINTER is not set | ||
1078 | # CONFIG_USB_WDM is not set | ||
1079 | # CONFIG_USB_TMC is not set | ||
1080 | |||
1081 | # | ||
1082 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; | ||
1083 | # | ||
1084 | |||
1085 | # | ||
1086 | # see USB_STORAGE Help for more information | ||
1087 | # | ||
1088 | CONFIG_USB_STORAGE=y | ||
1089 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
1090 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
1091 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
1092 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
1093 | # CONFIG_USB_STORAGE_USBAT is not set | ||
1094 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
1095 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
1096 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
1097 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
1098 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
1099 | # CONFIG_USB_STORAGE_KARMA is not set | ||
1100 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
1101 | # CONFIG_USB_LIBUSUAL is not set | ||
1102 | |||
1103 | # | ||
1104 | # USB Imaging devices | ||
1105 | # | ||
1106 | # CONFIG_USB_MDC800 is not set | ||
1107 | # CONFIG_USB_MICROTEK is not set | ||
1108 | |||
1109 | # | ||
1110 | # USB port drivers | ||
1111 | # | ||
1112 | # CONFIG_USB_SERIAL is not set | ||
1113 | |||
1114 | # | ||
1115 | # USB Miscellaneous drivers | ||
1116 | # | ||
1117 | # CONFIG_USB_EMI62 is not set | ||
1118 | # CONFIG_USB_EMI26 is not set | ||
1119 | # CONFIG_USB_ADUTUX is not set | ||
1120 | # CONFIG_USB_SEVSEG is not set | ||
1121 | # CONFIG_USB_RIO500 is not set | ||
1122 | # CONFIG_USB_LEGOTOWER is not set | ||
1123 | # CONFIG_USB_LCD is not set | ||
1124 | # CONFIG_USB_BERRY_CHARGE is not set | ||
1125 | # CONFIG_USB_LED is not set | ||
1126 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1127 | # CONFIG_USB_CYTHERM is not set | ||
1128 | # CONFIG_USB_PHIDGET is not set | ||
1129 | # CONFIG_USB_IDMOUSE is not set | ||
1130 | # CONFIG_USB_FTDI_ELAN is not set | ||
1131 | # CONFIG_USB_APPLEDISPLAY is not set | ||
1132 | # CONFIG_USB_SISUSBVGA is not set | ||
1133 | # CONFIG_USB_LD is not set | ||
1134 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1135 | # CONFIG_USB_IOWARRIOR is not set | ||
1136 | CONFIG_USB_TEST=m | ||
1137 | # CONFIG_USB_ISIGHTFW is not set | ||
1138 | # CONFIG_USB_VST is not set | ||
1139 | # CONFIG_USB_GADGET is not set | ||
1140 | |||
1141 | # | ||
1142 | # OTG and related infrastructure | ||
1143 | # | ||
1144 | # CONFIG_UWB is not set | ||
1145 | # CONFIG_MMC is not set | ||
1146 | # CONFIG_MEMSTICK is not set | ||
1147 | # CONFIG_NEW_LEDS is not set | ||
1148 | # CONFIG_ACCESSIBILITY is not set | ||
1149 | # CONFIG_INFINIBAND is not set | ||
1150 | CONFIG_RTC_LIB=y | ||
1151 | CONFIG_RTC_CLASS=y | ||
1152 | CONFIG_RTC_HCTOSYS=y | ||
1153 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
1154 | # CONFIG_RTC_DEBUG is not set | ||
1155 | |||
1156 | # | ||
1157 | # RTC interfaces | ||
1158 | # | ||
1159 | CONFIG_RTC_INTF_SYSFS=y | ||
1160 | CONFIG_RTC_INTF_PROC=y | ||
1161 | CONFIG_RTC_INTF_DEV=y | ||
1162 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
1163 | # CONFIG_RTC_DRV_TEST is not set | ||
1164 | |||
1165 | # | ||
1166 | # I2C RTC drivers | ||
1167 | # | ||
1168 | # CONFIG_RTC_DRV_DS1307 is not set | ||
1169 | # CONFIG_RTC_DRV_DS1374 is not set | ||
1170 | # CONFIG_RTC_DRV_DS1672 is not set | ||
1171 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
1172 | CONFIG_RTC_DRV_RS5C372=y | ||
1173 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
1174 | # CONFIG_RTC_DRV_X1205 is not set | ||
1175 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
1176 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
1177 | # CONFIG_RTC_DRV_M41T80 is not set | ||
1178 | # CONFIG_RTC_DRV_S35390A is not set | ||
1179 | # CONFIG_RTC_DRV_FM3130 is not set | ||
1180 | # CONFIG_RTC_DRV_RX8581 is not set | ||
1181 | |||
1182 | # | ||
1183 | # SPI RTC drivers | ||
1184 | # | ||
1185 | |||
1186 | # | ||
1187 | # Platform RTC drivers | ||
1188 | # | ||
1189 | # CONFIG_RTC_DRV_DS1286 is not set | ||
1190 | # CONFIG_RTC_DRV_DS1511 is not set | ||
1191 | # CONFIG_RTC_DRV_DS1553 is not set | ||
1192 | # CONFIG_RTC_DRV_DS1742 is not set | ||
1193 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
1194 | # CONFIG_RTC_DRV_M48T86 is not set | ||
1195 | # CONFIG_RTC_DRV_M48T35 is not set | ||
1196 | # CONFIG_RTC_DRV_M48T59 is not set | ||
1197 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
1198 | # CONFIG_RTC_DRV_V3020 is not set | ||
1199 | |||
1200 | # | ||
1201 | # on-CPU RTC drivers | ||
1202 | # | ||
1203 | # CONFIG_RTC_DRV_SH is not set | ||
1204 | # CONFIG_DMADEVICES is not set | ||
1205 | # CONFIG_UIO is not set | ||
1206 | # CONFIG_STAGING is not set | ||
1207 | |||
1208 | # | ||
1209 | # File systems | ||
1210 | # | ||
1211 | CONFIG_EXT2_FS=y | ||
1212 | # CONFIG_EXT2_FS_XATTR is not set | ||
1213 | # CONFIG_EXT2_FS_XIP is not set | ||
1214 | CONFIG_EXT3_FS=y | ||
1215 | CONFIG_EXT3_FS_XATTR=y | ||
1216 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1217 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1218 | # CONFIG_EXT4_FS is not set | ||
1219 | CONFIG_JBD=y | ||
1220 | CONFIG_FS_MBCACHE=y | ||
1221 | # CONFIG_REISERFS_FS is not set | ||
1222 | # CONFIG_JFS_FS is not set | ||
1223 | CONFIG_FS_POSIX_ACL=y | ||
1224 | CONFIG_FILE_LOCKING=y | ||
1225 | # CONFIG_XFS_FS is not set | ||
1226 | # CONFIG_OCFS2_FS is not set | ||
1227 | # CONFIG_BTRFS_FS is not set | ||
1228 | CONFIG_DNOTIFY=y | ||
1229 | CONFIG_INOTIFY=y | ||
1230 | CONFIG_INOTIFY_USER=y | ||
1231 | # CONFIG_QUOTA is not set | ||
1232 | # CONFIG_AUTOFS_FS is not set | ||
1233 | # CONFIG_AUTOFS4_FS is not set | ||
1234 | # CONFIG_FUSE_FS is not set | ||
1235 | |||
1236 | # | ||
1237 | # CD-ROM/DVD Filesystems | ||
1238 | # | ||
1239 | # CONFIG_ISO9660_FS is not set | ||
1240 | # CONFIG_UDF_FS is not set | ||
1241 | |||
1242 | # | ||
1243 | # DOS/FAT/NT Filesystems | ||
1244 | # | ||
1245 | CONFIG_FAT_FS=y | ||
1246 | CONFIG_MSDOS_FS=y | ||
1247 | CONFIG_VFAT_FS=y | ||
1248 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1249 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1250 | CONFIG_NTFS_FS=y | ||
1251 | # CONFIG_NTFS_DEBUG is not set | ||
1252 | CONFIG_NTFS_RW=y | ||
1253 | |||
1254 | # | ||
1255 | # Pseudo filesystems | ||
1256 | # | ||
1257 | CONFIG_PROC_FS=y | ||
1258 | CONFIG_PROC_KCORE=y | ||
1259 | CONFIG_PROC_SYSCTL=y | ||
1260 | CONFIG_PROC_PAGE_MONITOR=y | ||
1261 | CONFIG_SYSFS=y | ||
1262 | CONFIG_TMPFS=y | ||
1263 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1264 | # CONFIG_HUGETLBFS is not set | ||
1265 | # CONFIG_HUGETLB_PAGE is not set | ||
1266 | # CONFIG_CONFIGFS_FS is not set | ||
1267 | CONFIG_MISC_FILESYSTEMS=y | ||
1268 | # CONFIG_ADFS_FS is not set | ||
1269 | # CONFIG_AFFS_FS is not set | ||
1270 | # CONFIG_HFS_FS is not set | ||
1271 | # CONFIG_HFSPLUS_FS is not set | ||
1272 | # CONFIG_BEFS_FS is not set | ||
1273 | # CONFIG_BFS_FS is not set | ||
1274 | # CONFIG_EFS_FS is not set | ||
1275 | # CONFIG_JFFS2_FS is not set | ||
1276 | # CONFIG_CRAMFS is not set | ||
1277 | # CONFIG_SQUASHFS is not set | ||
1278 | # CONFIG_VXFS_FS is not set | ||
1279 | CONFIG_MINIX_FS=y | ||
1280 | # CONFIG_OMFS_FS is not set | ||
1281 | # CONFIG_HPFS_FS is not set | ||
1282 | # CONFIG_QNX4FS_FS is not set | ||
1283 | # CONFIG_ROMFS_FS is not set | ||
1284 | # CONFIG_SYSV_FS is not set | ||
1285 | # CONFIG_UFS_FS is not set | ||
1286 | CONFIG_NETWORK_FILESYSTEMS=y | ||
1287 | CONFIG_NFS_FS=y | ||
1288 | CONFIG_NFS_V3=y | ||
1289 | # CONFIG_NFS_V3_ACL is not set | ||
1290 | CONFIG_NFS_V4=y | ||
1291 | CONFIG_ROOT_NFS=y | ||
1292 | CONFIG_NFSD=y | ||
1293 | CONFIG_NFSD_V3=y | ||
1294 | # CONFIG_NFSD_V3_ACL is not set | ||
1295 | CONFIG_NFSD_V4=y | ||
1296 | CONFIG_LOCKD=y | ||
1297 | CONFIG_LOCKD_V4=y | ||
1298 | CONFIG_EXPORTFS=y | ||
1299 | CONFIG_NFS_COMMON=y | ||
1300 | CONFIG_SUNRPC=y | ||
1301 | CONFIG_SUNRPC_GSS=y | ||
1302 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
1303 | CONFIG_RPCSEC_GSS_KRB5=y | ||
1304 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1305 | # CONFIG_SMB_FS is not set | ||
1306 | # CONFIG_CIFS is not set | ||
1307 | # CONFIG_NCP_FS is not set | ||
1308 | # CONFIG_CODA_FS is not set | ||
1309 | # CONFIG_AFS_FS is not set | ||
1310 | |||
1311 | # | ||
1312 | # Partition Types | ||
1313 | # | ||
1314 | # CONFIG_PARTITION_ADVANCED is not set | ||
1315 | CONFIG_MSDOS_PARTITION=y | ||
1316 | CONFIG_NLS=y | ||
1317 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1318 | CONFIG_NLS_CODEPAGE_437=y | ||
1319 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1320 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1321 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1322 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1323 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1324 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1325 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1326 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1327 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1328 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1329 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1330 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1331 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1332 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1333 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1334 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1335 | CONFIG_NLS_CODEPAGE_932=y | ||
1336 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1337 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1338 | # CONFIG_NLS_ISO8859_8 is not set | ||
1339 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1340 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1341 | # CONFIG_NLS_ASCII is not set | ||
1342 | CONFIG_NLS_ISO8859_1=y | ||
1343 | # CONFIG_NLS_ISO8859_2 is not set | ||
1344 | # CONFIG_NLS_ISO8859_3 is not set | ||
1345 | # CONFIG_NLS_ISO8859_4 is not set | ||
1346 | # CONFIG_NLS_ISO8859_5 is not set | ||
1347 | # CONFIG_NLS_ISO8859_6 is not set | ||
1348 | # CONFIG_NLS_ISO8859_7 is not set | ||
1349 | # CONFIG_NLS_ISO8859_9 is not set | ||
1350 | # CONFIG_NLS_ISO8859_13 is not set | ||
1351 | # CONFIG_NLS_ISO8859_14 is not set | ||
1352 | # CONFIG_NLS_ISO8859_15 is not set | ||
1353 | # CONFIG_NLS_KOI8_R is not set | ||
1354 | # CONFIG_NLS_KOI8_U is not set | ||
1355 | # CONFIG_NLS_UTF8 is not set | ||
1356 | # CONFIG_DLM is not set | ||
1357 | |||
1358 | # | ||
1359 | # Kernel hacking | ||
1360 | # | ||
1361 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
1362 | # CONFIG_PRINTK_TIME is not set | ||
1363 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
1364 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
1365 | CONFIG_FRAME_WARN=1024 | ||
1366 | # CONFIG_MAGIC_SYSRQ is not set | ||
1367 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1368 | # CONFIG_DEBUG_FS is not set | ||
1369 | # CONFIG_HEADERS_CHECK is not set | ||
1370 | CONFIG_DEBUG_KERNEL=y | ||
1371 | # CONFIG_DEBUG_SHIRQ is not set | ||
1372 | CONFIG_DETECT_SOFTLOCKUP=y | ||
1373 | # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set | ||
1374 | CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 | ||
1375 | CONFIG_SCHED_DEBUG=y | ||
1376 | # CONFIG_SCHEDSTATS is not set | ||
1377 | # CONFIG_TIMER_STATS is not set | ||
1378 | # CONFIG_DEBUG_OBJECTS is not set | ||
1379 | # CONFIG_DEBUG_SLAB is not set | ||
1380 | CONFIG_DEBUG_PREEMPT=y | ||
1381 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1382 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1383 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1384 | # CONFIG_DEBUG_MUTEXES is not set | ||
1385 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
1386 | # CONFIG_PROVE_LOCKING is not set | ||
1387 | # CONFIG_LOCK_STAT is not set | ||
1388 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1389 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1390 | # CONFIG_DEBUG_KOBJECT is not set | ||
1391 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
1392 | # CONFIG_DEBUG_INFO is not set | ||
1393 | # CONFIG_DEBUG_VM is not set | ||
1394 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
1395 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1396 | # CONFIG_DEBUG_LIST is not set | ||
1397 | # CONFIG_DEBUG_SG is not set | ||
1398 | # CONFIG_DEBUG_NOTIFIERS is not set | ||
1399 | # CONFIG_FRAME_POINTER is not set | ||
1400 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1401 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1402 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
1403 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
1404 | # CONFIG_FAULT_INJECTION is not set | ||
1405 | # CONFIG_LATENCYTOP is not set | ||
1406 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
1407 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1408 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
1409 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
1410 | |||
1411 | # | ||
1412 | # Tracers | ||
1413 | # | ||
1414 | # CONFIG_FUNCTION_TRACER is not set | ||
1415 | # CONFIG_IRQSOFF_TRACER is not set | ||
1416 | # CONFIG_PREEMPT_TRACER is not set | ||
1417 | # CONFIG_SCHED_TRACER is not set | ||
1418 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1419 | # CONFIG_BOOT_TRACER is not set | ||
1420 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
1421 | # CONFIG_STACK_TRACER is not set | ||
1422 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1423 | # CONFIG_SAMPLES is not set | ||
1424 | CONFIG_HAVE_ARCH_KGDB=y | ||
1425 | # CONFIG_KGDB is not set | ||
1426 | # CONFIG_SH_STANDARD_BIOS is not set | ||
1427 | # CONFIG_EARLY_SCIF_CONSOLE is not set | ||
1428 | # CONFIG_DEBUG_BOOTMEM is not set | ||
1429 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
1430 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
1431 | # CONFIG_4KSTACKS is not set | ||
1432 | # CONFIG_IRQSTACKS is not set | ||
1433 | # CONFIG_DUMP_CODE is not set | ||
1434 | # CONFIG_SH_NO_BSS_INIT is not set | ||
1435 | # CONFIG_MORE_COMPILE_OPTIONS is not set | ||
1436 | |||
1437 | # | ||
1438 | # Security options | ||
1439 | # | ||
1440 | # CONFIG_KEYS is not set | ||
1441 | # CONFIG_SECURITY is not set | ||
1442 | # CONFIG_SECURITYFS is not set | ||
1443 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
1444 | CONFIG_CRYPTO=y | ||
1445 | |||
1446 | # | ||
1447 | # Crypto core or helper | ||
1448 | # | ||
1449 | # CONFIG_CRYPTO_FIPS is not set | ||
1450 | CONFIG_CRYPTO_ALGAPI=y | ||
1451 | CONFIG_CRYPTO_ALGAPI2=y | ||
1452 | CONFIG_CRYPTO_AEAD2=y | ||
1453 | CONFIG_CRYPTO_BLKCIPHER=y | ||
1454 | CONFIG_CRYPTO_BLKCIPHER2=y | ||
1455 | CONFIG_CRYPTO_HASH=y | ||
1456 | CONFIG_CRYPTO_HASH2=y | ||
1457 | CONFIG_CRYPTO_RNG2=y | ||
1458 | CONFIG_CRYPTO_MANAGER=y | ||
1459 | CONFIG_CRYPTO_MANAGER2=y | ||
1460 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1461 | # CONFIG_CRYPTO_NULL is not set | ||
1462 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1463 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1464 | # CONFIG_CRYPTO_TEST is not set | ||
1465 | |||
1466 | # | ||
1467 | # Authenticated Encryption with Associated Data | ||
1468 | # | ||
1469 | # CONFIG_CRYPTO_CCM is not set | ||
1470 | # CONFIG_CRYPTO_GCM is not set | ||
1471 | # CONFIG_CRYPTO_SEQIV is not set | ||
1472 | |||
1473 | # | ||
1474 | # Block modes | ||
1475 | # | ||
1476 | CONFIG_CRYPTO_CBC=y | ||
1477 | # CONFIG_CRYPTO_CTR is not set | ||
1478 | # CONFIG_CRYPTO_CTS is not set | ||
1479 | # CONFIG_CRYPTO_ECB is not set | ||
1480 | # CONFIG_CRYPTO_LRW is not set | ||
1481 | # CONFIG_CRYPTO_PCBC is not set | ||
1482 | # CONFIG_CRYPTO_XTS is not set | ||
1483 | |||
1484 | # | ||
1485 | # Hash modes | ||
1486 | # | ||
1487 | CONFIG_CRYPTO_HMAC=y | ||
1488 | # CONFIG_CRYPTO_XCBC is not set | ||
1489 | |||
1490 | # | ||
1491 | # Digest | ||
1492 | # | ||
1493 | # CONFIG_CRYPTO_CRC32C is not set | ||
1494 | # CONFIG_CRYPTO_MD4 is not set | ||
1495 | CONFIG_CRYPTO_MD5=y | ||
1496 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1497 | # CONFIG_CRYPTO_RMD128 is not set | ||
1498 | # CONFIG_CRYPTO_RMD160 is not set | ||
1499 | # CONFIG_CRYPTO_RMD256 is not set | ||
1500 | # CONFIG_CRYPTO_RMD320 is not set | ||
1501 | # CONFIG_CRYPTO_SHA1 is not set | ||
1502 | # CONFIG_CRYPTO_SHA256 is not set | ||
1503 | # CONFIG_CRYPTO_SHA512 is not set | ||
1504 | # CONFIG_CRYPTO_TGR192 is not set | ||
1505 | # CONFIG_CRYPTO_WP512 is not set | ||
1506 | |||
1507 | # | ||
1508 | # Ciphers | ||
1509 | # | ||
1510 | # CONFIG_CRYPTO_AES is not set | ||
1511 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1512 | # CONFIG_CRYPTO_ARC4 is not set | ||
1513 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1514 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1515 | # CONFIG_CRYPTO_CAST5 is not set | ||
1516 | # CONFIG_CRYPTO_CAST6 is not set | ||
1517 | CONFIG_CRYPTO_DES=y | ||
1518 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1519 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1520 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1521 | # CONFIG_CRYPTO_SEED is not set | ||
1522 | # CONFIG_CRYPTO_SERPENT is not set | ||
1523 | # CONFIG_CRYPTO_TEA is not set | ||
1524 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1525 | |||
1526 | # | ||
1527 | # Compression | ||
1528 | # | ||
1529 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1530 | # CONFIG_CRYPTO_LZO is not set | ||
1531 | |||
1532 | # | ||
1533 | # Random Number Generation | ||
1534 | # | ||
1535 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1536 | # CONFIG_CRYPTO_HW is not set | ||
1537 | |||
1538 | # | ||
1539 | # Library routines | ||
1540 | # | ||
1541 | CONFIG_BITREVERSE=y | ||
1542 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
1543 | # CONFIG_CRC_CCITT is not set | ||
1544 | # CONFIG_CRC16 is not set | ||
1545 | # CONFIG_CRC_T10DIF is not set | ||
1546 | # CONFIG_CRC_ITU_T is not set | ||
1547 | CONFIG_CRC32=y | ||
1548 | # CONFIG_CRC7 is not set | ||
1549 | # CONFIG_LIBCRC32C is not set | ||
1550 | CONFIG_PLIST=y | ||
1551 | CONFIG_HAS_IOMEM=y | ||
1552 | CONFIG_HAS_IOPORT=y | ||
1553 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/sh/configs/urquell_defconfig b/arch/sh/configs/urquell_defconfig new file mode 100644 index 000000000000..be726c7cdf91 --- /dev/null +++ b/arch/sh/configs/urquell_defconfig | |||
@@ -0,0 +1,1332 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.29-rc4 | ||
4 | # Thu Mar 5 17:28:13 2009 | ||
5 | # | ||
6 | CONFIG_SUPERH=y | ||
7 | CONFIG_SUPERH32=y | ||
8 | CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||
9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
10 | CONFIG_GENERIC_BUG=y | ||
11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
15 | CONFIG_GENERIC_IRQ_PROBE=y | ||
16 | CONFIG_GENERIC_GPIO=y | ||
17 | CONFIG_GENERIC_TIME=y | ||
18 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
19 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set | ||
20 | # CONFIG_ARCH_HIBERNATION_POSSIBLE is not set | ||
21 | CONFIG_SYS_SUPPORTS_NUMA=y | ||
22 | CONFIG_STACKTRACE_SUPPORT=y | ||
23 | CONFIG_LOCKDEP_SUPPORT=y | ||
24 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
25 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
26 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
27 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
29 | |||
30 | # | ||
31 | # General setup | ||
32 | # | ||
33 | CONFIG_EXPERIMENTAL=y | ||
34 | CONFIG_BROKEN_ON_SMP=y | ||
35 | CONFIG_LOCK_KERNEL=y | ||
36 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
37 | CONFIG_LOCALVERSION="" | ||
38 | CONFIG_LOCALVERSION_AUTO=y | ||
39 | CONFIG_SWAP=y | ||
40 | CONFIG_SYSVIPC=y | ||
41 | CONFIG_SYSVIPC_SYSCTL=y | ||
42 | # CONFIG_POSIX_MQUEUE is not set | ||
43 | CONFIG_BSD_PROCESS_ACCT=y | ||
44 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | ||
45 | # CONFIG_TASKSTATS is not set | ||
46 | # CONFIG_AUDIT is not set | ||
47 | |||
48 | # | ||
49 | # RCU Subsystem | ||
50 | # | ||
51 | CONFIG_CLASSIC_RCU=y | ||
52 | # CONFIG_TREE_RCU is not set | ||
53 | # CONFIG_PREEMPT_RCU is not set | ||
54 | # CONFIG_TREE_RCU_TRACE is not set | ||
55 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
56 | CONFIG_IKCONFIG=y | ||
57 | CONFIG_IKCONFIG_PROC=y | ||
58 | CONFIG_LOG_BUF_SHIFT=14 | ||
59 | CONFIG_GROUP_SCHED=y | ||
60 | CONFIG_FAIR_GROUP_SCHED=y | ||
61 | # CONFIG_RT_GROUP_SCHED is not set | ||
62 | CONFIG_USER_SCHED=y | ||
63 | # CONFIG_CGROUP_SCHED is not set | ||
64 | # CONFIG_CGROUPS is not set | ||
65 | CONFIG_SYSFS_DEPRECATED=y | ||
66 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
67 | # CONFIG_RELAY is not set | ||
68 | # CONFIG_NAMESPACES is not set | ||
69 | # CONFIG_BLK_DEV_INITRD is not set | ||
70 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
71 | CONFIG_SYSCTL=y | ||
72 | CONFIG_EMBEDDED=y | ||
73 | CONFIG_UID16=y | ||
74 | CONFIG_SYSCTL_SYSCALL=y | ||
75 | CONFIG_KALLSYMS=y | ||
76 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
77 | CONFIG_HOTPLUG=y | ||
78 | CONFIG_PRINTK=y | ||
79 | CONFIG_BUG=y | ||
80 | CONFIG_ELF_CORE=y | ||
81 | CONFIG_COMPAT_BRK=y | ||
82 | CONFIG_BASE_FULL=y | ||
83 | CONFIG_FUTEX=y | ||
84 | CONFIG_ANON_INODES=y | ||
85 | CONFIG_EPOLL=y | ||
86 | CONFIG_SIGNALFD=y | ||
87 | CONFIG_TIMERFD=y | ||
88 | CONFIG_EVENTFD=y | ||
89 | CONFIG_SHMEM=y | ||
90 | CONFIG_AIO=y | ||
91 | CONFIG_VM_EVENT_COUNTERS=y | ||
92 | CONFIG_SLAB=y | ||
93 | # CONFIG_SLUB is not set | ||
94 | # CONFIG_SLOB is not set | ||
95 | CONFIG_PROFILING=y | ||
96 | # CONFIG_OPROFILE is not set | ||
97 | CONFIG_HAVE_OPROFILE=y | ||
98 | # CONFIG_KPROBES is not set | ||
99 | CONFIG_HAVE_IOREMAP_PROT=y | ||
100 | CONFIG_HAVE_KPROBES=y | ||
101 | CONFIG_HAVE_KRETPROBES=y | ||
102 | CONFIG_HAVE_ARCH_TRACEHOOK=y | ||
103 | CONFIG_HAVE_CLK=y | ||
104 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
105 | CONFIG_SLABINFO=y | ||
106 | CONFIG_RT_MUTEXES=y | ||
107 | CONFIG_BASE_SMALL=0 | ||
108 | CONFIG_MODULES=y | ||
109 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
110 | CONFIG_MODULE_UNLOAD=y | ||
111 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
112 | # CONFIG_MODVERSIONS is not set | ||
113 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
114 | CONFIG_BLOCK=y | ||
115 | # CONFIG_LBD is not set | ||
116 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
117 | # CONFIG_BLK_DEV_BSG is not set | ||
118 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
119 | |||
120 | # | ||
121 | # IO Schedulers | ||
122 | # | ||
123 | CONFIG_IOSCHED_NOOP=y | ||
124 | CONFIG_IOSCHED_AS=y | ||
125 | CONFIG_IOSCHED_DEADLINE=y | ||
126 | CONFIG_IOSCHED_CFQ=y | ||
127 | # CONFIG_DEFAULT_AS is not set | ||
128 | # CONFIG_DEFAULT_DEADLINE is not set | ||
129 | CONFIG_DEFAULT_CFQ=y | ||
130 | # CONFIG_DEFAULT_NOOP is not set | ||
131 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
132 | # CONFIG_FREEZER is not set | ||
133 | |||
134 | # | ||
135 | # System type | ||
136 | # | ||
137 | CONFIG_CPU_SH4=y | ||
138 | CONFIG_CPU_SH4A=y | ||
139 | CONFIG_CPU_SHX3=y | ||
140 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | ||
141 | # CONFIG_CPU_SUBTYPE_SH7201 is not set | ||
142 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | ||
143 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | ||
144 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | ||
145 | # CONFIG_CPU_SUBTYPE_MXG is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | ||
147 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | ||
148 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | ||
149 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | ||
150 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | ||
151 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | ||
152 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | ||
153 | # CONFIG_CPU_SUBTYPE_SH7720 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH7721 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | ||
156 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | ||
157 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | ||
158 | # CONFIG_CPU_SUBTYPE_SH7750S is not set | ||
159 | # CONFIG_CPU_SUBTYPE_SH7751 is not set | ||
160 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | ||
161 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | ||
162 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | ||
163 | # CONFIG_CPU_SUBTYPE_SH7723 is not set | ||
164 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | ||
165 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | ||
166 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | ||
167 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | ||
168 | CONFIG_CPU_SUBTYPE_SH7786=y | ||
169 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | ||
170 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | ||
171 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | ||
172 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
173 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
174 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
175 | |||
176 | # | ||
177 | # Memory management options | ||
178 | # | ||
179 | CONFIG_QUICKLIST=y | ||
180 | CONFIG_MMU=y | ||
181 | CONFIG_PAGE_OFFSET=0x80000000 | ||
182 | CONFIG_MEMORY_START=0x08000000 | ||
183 | CONFIG_MEMORY_SIZE=0x08000000 | ||
184 | CONFIG_29BIT=y | ||
185 | # CONFIG_X2TLB is not set | ||
186 | CONFIG_VSYSCALL=y | ||
187 | # CONFIG_NUMA is not set | ||
188 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
189 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
190 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
191 | CONFIG_MAX_ACTIVE_REGIONS=1 | ||
192 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
193 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
194 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
195 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
196 | CONFIG_PAGE_SIZE_4KB=y | ||
197 | # CONFIG_PAGE_SIZE_8KB is not set | ||
198 | # CONFIG_PAGE_SIZE_16KB is not set | ||
199 | # CONFIG_PAGE_SIZE_64KB is not set | ||
200 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
201 | CONFIG_SELECT_MEMORY_MODEL=y | ||
202 | # CONFIG_FLATMEM_MANUAL is not set | ||
203 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
204 | CONFIG_SPARSEMEM_MANUAL=y | ||
205 | CONFIG_SPARSEMEM=y | ||
206 | CONFIG_HAVE_MEMORY_PRESENT=y | ||
207 | CONFIG_SPARSEMEM_STATIC=y | ||
208 | # CONFIG_MEMORY_HOTPLUG is not set | ||
209 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
210 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
211 | CONFIG_MIGRATION=y | ||
212 | # CONFIG_PHYS_ADDR_T_64BIT is not set | ||
213 | CONFIG_ZONE_DMA_FLAG=0 | ||
214 | CONFIG_NR_QUICK=2 | ||
215 | CONFIG_UNEVICTABLE_LRU=y | ||
216 | |||
217 | # | ||
218 | # Cache configuration | ||
219 | # | ||
220 | # CONFIG_SH_DIRECT_MAPPED is not set | ||
221 | CONFIG_CACHE_WRITEBACK=y | ||
222 | # CONFIG_CACHE_WRITETHROUGH is not set | ||
223 | # CONFIG_CACHE_OFF is not set | ||
224 | |||
225 | # | ||
226 | # Processor features | ||
227 | # | ||
228 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
229 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
230 | CONFIG_SH_FPU=y | ||
231 | CONFIG_SH_STORE_QUEUES=y | ||
232 | CONFIG_CPU_HAS_INTEVT=y | ||
233 | CONFIG_CPU_HAS_SR_RB=y | ||
234 | CONFIG_CPU_HAS_FPU=y | ||
235 | |||
236 | # | ||
237 | # Board support | ||
238 | # | ||
239 | CONFIG_SH_URQUELL=y | ||
240 | |||
241 | # | ||
242 | # Timer and clock configuration | ||
243 | # | ||
244 | CONFIG_SH_TMU=y | ||
245 | CONFIG_SH_TIMER_IRQ=16 | ||
246 | CONFIG_SH_PCLK_FREQ=33333333 | ||
247 | CONFIG_TICK_ONESHOT=y | ||
248 | # CONFIG_NO_HZ is not set | ||
249 | CONFIG_HIGH_RES_TIMERS=y | ||
250 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
251 | |||
252 | # | ||
253 | # CPU Frequency scaling | ||
254 | # | ||
255 | # CONFIG_CPU_FREQ is not set | ||
256 | |||
257 | # | ||
258 | # DMA support | ||
259 | # | ||
260 | # CONFIG_SH_DMA is not set | ||
261 | |||
262 | # | ||
263 | # Companion Chips | ||
264 | # | ||
265 | |||
266 | # | ||
267 | # Additional SuperH Device Drivers | ||
268 | # | ||
269 | CONFIG_HEARTBEAT=y | ||
270 | # CONFIG_PUSH_SWITCH is not set | ||
271 | |||
272 | # | ||
273 | # Kernel features | ||
274 | # | ||
275 | # CONFIG_HZ_100 is not set | ||
276 | CONFIG_HZ_250=y | ||
277 | # CONFIG_HZ_300 is not set | ||
278 | # CONFIG_HZ_1000 is not set | ||
279 | CONFIG_HZ=250 | ||
280 | CONFIG_SCHED_HRTICK=y | ||
281 | CONFIG_KEXEC=y | ||
282 | # CONFIG_CRASH_DUMP is not set | ||
283 | # CONFIG_SECCOMP is not set | ||
284 | # CONFIG_PREEMPT_NONE is not set | ||
285 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
286 | CONFIG_PREEMPT=y | ||
287 | CONFIG_GUSA=y | ||
288 | |||
289 | # | ||
290 | # Boot options | ||
291 | # | ||
292 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | ||
293 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | ||
294 | CONFIG_CMDLINE_BOOL=y | ||
295 | CONFIG_CMDLINE="console=ttySC1, 38400 earlyprintk=serial ip=on ignore_loglevel root=/dev/nfs ip=dhcp memchunk.vpu=4m" | ||
296 | |||
297 | # | ||
298 | # Bus options | ||
299 | # | ||
300 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
301 | # CONFIG_PCCARD is not set | ||
302 | |||
303 | # | ||
304 | # Executable file formats | ||
305 | # | ||
306 | CONFIG_BINFMT_ELF=y | ||
307 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
308 | # CONFIG_HAVE_AOUT is not set | ||
309 | # CONFIG_BINFMT_MISC is not set | ||
310 | |||
311 | # | ||
312 | # Power management options (EXPERIMENTAL) | ||
313 | # | ||
314 | # CONFIG_PM is not set | ||
315 | # CONFIG_CPU_IDLE is not set | ||
316 | CONFIG_NET=y | ||
317 | |||
318 | # | ||
319 | # Networking options | ||
320 | # | ||
321 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
322 | CONFIG_PACKET=y | ||
323 | # CONFIG_PACKET_MMAP is not set | ||
324 | CONFIG_UNIX=y | ||
325 | CONFIG_XFRM=y | ||
326 | # CONFIG_XFRM_USER is not set | ||
327 | # CONFIG_XFRM_SUB_POLICY is not set | ||
328 | # CONFIG_XFRM_MIGRATE is not set | ||
329 | # CONFIG_XFRM_STATISTICS is not set | ||
330 | # CONFIG_NET_KEY is not set | ||
331 | CONFIG_INET=y | ||
332 | # CONFIG_IP_MULTICAST is not set | ||
333 | CONFIG_IP_ADVANCED_ROUTER=y | ||
334 | CONFIG_ASK_IP_FIB_HASH=y | ||
335 | # CONFIG_IP_FIB_TRIE is not set | ||
336 | CONFIG_IP_FIB_HASH=y | ||
337 | # CONFIG_IP_MULTIPLE_TABLES is not set | ||
338 | # CONFIG_IP_ROUTE_MULTIPATH is not set | ||
339 | # CONFIG_IP_ROUTE_VERBOSE is not set | ||
340 | CONFIG_IP_PNP=y | ||
341 | CONFIG_IP_PNP_DHCP=y | ||
342 | # CONFIG_IP_PNP_BOOTP is not set | ||
343 | # CONFIG_IP_PNP_RARP is not set | ||
344 | # CONFIG_NET_IPIP is not set | ||
345 | # CONFIG_NET_IPGRE is not set | ||
346 | # CONFIG_ARPD is not set | ||
347 | # CONFIG_SYN_COOKIES is not set | ||
348 | # CONFIG_INET_AH is not set | ||
349 | # CONFIG_INET_ESP is not set | ||
350 | # CONFIG_INET_IPCOMP is not set | ||
351 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
352 | # CONFIG_INET_TUNNEL is not set | ||
353 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
354 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
355 | CONFIG_INET_XFRM_MODE_BEET=y | ||
356 | # CONFIG_INET_LRO is not set | ||
357 | CONFIG_INET_DIAG=y | ||
358 | CONFIG_INET_TCP_DIAG=y | ||
359 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
360 | CONFIG_TCP_CONG_CUBIC=y | ||
361 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
362 | # CONFIG_TCP_MD5SIG is not set | ||
363 | # CONFIG_IPV6 is not set | ||
364 | # CONFIG_NETWORK_SECMARK is not set | ||
365 | # CONFIG_NETFILTER is not set | ||
366 | # CONFIG_IP_DCCP is not set | ||
367 | # CONFIG_IP_SCTP is not set | ||
368 | # CONFIG_TIPC is not set | ||
369 | # CONFIG_ATM is not set | ||
370 | # CONFIG_BRIDGE is not set | ||
371 | # CONFIG_NET_DSA is not set | ||
372 | # CONFIG_VLAN_8021Q is not set | ||
373 | # CONFIG_DECNET is not set | ||
374 | # CONFIG_LLC2 is not set | ||
375 | # CONFIG_IPX is not set | ||
376 | # CONFIG_ATALK is not set | ||
377 | # CONFIG_X25 is not set | ||
378 | # CONFIG_LAPB is not set | ||
379 | # CONFIG_ECONET is not set | ||
380 | # CONFIG_WAN_ROUTER is not set | ||
381 | # CONFIG_NET_SCHED is not set | ||
382 | # CONFIG_DCB is not set | ||
383 | |||
384 | # | ||
385 | # Network testing | ||
386 | # | ||
387 | # CONFIG_NET_PKTGEN is not set | ||
388 | # CONFIG_HAMRADIO is not set | ||
389 | # CONFIG_CAN is not set | ||
390 | # CONFIG_IRDA is not set | ||
391 | # CONFIG_BT is not set | ||
392 | # CONFIG_AF_RXRPC is not set | ||
393 | # CONFIG_PHONET is not set | ||
394 | CONFIG_WIRELESS=y | ||
395 | # CONFIG_CFG80211 is not set | ||
396 | # CONFIG_WIRELESS_OLD_REGULATORY is not set | ||
397 | CONFIG_WIRELESS_EXT=y | ||
398 | CONFIG_WIRELESS_EXT_SYSFS=y | ||
399 | # CONFIG_LIB80211 is not set | ||
400 | # CONFIG_MAC80211 is not set | ||
401 | # CONFIG_WIMAX is not set | ||
402 | # CONFIG_RFKILL is not set | ||
403 | # CONFIG_NET_9P is not set | ||
404 | |||
405 | # | ||
406 | # Device Drivers | ||
407 | # | ||
408 | |||
409 | # | ||
410 | # Generic Driver Options | ||
411 | # | ||
412 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
413 | CONFIG_STANDALONE=y | ||
414 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
415 | # CONFIG_FW_LOADER is not set | ||
416 | # CONFIG_SYS_HYPERVISOR is not set | ||
417 | # CONFIG_CONNECTOR is not set | ||
418 | CONFIG_MTD=y | ||
419 | # CONFIG_MTD_DEBUG is not set | ||
420 | CONFIG_MTD_CONCAT=y | ||
421 | CONFIG_MTD_PARTITIONS=y | ||
422 | # CONFIG_MTD_TESTS is not set | ||
423 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
424 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
425 | # CONFIG_MTD_AR7_PARTS is not set | ||
426 | |||
427 | # | ||
428 | # User Modules And Translation Layers | ||
429 | # | ||
430 | CONFIG_MTD_CHAR=y | ||
431 | CONFIG_MTD_BLKDEVS=y | ||
432 | CONFIG_MTD_BLOCK=y | ||
433 | # CONFIG_FTL is not set | ||
434 | # CONFIG_NFTL is not set | ||
435 | # CONFIG_INFTL is not set | ||
436 | # CONFIG_RFD_FTL is not set | ||
437 | # CONFIG_SSFDC is not set | ||
438 | # CONFIG_MTD_OOPS is not set | ||
439 | |||
440 | # | ||
441 | # RAM/ROM/Flash chip drivers | ||
442 | # | ||
443 | CONFIG_MTD_CFI=y | ||
444 | # CONFIG_MTD_JEDECPROBE is not set | ||
445 | CONFIG_MTD_GEN_PROBE=y | ||
446 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
447 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
448 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
449 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
450 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
451 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
452 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
453 | CONFIG_MTD_CFI_I1=y | ||
454 | CONFIG_MTD_CFI_I2=y | ||
455 | # CONFIG_MTD_CFI_I4 is not set | ||
456 | # CONFIG_MTD_CFI_I8 is not set | ||
457 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
458 | CONFIG_MTD_CFI_AMDSTD=y | ||
459 | # CONFIG_MTD_CFI_STAA is not set | ||
460 | CONFIG_MTD_CFI_UTIL=y | ||
461 | # CONFIG_MTD_RAM is not set | ||
462 | # CONFIG_MTD_ROM is not set | ||
463 | # CONFIG_MTD_ABSENT is not set | ||
464 | |||
465 | # | ||
466 | # Mapping drivers for chip access | ||
467 | # | ||
468 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
469 | CONFIG_MTD_PHYSMAP=y | ||
470 | # CONFIG_MTD_PHYSMAP_COMPAT is not set | ||
471 | # CONFIG_MTD_PLATRAM is not set | ||
472 | |||
473 | # | ||
474 | # Self-contained MTD device drivers | ||
475 | # | ||
476 | # CONFIG_MTD_SLRAM is not set | ||
477 | # CONFIG_MTD_PHRAM is not set | ||
478 | # CONFIG_MTD_MTDRAM is not set | ||
479 | # CONFIG_MTD_BLOCK2MTD is not set | ||
480 | |||
481 | # | ||
482 | # Disk-On-Chip Device Drivers | ||
483 | # | ||
484 | # CONFIG_MTD_DOC2000 is not set | ||
485 | # CONFIG_MTD_DOC2001 is not set | ||
486 | # CONFIG_MTD_DOC2001PLUS is not set | ||
487 | # CONFIG_MTD_NAND is not set | ||
488 | # CONFIG_MTD_ONENAND is not set | ||
489 | |||
490 | # | ||
491 | # LPDDR flash memory drivers | ||
492 | # | ||
493 | # CONFIG_MTD_LPDDR is not set | ||
494 | # CONFIG_MTD_QINFO_PROBE is not set | ||
495 | |||
496 | # | ||
497 | # UBI - Unsorted block images | ||
498 | # | ||
499 | # CONFIG_MTD_UBI is not set | ||
500 | # CONFIG_PARPORT is not set | ||
501 | CONFIG_BLK_DEV=y | ||
502 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
503 | # CONFIG_BLK_DEV_LOOP is not set | ||
504 | # CONFIG_BLK_DEV_NBD is not set | ||
505 | # CONFIG_BLK_DEV_UB is not set | ||
506 | CONFIG_BLK_DEV_RAM=y | ||
507 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
508 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
509 | # CONFIG_BLK_DEV_XIP is not set | ||
510 | # CONFIG_CDROM_PKTCDVD is not set | ||
511 | # CONFIG_ATA_OVER_ETH is not set | ||
512 | # CONFIG_BLK_DEV_HD is not set | ||
513 | # CONFIG_MISC_DEVICES is not set | ||
514 | CONFIG_HAVE_IDE=y | ||
515 | # CONFIG_IDE is not set | ||
516 | |||
517 | # | ||
518 | # SCSI device support | ||
519 | # | ||
520 | # CONFIG_RAID_ATTRS is not set | ||
521 | CONFIG_SCSI=y | ||
522 | CONFIG_SCSI_DMA=y | ||
523 | # CONFIG_SCSI_TGT is not set | ||
524 | # CONFIG_SCSI_NETLINK is not set | ||
525 | CONFIG_SCSI_PROC_FS=y | ||
526 | |||
527 | # | ||
528 | # SCSI support type (disk, tape, CD-ROM) | ||
529 | # | ||
530 | CONFIG_BLK_DEV_SD=y | ||
531 | # CONFIG_CHR_DEV_ST is not set | ||
532 | # CONFIG_CHR_DEV_OSST is not set | ||
533 | # CONFIG_BLK_DEV_SR is not set | ||
534 | # CONFIG_CHR_DEV_SG is not set | ||
535 | # CONFIG_CHR_DEV_SCH is not set | ||
536 | |||
537 | # | ||
538 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
539 | # | ||
540 | # CONFIG_SCSI_MULTI_LUN is not set | ||
541 | # CONFIG_SCSI_CONSTANTS is not set | ||
542 | # CONFIG_SCSI_LOGGING is not set | ||
543 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
544 | CONFIG_SCSI_WAIT_SCAN=m | ||
545 | |||
546 | # | ||
547 | # SCSI Transports | ||
548 | # | ||
549 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
550 | # CONFIG_SCSI_FC_ATTRS is not set | ||
551 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
552 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
553 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
554 | # CONFIG_SCSI_LOWLEVEL is not set | ||
555 | # CONFIG_SCSI_DH is not set | ||
556 | CONFIG_ATA=y | ||
557 | # CONFIG_ATA_NONSTANDARD is not set | ||
558 | CONFIG_SATA_PMP=y | ||
559 | CONFIG_ATA_SFF=y | ||
560 | # CONFIG_SATA_MV is not set | ||
561 | # CONFIG_PATA_PLATFORM is not set | ||
562 | # CONFIG_MD is not set | ||
563 | CONFIG_NETDEVICES=y | ||
564 | # CONFIG_DUMMY is not set | ||
565 | # CONFIG_BONDING is not set | ||
566 | # CONFIG_MACVLAN is not set | ||
567 | # CONFIG_EQUALIZER is not set | ||
568 | # CONFIG_TUN is not set | ||
569 | # CONFIG_VETH is not set | ||
570 | CONFIG_PHYLIB=y | ||
571 | |||
572 | # | ||
573 | # MII PHY device drivers | ||
574 | # | ||
575 | # CONFIG_MARVELL_PHY is not set | ||
576 | # CONFIG_DAVICOM_PHY is not set | ||
577 | # CONFIG_QSEMI_PHY is not set | ||
578 | # CONFIG_LXT_PHY is not set | ||
579 | # CONFIG_CICADA_PHY is not set | ||
580 | # CONFIG_VITESSE_PHY is not set | ||
581 | # CONFIG_SMSC_PHY is not set | ||
582 | # CONFIG_BROADCOM_PHY is not set | ||
583 | # CONFIG_ICPLUS_PHY is not set | ||
584 | # CONFIG_REALTEK_PHY is not set | ||
585 | # CONFIG_NATIONAL_PHY is not set | ||
586 | # CONFIG_STE10XP is not set | ||
587 | # CONFIG_LSI_ET1011C_PHY is not set | ||
588 | # CONFIG_FIXED_PHY is not set | ||
589 | # CONFIG_MDIO_BITBANG is not set | ||
590 | CONFIG_NET_ETHERNET=y | ||
591 | CONFIG_MII=y | ||
592 | # CONFIG_AX88796 is not set | ||
593 | # CONFIG_STNIC is not set | ||
594 | CONFIG_SMC91X=y | ||
595 | # CONFIG_SMC911X is not set | ||
596 | # CONFIG_SMSC911X is not set | ||
597 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
598 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
599 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
600 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
601 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
602 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
603 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
604 | # CONFIG_B44 is not set | ||
605 | # CONFIG_NETDEV_1000 is not set | ||
606 | # CONFIG_NETDEV_10000 is not set | ||
607 | |||
608 | # | ||
609 | # Wireless LAN | ||
610 | # | ||
611 | # CONFIG_WLAN_PRE80211 is not set | ||
612 | # CONFIG_WLAN_80211 is not set | ||
613 | # CONFIG_IWLWIFI_LEDS is not set | ||
614 | |||
615 | # | ||
616 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
617 | # | ||
618 | |||
619 | # | ||
620 | # USB Network Adapters | ||
621 | # | ||
622 | # CONFIG_USB_CATC is not set | ||
623 | # CONFIG_USB_KAWETH is not set | ||
624 | # CONFIG_USB_PEGASUS is not set | ||
625 | # CONFIG_USB_RTL8150 is not set | ||
626 | # CONFIG_USB_USBNET is not set | ||
627 | # CONFIG_WAN is not set | ||
628 | # CONFIG_PPP is not set | ||
629 | # CONFIG_SLIP is not set | ||
630 | # CONFIG_NETCONSOLE is not set | ||
631 | # CONFIG_NETPOLL is not set | ||
632 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
633 | # CONFIG_ISDN is not set | ||
634 | # CONFIG_PHONE is not set | ||
635 | |||
636 | # | ||
637 | # Input device support | ||
638 | # | ||
639 | CONFIG_INPUT=y | ||
640 | CONFIG_INPUT_FF_MEMLESS=m | ||
641 | # CONFIG_INPUT_POLLDEV is not set | ||
642 | |||
643 | # | ||
644 | # Userland interfaces | ||
645 | # | ||
646 | CONFIG_INPUT_MOUSEDEV=y | ||
647 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
648 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
649 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
650 | # CONFIG_INPUT_JOYDEV is not set | ||
651 | # CONFIG_INPUT_EVDEV is not set | ||
652 | # CONFIG_INPUT_EVBUG is not set | ||
653 | |||
654 | # | ||
655 | # Input Device Drivers | ||
656 | # | ||
657 | CONFIG_INPUT_KEYBOARD=y | ||
658 | # CONFIG_KEYBOARD_ATKBD is not set | ||
659 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
660 | # CONFIG_KEYBOARD_LKKBD is not set | ||
661 | # CONFIG_KEYBOARD_XTKBD is not set | ||
662 | # CONFIG_KEYBOARD_NEWTON is not set | ||
663 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
664 | # CONFIG_KEYBOARD_GPIO is not set | ||
665 | # CONFIG_KEYBOARD_SH_KEYSC is not set | ||
666 | # CONFIG_INPUT_MOUSE is not set | ||
667 | # CONFIG_INPUT_JOYSTICK is not set | ||
668 | # CONFIG_INPUT_TABLET is not set | ||
669 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
670 | # CONFIG_INPUT_MISC is not set | ||
671 | |||
672 | # | ||
673 | # Hardware I/O ports | ||
674 | # | ||
675 | # CONFIG_SERIO is not set | ||
676 | # CONFIG_GAMEPORT is not set | ||
677 | |||
678 | # | ||
679 | # Character devices | ||
680 | # | ||
681 | CONFIG_VT=y | ||
682 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
683 | CONFIG_VT_CONSOLE=y | ||
684 | CONFIG_HW_CONSOLE=y | ||
685 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
686 | CONFIG_DEVKMEM=y | ||
687 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
688 | |||
689 | # | ||
690 | # Serial drivers | ||
691 | # | ||
692 | # CONFIG_SERIAL_8250 is not set | ||
693 | |||
694 | # | ||
695 | # Non-8250 serial port support | ||
696 | # | ||
697 | CONFIG_SERIAL_SH_SCI=y | ||
698 | CONFIG_SERIAL_SH_SCI_NR_UARTS=6 | ||
699 | CONFIG_SERIAL_SH_SCI_CONSOLE=y | ||
700 | CONFIG_SERIAL_CORE=y | ||
701 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
702 | CONFIG_UNIX98_PTYS=y | ||
703 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
704 | CONFIG_LEGACY_PTYS=y | ||
705 | CONFIG_LEGACY_PTY_COUNT=256 | ||
706 | # CONFIG_IPMI_HANDLER is not set | ||
707 | CONFIG_HW_RANDOM=y | ||
708 | # CONFIG_R3964 is not set | ||
709 | # CONFIG_RAW_DRIVER is not set | ||
710 | # CONFIG_TCG_TPM is not set | ||
711 | CONFIG_I2C=y | ||
712 | CONFIG_I2C_BOARDINFO=y | ||
713 | # CONFIG_I2C_CHARDEV is not set | ||
714 | CONFIG_I2C_HELPER_AUTO=y | ||
715 | CONFIG_I2C_ALGOPCA=y | ||
716 | |||
717 | # | ||
718 | # I2C Hardware Bus support | ||
719 | # | ||
720 | |||
721 | # | ||
722 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
723 | # | ||
724 | # CONFIG_I2C_GPIO is not set | ||
725 | # CONFIG_I2C_OCORES is not set | ||
726 | # CONFIG_I2C_SH_MOBILE is not set | ||
727 | # CONFIG_I2C_SIMTEC is not set | ||
728 | |||
729 | # | ||
730 | # External I2C/SMBus adapter drivers | ||
731 | # | ||
732 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
733 | # CONFIG_I2C_TAOS_EVM is not set | ||
734 | # CONFIG_I2C_TINY_USB is not set | ||
735 | |||
736 | # | ||
737 | # Other I2C/SMBus bus drivers | ||
738 | # | ||
739 | CONFIG_I2C_PCA_PLATFORM=y | ||
740 | # CONFIG_I2C_STUB is not set | ||
741 | |||
742 | # | ||
743 | # Miscellaneous I2C Chip support | ||
744 | # | ||
745 | # CONFIG_DS1682 is not set | ||
746 | # CONFIG_SENSORS_PCF8574 is not set | ||
747 | # CONFIG_PCF8575 is not set | ||
748 | # CONFIG_SENSORS_PCA9539 is not set | ||
749 | # CONFIG_SENSORS_PCF8591 is not set | ||
750 | # CONFIG_SENSORS_MAX6875 is not set | ||
751 | # CONFIG_SENSORS_TSL2550 is not set | ||
752 | # CONFIG_I2C_DEBUG_CORE is not set | ||
753 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
754 | # CONFIG_I2C_DEBUG_BUS is not set | ||
755 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
756 | # CONFIG_SPI is not set | ||
757 | CONFIG_ARCH_REQUIRE_GPIOLIB=y | ||
758 | CONFIG_GPIOLIB=y | ||
759 | # CONFIG_GPIO_SYSFS is not set | ||
760 | |||
761 | # | ||
762 | # Memory mapped GPIO expanders: | ||
763 | # | ||
764 | |||
765 | # | ||
766 | # I2C GPIO expanders: | ||
767 | # | ||
768 | # CONFIG_GPIO_MAX732X is not set | ||
769 | # CONFIG_GPIO_PCA953X is not set | ||
770 | # CONFIG_GPIO_PCF857X is not set | ||
771 | |||
772 | # | ||
773 | # PCI GPIO expanders: | ||
774 | # | ||
775 | |||
776 | # | ||
777 | # SPI GPIO expanders: | ||
778 | # | ||
779 | # CONFIG_W1 is not set | ||
780 | # CONFIG_POWER_SUPPLY is not set | ||
781 | # CONFIG_HWMON is not set | ||
782 | # CONFIG_THERMAL is not set | ||
783 | # CONFIG_THERMAL_HWMON is not set | ||
784 | # CONFIG_WATCHDOG is not set | ||
785 | CONFIG_SSB_POSSIBLE=y | ||
786 | |||
787 | # | ||
788 | # Sonics Silicon Backplane | ||
789 | # | ||
790 | # CONFIG_SSB is not set | ||
791 | |||
792 | # | ||
793 | # Multifunction device drivers | ||
794 | # | ||
795 | # CONFIG_MFD_CORE is not set | ||
796 | CONFIG_MFD_SM501=y | ||
797 | # CONFIG_MFD_SM501_GPIO is not set | ||
798 | # CONFIG_HTC_PASIC3 is not set | ||
799 | # CONFIG_TPS65010 is not set | ||
800 | # CONFIG_TWL4030_CORE is not set | ||
801 | # CONFIG_MFD_TMIO is not set | ||
802 | # CONFIG_PMIC_DA903X is not set | ||
803 | # CONFIG_MFD_WM8400 is not set | ||
804 | # CONFIG_MFD_WM8350_I2C is not set | ||
805 | # CONFIG_MFD_PCF50633 is not set | ||
806 | # CONFIG_REGULATOR is not set | ||
807 | |||
808 | # | ||
809 | # Multimedia devices | ||
810 | # | ||
811 | |||
812 | # | ||
813 | # Multimedia core support | ||
814 | # | ||
815 | # CONFIG_VIDEO_DEV is not set | ||
816 | # CONFIG_DVB_CORE is not set | ||
817 | # CONFIG_VIDEO_MEDIA is not set | ||
818 | |||
819 | # | ||
820 | # Multimedia drivers | ||
821 | # | ||
822 | # CONFIG_DAB is not set | ||
823 | |||
824 | # | ||
825 | # Graphics support | ||
826 | # | ||
827 | # CONFIG_VGASTATE is not set | ||
828 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
829 | CONFIG_FB=y | ||
830 | # CONFIG_FIRMWARE_EDID is not set | ||
831 | # CONFIG_FB_DDC is not set | ||
832 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
833 | CONFIG_FB_CFB_FILLRECT=y | ||
834 | CONFIG_FB_CFB_COPYAREA=y | ||
835 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
836 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
837 | CONFIG_FB_SYS_FILLRECT=m | ||
838 | CONFIG_FB_SYS_COPYAREA=m | ||
839 | CONFIG_FB_SYS_IMAGEBLIT=m | ||
840 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
841 | CONFIG_FB_SYS_FOPS=m | ||
842 | CONFIG_FB_DEFERRED_IO=y | ||
843 | # CONFIG_FB_SVGALIB is not set | ||
844 | # CONFIG_FB_MACMODES is not set | ||
845 | # CONFIG_FB_BACKLIGHT is not set | ||
846 | # CONFIG_FB_MODE_HELPERS is not set | ||
847 | # CONFIG_FB_TILEBLITTING is not set | ||
848 | |||
849 | # | ||
850 | # Frame buffer hardware drivers | ||
851 | # | ||
852 | # CONFIG_FB_S1D13XXX is not set | ||
853 | CONFIG_FB_SH_MOBILE_LCDC=m | ||
854 | CONFIG_FB_SM501=y | ||
855 | # CONFIG_FB_VIRTUAL is not set | ||
856 | # CONFIG_FB_METRONOME is not set | ||
857 | # CONFIG_FB_MB862XX is not set | ||
858 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
859 | |||
860 | # | ||
861 | # Display device support | ||
862 | # | ||
863 | # CONFIG_DISPLAY_SUPPORT is not set | ||
864 | |||
865 | # | ||
866 | # Console display driver support | ||
867 | # | ||
868 | CONFIG_DUMMY_CONSOLE=y | ||
869 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
870 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
871 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
872 | # CONFIG_FONTS is not set | ||
873 | CONFIG_FONT_8x8=y | ||
874 | CONFIG_FONT_8x16=y | ||
875 | CONFIG_LOGO=y | ||
876 | # CONFIG_LOGO_LINUX_MONO is not set | ||
877 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
878 | CONFIG_LOGO_LINUX_CLUT224=y | ||
879 | # CONFIG_LOGO_SUPERH_MONO is not set | ||
880 | # CONFIG_LOGO_SUPERH_VGA16 is not set | ||
881 | # CONFIG_LOGO_SUPERH_CLUT224 is not set | ||
882 | # CONFIG_SOUND is not set | ||
883 | CONFIG_HID_SUPPORT=y | ||
884 | CONFIG_HID=y | ||
885 | # CONFIG_HID_DEBUG is not set | ||
886 | # CONFIG_HIDRAW is not set | ||
887 | |||
888 | # | ||
889 | # USB Input Devices | ||
890 | # | ||
891 | CONFIG_USB_HID=y | ||
892 | # CONFIG_HID_PID is not set | ||
893 | # CONFIG_USB_HIDDEV is not set | ||
894 | |||
895 | # | ||
896 | # Special HID drivers | ||
897 | # | ||
898 | CONFIG_HID_COMPAT=y | ||
899 | CONFIG_HID_A4TECH=y | ||
900 | CONFIG_HID_APPLE=y | ||
901 | CONFIG_HID_BELKIN=y | ||
902 | CONFIG_HID_CHERRY=y | ||
903 | CONFIG_HID_CHICONY=y | ||
904 | CONFIG_HID_CYPRESS=y | ||
905 | CONFIG_HID_EZKEY=y | ||
906 | CONFIG_HID_GYRATION=y | ||
907 | CONFIG_HID_LOGITECH=y | ||
908 | # CONFIG_LOGITECH_FF is not set | ||
909 | # CONFIG_LOGIRUMBLEPAD2_FF is not set | ||
910 | CONFIG_HID_MICROSOFT=y | ||
911 | CONFIG_HID_MONTEREY=y | ||
912 | # CONFIG_HID_NTRIG is not set | ||
913 | CONFIG_HID_PANTHERLORD=y | ||
914 | # CONFIG_PANTHERLORD_FF is not set | ||
915 | CONFIG_HID_PETALYNX=y | ||
916 | CONFIG_HID_SAMSUNG=y | ||
917 | CONFIG_HID_SONY=y | ||
918 | CONFIG_HID_SUNPLUS=y | ||
919 | # CONFIG_GREENASIA_FF is not set | ||
920 | # CONFIG_HID_TOPSEED is not set | ||
921 | CONFIG_THRUSTMASTER_FF=m | ||
922 | CONFIG_ZEROPLUS_FF=m | ||
923 | CONFIG_USB_SUPPORT=y | ||
924 | CONFIG_USB_ARCH_HAS_HCD=y | ||
925 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
926 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
927 | CONFIG_USB=y | ||
928 | # CONFIG_USB_DEBUG is not set | ||
929 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | ||
930 | |||
931 | # | ||
932 | # Miscellaneous USB options | ||
933 | # | ||
934 | CONFIG_USB_DEVICEFS=y | ||
935 | CONFIG_USB_DEVICE_CLASS=y | ||
936 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
937 | # CONFIG_USB_OTG is not set | ||
938 | # CONFIG_USB_OTG_WHITELIST is not set | ||
939 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
940 | CONFIG_USB_MON=y | ||
941 | # CONFIG_USB_WUSB is not set | ||
942 | # CONFIG_USB_WUSB_CBAF is not set | ||
943 | |||
944 | # | ||
945 | # USB Host Controller Drivers | ||
946 | # | ||
947 | # CONFIG_USB_C67X00_HCD is not set | ||
948 | # CONFIG_USB_OXU210HP_HCD is not set | ||
949 | # CONFIG_USB_ISP116X_HCD is not set | ||
950 | # CONFIG_USB_SL811_HCD is not set | ||
951 | # CONFIG_USB_R8A66597_HCD is not set | ||
952 | # CONFIG_USB_HWA_HCD is not set | ||
953 | |||
954 | # | ||
955 | # USB Device Class drivers | ||
956 | # | ||
957 | # CONFIG_USB_ACM is not set | ||
958 | # CONFIG_USB_PRINTER is not set | ||
959 | # CONFIG_USB_WDM is not set | ||
960 | # CONFIG_USB_TMC is not set | ||
961 | |||
962 | # | ||
963 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; | ||
964 | # | ||
965 | |||
966 | # | ||
967 | # see USB_STORAGE Help for more information | ||
968 | # | ||
969 | CONFIG_USB_STORAGE=y | ||
970 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
971 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
972 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
973 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
974 | # CONFIG_USB_STORAGE_USBAT is not set | ||
975 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
976 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
977 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
978 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
979 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
980 | # CONFIG_USB_STORAGE_KARMA is not set | ||
981 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
982 | # CONFIG_USB_LIBUSUAL is not set | ||
983 | |||
984 | # | ||
985 | # USB Imaging devices | ||
986 | # | ||
987 | # CONFIG_USB_MDC800 is not set | ||
988 | # CONFIG_USB_MICROTEK is not set | ||
989 | |||
990 | # | ||
991 | # USB port drivers | ||
992 | # | ||
993 | # CONFIG_USB_SERIAL is not set | ||
994 | |||
995 | # | ||
996 | # USB Miscellaneous drivers | ||
997 | # | ||
998 | # CONFIG_USB_EMI62 is not set | ||
999 | # CONFIG_USB_EMI26 is not set | ||
1000 | # CONFIG_USB_ADUTUX is not set | ||
1001 | # CONFIG_USB_SEVSEG is not set | ||
1002 | # CONFIG_USB_RIO500 is not set | ||
1003 | # CONFIG_USB_LEGOTOWER is not set | ||
1004 | # CONFIG_USB_LCD is not set | ||
1005 | # CONFIG_USB_BERRY_CHARGE is not set | ||
1006 | # CONFIG_USB_LED is not set | ||
1007 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1008 | # CONFIG_USB_CYTHERM is not set | ||
1009 | # CONFIG_USB_PHIDGET is not set | ||
1010 | # CONFIG_USB_IDMOUSE is not set | ||
1011 | # CONFIG_USB_FTDI_ELAN is not set | ||
1012 | # CONFIG_USB_APPLEDISPLAY is not set | ||
1013 | # CONFIG_USB_LD is not set | ||
1014 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1015 | # CONFIG_USB_IOWARRIOR is not set | ||
1016 | # CONFIG_USB_TEST is not set | ||
1017 | # CONFIG_USB_ISIGHTFW is not set | ||
1018 | # CONFIG_USB_VST is not set | ||
1019 | # CONFIG_USB_GADGET is not set | ||
1020 | |||
1021 | # | ||
1022 | # OTG and related infrastructure | ||
1023 | # | ||
1024 | # CONFIG_USB_GPIO_VBUS is not set | ||
1025 | # CONFIG_MMC is not set | ||
1026 | # CONFIG_MEMSTICK is not set | ||
1027 | # CONFIG_NEW_LEDS is not set | ||
1028 | # CONFIG_ACCESSIBILITY is not set | ||
1029 | # CONFIG_RTC_CLASS is not set | ||
1030 | # CONFIG_DMADEVICES is not set | ||
1031 | # CONFIG_UIO is not set | ||
1032 | # CONFIG_STAGING is not set | ||
1033 | |||
1034 | # | ||
1035 | # File systems | ||
1036 | # | ||
1037 | CONFIG_EXT2_FS=y | ||
1038 | # CONFIG_EXT2_FS_XATTR is not set | ||
1039 | # CONFIG_EXT2_FS_XIP is not set | ||
1040 | CONFIG_EXT3_FS=y | ||
1041 | CONFIG_EXT3_FS_XATTR=y | ||
1042 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1043 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1044 | # CONFIG_EXT4_FS is not set | ||
1045 | CONFIG_JBD=y | ||
1046 | CONFIG_FS_MBCACHE=y | ||
1047 | # CONFIG_REISERFS_FS is not set | ||
1048 | # CONFIG_JFS_FS is not set | ||
1049 | CONFIG_FS_POSIX_ACL=y | ||
1050 | CONFIG_FILE_LOCKING=y | ||
1051 | # CONFIG_XFS_FS is not set | ||
1052 | # CONFIG_OCFS2_FS is not set | ||
1053 | # CONFIG_BTRFS_FS is not set | ||
1054 | CONFIG_DNOTIFY=y | ||
1055 | CONFIG_INOTIFY=y | ||
1056 | CONFIG_INOTIFY_USER=y | ||
1057 | # CONFIG_QUOTA is not set | ||
1058 | # CONFIG_AUTOFS_FS is not set | ||
1059 | # CONFIG_AUTOFS4_FS is not set | ||
1060 | # CONFIG_FUSE_FS is not set | ||
1061 | |||
1062 | # | ||
1063 | # CD-ROM/DVD Filesystems | ||
1064 | # | ||
1065 | # CONFIG_ISO9660_FS is not set | ||
1066 | # CONFIG_UDF_FS is not set | ||
1067 | |||
1068 | # | ||
1069 | # DOS/FAT/NT Filesystems | ||
1070 | # | ||
1071 | CONFIG_FAT_FS=y | ||
1072 | CONFIG_MSDOS_FS=y | ||
1073 | CONFIG_VFAT_FS=y | ||
1074 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1075 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1076 | CONFIG_NTFS_FS=y | ||
1077 | # CONFIG_NTFS_DEBUG is not set | ||
1078 | CONFIG_NTFS_RW=y | ||
1079 | |||
1080 | # | ||
1081 | # Pseudo filesystems | ||
1082 | # | ||
1083 | CONFIG_PROC_FS=y | ||
1084 | CONFIG_PROC_KCORE=y | ||
1085 | CONFIG_PROC_SYSCTL=y | ||
1086 | CONFIG_PROC_PAGE_MONITOR=y | ||
1087 | CONFIG_SYSFS=y | ||
1088 | CONFIG_TMPFS=y | ||
1089 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1090 | # CONFIG_HUGETLBFS is not set | ||
1091 | # CONFIG_HUGETLB_PAGE is not set | ||
1092 | # CONFIG_CONFIGFS_FS is not set | ||
1093 | CONFIG_MISC_FILESYSTEMS=y | ||
1094 | # CONFIG_ADFS_FS is not set | ||
1095 | # CONFIG_AFFS_FS is not set | ||
1096 | # CONFIG_HFS_FS is not set | ||
1097 | # CONFIG_HFSPLUS_FS is not set | ||
1098 | # CONFIG_BEFS_FS is not set | ||
1099 | # CONFIG_BFS_FS is not set | ||
1100 | # CONFIG_EFS_FS is not set | ||
1101 | # CONFIG_JFFS2_FS is not set | ||
1102 | # CONFIG_CRAMFS is not set | ||
1103 | # CONFIG_SQUASHFS is not set | ||
1104 | # CONFIG_VXFS_FS is not set | ||
1105 | CONFIG_MINIX_FS=y | ||
1106 | # CONFIG_OMFS_FS is not set | ||
1107 | # CONFIG_HPFS_FS is not set | ||
1108 | # CONFIG_QNX4FS_FS is not set | ||
1109 | # CONFIG_ROMFS_FS is not set | ||
1110 | # CONFIG_SYSV_FS is not set | ||
1111 | # CONFIG_UFS_FS is not set | ||
1112 | CONFIG_NETWORK_FILESYSTEMS=y | ||
1113 | CONFIG_NFS_FS=y | ||
1114 | CONFIG_NFS_V3=y | ||
1115 | # CONFIG_NFS_V3_ACL is not set | ||
1116 | CONFIG_NFS_V4=y | ||
1117 | CONFIG_ROOT_NFS=y | ||
1118 | CONFIG_NFSD=y | ||
1119 | CONFIG_NFSD_V3=y | ||
1120 | # CONFIG_NFSD_V3_ACL is not set | ||
1121 | CONFIG_NFSD_V4=y | ||
1122 | CONFIG_LOCKD=y | ||
1123 | CONFIG_LOCKD_V4=y | ||
1124 | CONFIG_EXPORTFS=y | ||
1125 | CONFIG_NFS_COMMON=y | ||
1126 | CONFIG_SUNRPC=y | ||
1127 | CONFIG_SUNRPC_GSS=y | ||
1128 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
1129 | CONFIG_RPCSEC_GSS_KRB5=y | ||
1130 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1131 | # CONFIG_SMB_FS is not set | ||
1132 | # CONFIG_CIFS is not set | ||
1133 | # CONFIG_NCP_FS is not set | ||
1134 | # CONFIG_CODA_FS is not set | ||
1135 | # CONFIG_AFS_FS is not set | ||
1136 | |||
1137 | # | ||
1138 | # Partition Types | ||
1139 | # | ||
1140 | # CONFIG_PARTITION_ADVANCED is not set | ||
1141 | CONFIG_MSDOS_PARTITION=y | ||
1142 | CONFIG_NLS=y | ||
1143 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1144 | CONFIG_NLS_CODEPAGE_437=y | ||
1145 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1146 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1147 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1148 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1149 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1150 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1151 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1152 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1153 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1154 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1155 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1156 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1157 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1158 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1159 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1160 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1161 | CONFIG_NLS_CODEPAGE_932=y | ||
1162 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1163 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1164 | # CONFIG_NLS_ISO8859_8 is not set | ||
1165 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1166 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1167 | # CONFIG_NLS_ASCII is not set | ||
1168 | CONFIG_NLS_ISO8859_1=y | ||
1169 | # CONFIG_NLS_ISO8859_2 is not set | ||
1170 | # CONFIG_NLS_ISO8859_3 is not set | ||
1171 | # CONFIG_NLS_ISO8859_4 is not set | ||
1172 | # CONFIG_NLS_ISO8859_5 is not set | ||
1173 | # CONFIG_NLS_ISO8859_6 is not set | ||
1174 | # CONFIG_NLS_ISO8859_7 is not set | ||
1175 | # CONFIG_NLS_ISO8859_9 is not set | ||
1176 | # CONFIG_NLS_ISO8859_13 is not set | ||
1177 | # CONFIG_NLS_ISO8859_14 is not set | ||
1178 | # CONFIG_NLS_ISO8859_15 is not set | ||
1179 | # CONFIG_NLS_KOI8_R is not set | ||
1180 | # CONFIG_NLS_KOI8_U is not set | ||
1181 | # CONFIG_NLS_UTF8 is not set | ||
1182 | # CONFIG_DLM is not set | ||
1183 | |||
1184 | # | ||
1185 | # Kernel hacking | ||
1186 | # | ||
1187 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
1188 | # CONFIG_PRINTK_TIME is not set | ||
1189 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
1190 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
1191 | CONFIG_FRAME_WARN=1024 | ||
1192 | # CONFIG_MAGIC_SYSRQ is not set | ||
1193 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1194 | # CONFIG_DEBUG_FS is not set | ||
1195 | # CONFIG_HEADERS_CHECK is not set | ||
1196 | # CONFIG_DEBUG_KERNEL is not set | ||
1197 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
1198 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
1199 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
1200 | # CONFIG_LATENCYTOP is not set | ||
1201 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
1202 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
1203 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
1204 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
1205 | |||
1206 | # | ||
1207 | # Tracers | ||
1208 | # | ||
1209 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
1210 | # CONFIG_SAMPLES is not set | ||
1211 | CONFIG_HAVE_ARCH_KGDB=y | ||
1212 | # CONFIG_SH_STANDARD_BIOS is not set | ||
1213 | # CONFIG_EARLY_SCIF_CONSOLE is not set | ||
1214 | # CONFIG_MORE_COMPILE_OPTIONS is not set | ||
1215 | |||
1216 | # | ||
1217 | # Security options | ||
1218 | # | ||
1219 | # CONFIG_KEYS is not set | ||
1220 | # CONFIG_SECURITY is not set | ||
1221 | # CONFIG_SECURITYFS is not set | ||
1222 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
1223 | CONFIG_CRYPTO=y | ||
1224 | |||
1225 | # | ||
1226 | # Crypto core or helper | ||
1227 | # | ||
1228 | # CONFIG_CRYPTO_FIPS is not set | ||
1229 | CONFIG_CRYPTO_ALGAPI=y | ||
1230 | CONFIG_CRYPTO_ALGAPI2=y | ||
1231 | CONFIG_CRYPTO_AEAD2=y | ||
1232 | CONFIG_CRYPTO_BLKCIPHER=y | ||
1233 | CONFIG_CRYPTO_BLKCIPHER2=y | ||
1234 | CONFIG_CRYPTO_HASH=y | ||
1235 | CONFIG_CRYPTO_HASH2=y | ||
1236 | CONFIG_CRYPTO_RNG2=y | ||
1237 | CONFIG_CRYPTO_MANAGER=y | ||
1238 | CONFIG_CRYPTO_MANAGER2=y | ||
1239 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1240 | # CONFIG_CRYPTO_NULL is not set | ||
1241 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1242 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1243 | # CONFIG_CRYPTO_TEST is not set | ||
1244 | |||
1245 | # | ||
1246 | # Authenticated Encryption with Associated Data | ||
1247 | # | ||
1248 | # CONFIG_CRYPTO_CCM is not set | ||
1249 | # CONFIG_CRYPTO_GCM is not set | ||
1250 | # CONFIG_CRYPTO_SEQIV is not set | ||
1251 | |||
1252 | # | ||
1253 | # Block modes | ||
1254 | # | ||
1255 | CONFIG_CRYPTO_CBC=y | ||
1256 | # CONFIG_CRYPTO_CTR is not set | ||
1257 | # CONFIG_CRYPTO_CTS is not set | ||
1258 | # CONFIG_CRYPTO_ECB is not set | ||
1259 | # CONFIG_CRYPTO_LRW is not set | ||
1260 | # CONFIG_CRYPTO_PCBC is not set | ||
1261 | # CONFIG_CRYPTO_XTS is not set | ||
1262 | |||
1263 | # | ||
1264 | # Hash modes | ||
1265 | # | ||
1266 | CONFIG_CRYPTO_HMAC=y | ||
1267 | # CONFIG_CRYPTO_XCBC is not set | ||
1268 | |||
1269 | # | ||
1270 | # Digest | ||
1271 | # | ||
1272 | # CONFIG_CRYPTO_CRC32C is not set | ||
1273 | # CONFIG_CRYPTO_MD4 is not set | ||
1274 | CONFIG_CRYPTO_MD5=y | ||
1275 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1276 | # CONFIG_CRYPTO_RMD128 is not set | ||
1277 | # CONFIG_CRYPTO_RMD160 is not set | ||
1278 | # CONFIG_CRYPTO_RMD256 is not set | ||
1279 | # CONFIG_CRYPTO_RMD320 is not set | ||
1280 | # CONFIG_CRYPTO_SHA1 is not set | ||
1281 | # CONFIG_CRYPTO_SHA256 is not set | ||
1282 | # CONFIG_CRYPTO_SHA512 is not set | ||
1283 | # CONFIG_CRYPTO_TGR192 is not set | ||
1284 | # CONFIG_CRYPTO_WP512 is not set | ||
1285 | |||
1286 | # | ||
1287 | # Ciphers | ||
1288 | # | ||
1289 | # CONFIG_CRYPTO_AES is not set | ||
1290 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1291 | # CONFIG_CRYPTO_ARC4 is not set | ||
1292 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1293 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1294 | # CONFIG_CRYPTO_CAST5 is not set | ||
1295 | # CONFIG_CRYPTO_CAST6 is not set | ||
1296 | CONFIG_CRYPTO_DES=y | ||
1297 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1298 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1299 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1300 | # CONFIG_CRYPTO_SEED is not set | ||
1301 | # CONFIG_CRYPTO_SERPENT is not set | ||
1302 | # CONFIG_CRYPTO_TEA is not set | ||
1303 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1304 | |||
1305 | # | ||
1306 | # Compression | ||
1307 | # | ||
1308 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1309 | # CONFIG_CRYPTO_LZO is not set | ||
1310 | |||
1311 | # | ||
1312 | # Random Number Generation | ||
1313 | # | ||
1314 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
1315 | # CONFIG_CRYPTO_HW is not set | ||
1316 | |||
1317 | # | ||
1318 | # Library routines | ||
1319 | # | ||
1320 | CONFIG_BITREVERSE=y | ||
1321 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
1322 | # CONFIG_CRC_CCITT is not set | ||
1323 | # CONFIG_CRC16 is not set | ||
1324 | # CONFIG_CRC_T10DIF is not set | ||
1325 | # CONFIG_CRC_ITU_T is not set | ||
1326 | CONFIG_CRC32=y | ||
1327 | # CONFIG_CRC7 is not set | ||
1328 | # CONFIG_LIBCRC32C is not set | ||
1329 | CONFIG_PLIST=y | ||
1330 | CONFIG_HAS_IOMEM=y | ||
1331 | CONFIG_HAS_IOPORT=y | ||
1332 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/sh/drivers/dma/Kconfig b/arch/sh/drivers/dma/Kconfig index 01936368b8b0..f13a05285a9d 100644 --- a/arch/sh/drivers/dma/Kconfig +++ b/arch/sh/drivers/dma/Kconfig | |||
@@ -9,13 +9,21 @@ config SH_DMA | |||
9 | select SH_DMA_API | 9 | select SH_DMA_API |
10 | default n | 10 | default n |
11 | 11 | ||
12 | config SH_DMA_IRQ_MULTI | ||
13 | bool | ||
14 | depends on SH_DMA | ||
15 | default y if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7751 || \ | ||
16 | CPU_SUBTYPE_SH7750S || CPU_SUBTYPE_SH7750R || CPU_SUBTYPE_SH7751R || \ | ||
17 | CPU_SUBTYPE_SH7091 || CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7764 || \ | ||
18 | CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 | ||
19 | |||
12 | config NR_ONCHIP_DMA_CHANNELS | 20 | config NR_ONCHIP_DMA_CHANNELS |
13 | int | 21 | int |
14 | depends on SH_DMA | 22 | depends on SH_DMA |
15 | default "6" if CPU_SUBTYPE_SH7720 || CPU_SUBTYPE_SH7721 | 23 | default "4" if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7750S |
16 | default "8" if CPU_SUBTYPE_SH7750R || CPU_SUBTYPE_SH7751R | 24 | default "8" if CPU_SUBTYPE_SH7750R || CPU_SUBTYPE_SH7751R || CPU_SUBTYPE_SH7760 |
17 | default "12" if CPU_SUBTYPE_SH7780 | 25 | default "12" if CPU_SUBTYPE_SH7723 || CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 |
18 | default "4" | 26 | default "6" |
19 | help | 27 | help |
20 | This allows you to specify the number of channels that the on-chip | 28 | This allows you to specify the number of channels that the on-chip |
21 | DMAC supports. This will be 4 for SH7750/SH7751 and 8 for the | 29 | DMAC supports. This will be 4 for SH7750/SH7751 and 8 for the |
@@ -46,4 +54,28 @@ config SH_DMABRG | |||
46 | of the SH7760. | 54 | of the SH7760. |
47 | Say Y if you want to use Audio/USB DMA on your SH7760 board. | 55 | Say Y if you want to use Audio/USB DMA on your SH7760 board. |
48 | 56 | ||
57 | config PVR2_DMA | ||
58 | tristate "PowerVR 2 DMAC support" | ||
59 | depends on SH_DREAMCAST && SH_DMA | ||
60 | help | ||
61 | Selecting this will enable support for the PVR2 DMA controller. | ||
62 | As this chains off of the on-chip DMAC, that must also be | ||
63 | enabled by default. | ||
64 | |||
65 | This is primarily used by the pvr2fb framebuffer driver for | ||
66 | certain optimizations, but is not necessary for functionality. | ||
67 | |||
68 | If in doubt, say N. | ||
69 | |||
70 | config G2_DMA | ||
71 | tristate "G2 Bus DMA support" | ||
72 | depends on SH_DREAMCAST | ||
73 | select SH_DMA_API | ||
74 | help | ||
75 | This enables support for the DMA controller for the Dreamcast's | ||
76 | G2 bus. Drivers that want this will generally enable this on | ||
77 | their own. | ||
78 | |||
79 | If in doubt, say N. | ||
80 | |||
49 | endmenu | 81 | endmenu |
diff --git a/arch/sh/drivers/dma/Makefile b/arch/sh/drivers/dma/Makefile index ab956adacb47..c6068137b46f 100644 --- a/arch/sh/drivers/dma/Makefile +++ b/arch/sh/drivers/dma/Makefile | |||
@@ -4,5 +4,6 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_SH_DMA_API) += dma-api.o dma-sysfs.o | 5 | obj-$(CONFIG_SH_DMA_API) += dma-api.o dma-sysfs.o |
6 | obj-$(CONFIG_SH_DMA) += dma-sh.o | 6 | obj-$(CONFIG_SH_DMA) += dma-sh.o |
7 | obj-$(CONFIG_SH_DREAMCAST) += dma-pvr2.o dma-g2.o | 7 | obj-$(CONFIG_PVR2_DMA) += dma-pvr2.o |
8 | obj-$(CONFIG_G2_DMA) += dma-g2.o | ||
8 | obj-$(CONFIG_SH_DMABRG) += dmabrg.o | 9 | obj-$(CONFIG_SH_DMABRG) += dmabrg.o |
diff --git a/arch/sh/drivers/dma/dma-sh.c b/arch/sh/drivers/dma/dma-sh.c index 50887a592dd0..37fb5b8bbc3f 100644 --- a/arch/sh/drivers/dma/dma-sh.c +++ b/arch/sh/drivers/dma/dma-sh.c | |||
@@ -17,28 +17,16 @@ | |||
17 | #include <mach-dreamcast/mach/dma.h> | 17 | #include <mach-dreamcast/mach/dma.h> |
18 | #include <asm/dma.h> | 18 | #include <asm/dma.h> |
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | #include "dma-sh.h" | 20 | #include <asm/dma-sh.h> |
21 | 21 | ||
22 | static int dmte_irq_map[] = { | 22 | #if defined(DMAE1_IRQ) |
23 | DMTE0_IRQ, | 23 | #define NR_DMAE 2 |
24 | DMTE1_IRQ, | 24 | #else |
25 | DMTE2_IRQ, | 25 | #define NR_DMAE 1 |
26 | DMTE3_IRQ, | ||
27 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | ||
28 | defined(CONFIG_CPU_SUBTYPE_SH7721) || \ | ||
29 | defined(CONFIG_CPU_SUBTYPE_SH7751R) || \ | ||
30 | defined(CONFIG_CPU_SUBTYPE_SH7760) || \ | ||
31 | defined(CONFIG_CPU_SUBTYPE_SH7709) || \ | ||
32 | defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
33 | DMTE4_IRQ, | ||
34 | DMTE5_IRQ, | ||
35 | #endif | ||
36 | #if defined(CONFIG_CPU_SUBTYPE_SH7751R) || \ | ||
37 | defined(CONFIG_CPU_SUBTYPE_SH7760) || \ | ||
38 | defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
39 | DMTE6_IRQ, | ||
40 | DMTE7_IRQ, | ||
41 | #endif | 26 | #endif |
27 | |||
28 | static const char *dmae_name[] = { | ||
29 | "DMAC Address Error0", "DMAC Address Error1" | ||
42 | }; | 30 | }; |
43 | 31 | ||
44 | static inline unsigned int get_dmte_irq(unsigned int chan) | 32 | static inline unsigned int get_dmte_irq(unsigned int chan) |
@@ -46,7 +34,14 @@ static inline unsigned int get_dmte_irq(unsigned int chan) | |||
46 | unsigned int irq = 0; | 34 | unsigned int irq = 0; |
47 | if (chan < ARRAY_SIZE(dmte_irq_map)) | 35 | if (chan < ARRAY_SIZE(dmte_irq_map)) |
48 | irq = dmte_irq_map[chan]; | 36 | irq = dmte_irq_map[chan]; |
37 | |||
38 | #if defined(CONFIG_SH_DMA_IRQ_MULTI) | ||
39 | if (irq > DMTE6_IRQ) | ||
40 | return DMTE6_IRQ; | ||
41 | return DMTE0_IRQ; | ||
42 | #else | ||
49 | return irq; | 43 | return irq; |
44 | #endif | ||
50 | } | 45 | } |
51 | 46 | ||
52 | /* | 47 | /* |
@@ -59,7 +54,7 @@ static inline unsigned int get_dmte_irq(unsigned int chan) | |||
59 | */ | 54 | */ |
60 | static inline unsigned int calc_xmit_shift(struct dma_channel *chan) | 55 | static inline unsigned int calc_xmit_shift(struct dma_channel *chan) |
61 | { | 56 | { |
62 | u32 chcr = ctrl_inl(CHCR[chan->chan]); | 57 | u32 chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); |
63 | 58 | ||
64 | return ts_shift[(chcr & CHCR_TS_MASK)>>CHCR_TS_SHIFT]; | 59 | return ts_shift[(chcr & CHCR_TS_MASK)>>CHCR_TS_SHIFT]; |
65 | } | 60 | } |
@@ -75,13 +70,13 @@ static irqreturn_t dma_tei(int irq, void *dev_id) | |||
75 | struct dma_channel *chan = dev_id; | 70 | struct dma_channel *chan = dev_id; |
76 | u32 chcr; | 71 | u32 chcr; |
77 | 72 | ||
78 | chcr = ctrl_inl(CHCR[chan->chan]); | 73 | chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); |
79 | 74 | ||
80 | if (!(chcr & CHCR_TE)) | 75 | if (!(chcr & CHCR_TE)) |
81 | return IRQ_NONE; | 76 | return IRQ_NONE; |
82 | 77 | ||
83 | chcr &= ~(CHCR_IE | CHCR_DE); | 78 | chcr &= ~(CHCR_IE | CHCR_DE); |
84 | ctrl_outl(chcr, CHCR[chan->chan]); | 79 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); |
85 | 80 | ||
86 | wake_up(&chan->wait_queue); | 81 | wake_up(&chan->wait_queue); |
87 | 82 | ||
@@ -94,7 +89,12 @@ static int sh_dmac_request_dma(struct dma_channel *chan) | |||
94 | return 0; | 89 | return 0; |
95 | 90 | ||
96 | return request_irq(get_dmte_irq(chan->chan), dma_tei, | 91 | return request_irq(get_dmte_irq(chan->chan), dma_tei, |
97 | IRQF_DISABLED, chan->dev_id, chan); | 92 | #if defined(CONFIG_SH_DMA_IRQ_MULTI) |
93 | IRQF_SHARED, | ||
94 | #else | ||
95 | IRQF_DISABLED, | ||
96 | #endif | ||
97 | chan->dev_id, chan); | ||
98 | } | 98 | } |
99 | 99 | ||
100 | static void sh_dmac_free_dma(struct dma_channel *chan) | 100 | static void sh_dmac_free_dma(struct dma_channel *chan) |
@@ -115,7 +115,7 @@ sh_dmac_configure_channel(struct dma_channel *chan, unsigned long chcr) | |||
115 | chan->flags &= ~DMA_TEI_CAPABLE; | 115 | chan->flags &= ~DMA_TEI_CAPABLE; |
116 | } | 116 | } |
117 | 117 | ||
118 | ctrl_outl(chcr, CHCR[chan->chan]); | 118 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); |
119 | 119 | ||
120 | chan->flags |= DMA_CONFIGURED; | 120 | chan->flags |= DMA_CONFIGURED; |
121 | return 0; | 121 | return 0; |
@@ -126,13 +126,13 @@ static void sh_dmac_enable_dma(struct dma_channel *chan) | |||
126 | int irq; | 126 | int irq; |
127 | u32 chcr; | 127 | u32 chcr; |
128 | 128 | ||
129 | chcr = ctrl_inl(CHCR[chan->chan]); | 129 | chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); |
130 | chcr |= CHCR_DE; | 130 | chcr |= CHCR_DE; |
131 | 131 | ||
132 | if (chan->flags & DMA_TEI_CAPABLE) | 132 | if (chan->flags & DMA_TEI_CAPABLE) |
133 | chcr |= CHCR_IE; | 133 | chcr |= CHCR_IE; |
134 | 134 | ||
135 | ctrl_outl(chcr, CHCR[chan->chan]); | 135 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); |
136 | 136 | ||
137 | if (chan->flags & DMA_TEI_CAPABLE) { | 137 | if (chan->flags & DMA_TEI_CAPABLE) { |
138 | irq = get_dmte_irq(chan->chan); | 138 | irq = get_dmte_irq(chan->chan); |
@@ -150,9 +150,9 @@ static void sh_dmac_disable_dma(struct dma_channel *chan) | |||
150 | disable_irq(irq); | 150 | disable_irq(irq); |
151 | } | 151 | } |
152 | 152 | ||
153 | chcr = ctrl_inl(CHCR[chan->chan]); | 153 | chcr = ctrl_inl(dma_base_addr[chan->chan] + CHCR); |
154 | chcr &= ~(CHCR_DE | CHCR_TE | CHCR_IE); | 154 | chcr &= ~(CHCR_DE | CHCR_TE | CHCR_IE); |
155 | ctrl_outl(chcr, CHCR[chan->chan]); | 155 | ctrl_outl(chcr, (dma_base_addr[chan->chan] + CHCR)); |
156 | } | 156 | } |
157 | 157 | ||
158 | static int sh_dmac_xfer_dma(struct dma_channel *chan) | 158 | static int sh_dmac_xfer_dma(struct dma_channel *chan) |
@@ -183,12 +183,13 @@ static int sh_dmac_xfer_dma(struct dma_channel *chan) | |||
183 | */ | 183 | */ |
184 | if (chan->sar || (mach_is_dreamcast() && | 184 | if (chan->sar || (mach_is_dreamcast() && |
185 | chan->chan == PVR2_CASCADE_CHAN)) | 185 | chan->chan == PVR2_CASCADE_CHAN)) |
186 | ctrl_outl(chan->sar, SAR[chan->chan]); | 186 | ctrl_outl(chan->sar, (dma_base_addr[chan->chan]+SAR)); |
187 | if (chan->dar || (mach_is_dreamcast() && | 187 | if (chan->dar || (mach_is_dreamcast() && |
188 | chan->chan == PVR2_CASCADE_CHAN)) | 188 | chan->chan == PVR2_CASCADE_CHAN)) |
189 | ctrl_outl(chan->dar, DAR[chan->chan]); | 189 | ctrl_outl(chan->dar, (dma_base_addr[chan->chan] + DAR)); |
190 | 190 | ||
191 | ctrl_outl(chan->count >> calc_xmit_shift(chan), DMATCR[chan->chan]); | 191 | ctrl_outl(chan->count >> calc_xmit_shift(chan), |
192 | (dma_base_addr[chan->chan] + TCR)); | ||
192 | 193 | ||
193 | sh_dmac_enable_dma(chan); | 194 | sh_dmac_enable_dma(chan); |
194 | 195 | ||
@@ -197,36 +198,26 @@ static int sh_dmac_xfer_dma(struct dma_channel *chan) | |||
197 | 198 | ||
198 | static int sh_dmac_get_dma_residue(struct dma_channel *chan) | 199 | static int sh_dmac_get_dma_residue(struct dma_channel *chan) |
199 | { | 200 | { |
200 | if (!(ctrl_inl(CHCR[chan->chan]) & CHCR_DE)) | 201 | if (!(ctrl_inl(dma_base_addr[chan->chan] + CHCR) & CHCR_DE)) |
201 | return 0; | 202 | return 0; |
202 | 203 | ||
203 | return ctrl_inl(DMATCR[chan->chan]) << calc_xmit_shift(chan); | 204 | return ctrl_inl(dma_base_addr[chan->chan] + TCR) |
205 | << calc_xmit_shift(chan); | ||
204 | } | 206 | } |
205 | 207 | ||
206 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | 208 | static inline int dmaor_reset(int no) |
207 | defined(CONFIG_CPU_SUBTYPE_SH7721) || \ | ||
208 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ | ||
209 | defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
210 | #define dmaor_read_reg() ctrl_inw(DMAOR) | ||
211 | #define dmaor_write_reg(data) ctrl_outw(data, DMAOR) | ||
212 | #else | ||
213 | #define dmaor_read_reg() ctrl_inl(DMAOR) | ||
214 | #define dmaor_write_reg(data) ctrl_outl(data, DMAOR) | ||
215 | #endif | ||
216 | |||
217 | static inline int dmaor_reset(void) | ||
218 | { | 209 | { |
219 | unsigned long dmaor = dmaor_read_reg(); | 210 | unsigned long dmaor = dmaor_read_reg(no); |
220 | 211 | ||
221 | /* Try to clear the error flags first, incase they are set */ | 212 | /* Try to clear the error flags first, incase they are set */ |
222 | dmaor &= ~(DMAOR_NMIF | DMAOR_AE); | 213 | dmaor &= ~(DMAOR_NMIF | DMAOR_AE); |
223 | dmaor_write_reg(dmaor); | 214 | dmaor_write_reg(no, dmaor); |
224 | 215 | ||
225 | dmaor |= DMAOR_INIT; | 216 | dmaor |= DMAOR_INIT; |
226 | dmaor_write_reg(dmaor); | 217 | dmaor_write_reg(no, dmaor); |
227 | 218 | ||
228 | /* See if we got an error again */ | 219 | /* See if we got an error again */ |
229 | if ((dmaor_read_reg() & (DMAOR_AE | DMAOR_NMIF))) { | 220 | if ((dmaor_read_reg(no) & (DMAOR_AE | DMAOR_NMIF))) { |
230 | printk(KERN_ERR "dma-sh: Can't initialize DMAOR.\n"); | 221 | printk(KERN_ERR "dma-sh: Can't initialize DMAOR.\n"); |
231 | return -EINVAL; | 222 | return -EINVAL; |
232 | } | 223 | } |
@@ -237,10 +228,33 @@ static inline int dmaor_reset(void) | |||
237 | #if defined(CONFIG_CPU_SH4) | 228 | #if defined(CONFIG_CPU_SH4) |
238 | static irqreturn_t dma_err(int irq, void *dummy) | 229 | static irqreturn_t dma_err(int irq, void *dummy) |
239 | { | 230 | { |
240 | dmaor_reset(); | 231 | #if defined(CONFIG_SH_DMA_IRQ_MULTI) |
232 | int cnt = 0; | ||
233 | switch (irq) { | ||
234 | #if defined(DMTE6_IRQ) && defined(DMAE1_IRQ) | ||
235 | case DMTE6_IRQ: | ||
236 | cnt++; | ||
237 | #endif | ||
238 | case DMTE0_IRQ: | ||
239 | if (dmaor_read_reg(cnt) & (DMAOR_NMIF | DMAOR_AE)) { | ||
240 | disable_irq(irq); | ||
241 | /* DMA multi and error IRQ */ | ||
242 | return IRQ_HANDLED; | ||
243 | } | ||
244 | default: | ||
245 | return IRQ_NONE; | ||
246 | } | ||
247 | #else | ||
248 | dmaor_reset(0); | ||
249 | #if defined(CONFIG_CPU_SUBTYPE_SH7723) || \ | ||
250 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ | ||
251 | defined(CONFIG_CPU_SUBTYPE_SH7785) | ||
252 | dmaor_reset(1); | ||
253 | #endif | ||
241 | disable_irq(irq); | 254 | disable_irq(irq); |
242 | 255 | ||
243 | return IRQ_HANDLED; | 256 | return IRQ_HANDLED; |
257 | #endif | ||
244 | } | 258 | } |
245 | #endif | 259 | #endif |
246 | 260 | ||
@@ -259,24 +273,59 @@ static struct dma_info sh_dmac_info = { | |||
259 | .flags = DMAC_CHANNELS_TEI_CAPABLE, | 273 | .flags = DMAC_CHANNELS_TEI_CAPABLE, |
260 | }; | 274 | }; |
261 | 275 | ||
276 | #ifdef CONFIG_CPU_SH4 | ||
277 | static unsigned int get_dma_error_irq(int n) | ||
278 | { | ||
279 | #if defined(CONFIG_SH_DMA_IRQ_MULTI) | ||
280 | return (n == 0) ? get_dmte_irq(0) : get_dmte_irq(6); | ||
281 | #else | ||
282 | return (n == 0) ? DMAE0_IRQ : | ||
283 | #if defined(DMAE1_IRQ) | ||
284 | DMAE1_IRQ; | ||
285 | #else | ||
286 | -1; | ||
287 | #endif | ||
288 | #endif | ||
289 | } | ||
290 | #endif | ||
291 | |||
262 | static int __init sh_dmac_init(void) | 292 | static int __init sh_dmac_init(void) |
263 | { | 293 | { |
264 | struct dma_info *info = &sh_dmac_info; | 294 | struct dma_info *info = &sh_dmac_info; |
265 | int i; | 295 | int i; |
266 | 296 | ||
267 | #ifdef CONFIG_CPU_SH4 | 297 | #ifdef CONFIG_CPU_SH4 |
268 | i = request_irq(DMAE_IRQ, dma_err, IRQF_DISABLED, "DMAC Address Error", 0); | 298 | int n; |
269 | if (unlikely(i < 0)) | 299 | |
270 | return i; | 300 | for (n = 0; n < NR_DMAE; n++) { |
301 | i = request_irq(get_dma_error_irq(n), dma_err, | ||
302 | #if defined(CONFIG_SH_DMA_IRQ_MULTI) | ||
303 | IRQF_SHARED, | ||
304 | #else | ||
305 | IRQF_DISABLED, | ||
271 | #endif | 306 | #endif |
307 | dmae_name[n], (void *)dmae_name[n]); | ||
308 | if (unlikely(i < 0)) { | ||
309 | printk(KERN_ERR "%s request_irq fail\n", dmae_name[n]); | ||
310 | return i; | ||
311 | } | ||
312 | } | ||
313 | #endif /* CONFIG_CPU_SH4 */ | ||
272 | 314 | ||
273 | /* | 315 | /* |
274 | * Initialize DMAOR, and clean up any error flags that may have | 316 | * Initialize DMAOR, and clean up any error flags that may have |
275 | * been set. | 317 | * been set. |
276 | */ | 318 | */ |
277 | i = dmaor_reset(); | 319 | i = dmaor_reset(0); |
320 | if (unlikely(i != 0)) | ||
321 | return i; | ||
322 | #if defined(CONFIG_CPU_SUBTYPE_SH7723) || \ | ||
323 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ | ||
324 | defined(CONFIG_CPU_SUBTYPE_SH7785) | ||
325 | i = dmaor_reset(1); | ||
278 | if (unlikely(i != 0)) | 326 | if (unlikely(i != 0)) |
279 | return i; | 327 | return i; |
328 | #endif | ||
280 | 329 | ||
281 | return register_dmac(info); | 330 | return register_dmac(info); |
282 | } | 331 | } |
@@ -284,8 +333,12 @@ static int __init sh_dmac_init(void) | |||
284 | static void __exit sh_dmac_exit(void) | 333 | static void __exit sh_dmac_exit(void) |
285 | { | 334 | { |
286 | #ifdef CONFIG_CPU_SH4 | 335 | #ifdef CONFIG_CPU_SH4 |
287 | free_irq(DMAE_IRQ, 0); | 336 | int n; |
288 | #endif | 337 | |
338 | for (n = 0; n < NR_DMAE; n++) { | ||
339 | free_irq(get_dma_error_irq(n), (void *)dmae_name[n]); | ||
340 | } | ||
341 | #endif /* CONFIG_CPU_SH4 */ | ||
289 | unregister_dmac(&sh_dmac_info); | 342 | unregister_dmac(&sh_dmac_info); |
290 | } | 343 | } |
291 | 344 | ||
diff --git a/arch/sh/drivers/dma/dma-sh.h b/arch/sh/drivers/dma/dma-sh.h deleted file mode 100644 index 05fecd5428e4..000000000000 --- a/arch/sh/drivers/dma/dma-sh.h +++ /dev/null | |||
@@ -1,75 +0,0 @@ | |||
1 | /* | ||
2 | * arch/sh/drivers/dma/dma-sh.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Takashi YOSHII | ||
5 | * Copyright (C) 2003 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #ifndef __DMA_SH_H | ||
12 | #define __DMA_SH_H | ||
13 | |||
14 | #include <cpu/dma.h> | ||
15 | |||
16 | /* Definitions for the SuperH DMAC */ | ||
17 | #define REQ_L 0x00000000 | ||
18 | #define REQ_E 0x00080000 | ||
19 | #define RACK_H 0x00000000 | ||
20 | #define RACK_L 0x00040000 | ||
21 | #define ACK_R 0x00000000 | ||
22 | #define ACK_W 0x00020000 | ||
23 | #define ACK_H 0x00000000 | ||
24 | #define ACK_L 0x00010000 | ||
25 | #define DM_INC 0x00004000 | ||
26 | #define DM_DEC 0x00008000 | ||
27 | #define SM_INC 0x00001000 | ||
28 | #define SM_DEC 0x00002000 | ||
29 | #define RS_IN 0x00000200 | ||
30 | #define RS_OUT 0x00000300 | ||
31 | #define TS_BLK 0x00000040 | ||
32 | #define TM_BUR 0x00000020 | ||
33 | #define CHCR_DE 0x00000001 | ||
34 | #define CHCR_TE 0x00000002 | ||
35 | #define CHCR_IE 0x00000004 | ||
36 | |||
37 | /* DMAOR definitions */ | ||
38 | #define DMAOR_AE 0x00000004 | ||
39 | #define DMAOR_NMIF 0x00000002 | ||
40 | #define DMAOR_DME 0x00000001 | ||
41 | |||
42 | /* | ||
43 | * Define the default configuration for dual address memory-memory transfer. | ||
44 | * The 0x400 value represents auto-request, external->external. | ||
45 | */ | ||
46 | #define RS_DUAL (DM_INC | SM_INC | 0x400 | TS_32) | ||
47 | |||
48 | #define MAX_DMAC_CHANNELS (CONFIG_NR_ONCHIP_DMA_CHANNELS) | ||
49 | |||
50 | /* | ||
51 | * Subtypes that have fewer channels than this simply need to change | ||
52 | * CONFIG_NR_ONCHIP_DMA_CHANNELS. Likewise, subtypes with a larger number | ||
53 | * of channels should expand on this. | ||
54 | * | ||
55 | * For most subtypes we can easily figure these values out with some | ||
56 | * basic calculation, unfortunately on other subtypes these are more | ||
57 | * scattered, so we just leave it unrolled for simplicity. | ||
58 | */ | ||
59 | #define SAR ((unsigned long[]){SH_DMAC_BASE + 0x00, SH_DMAC_BASE + 0x10, \ | ||
60 | SH_DMAC_BASE + 0x20, SH_DMAC_BASE + 0x30, \ | ||
61 | SH_DMAC_BASE + 0x50, SH_DMAC_BASE + 0x60}) | ||
62 | #define DAR ((unsigned long[]){SH_DMAC_BASE + 0x04, SH_DMAC_BASE + 0x14, \ | ||
63 | SH_DMAC_BASE + 0x24, SH_DMAC_BASE + 0x34, \ | ||
64 | SH_DMAC_BASE + 0x54, SH_DMAC_BASE + 0x64}) | ||
65 | #define DMATCR ((unsigned long[]){SH_DMAC_BASE + 0x08, SH_DMAC_BASE + 0x18, \ | ||
66 | SH_DMAC_BASE + 0x28, SH_DMAC_BASE + 0x38, \ | ||
67 | SH_DMAC_BASE + 0x58, SH_DMAC_BASE + 0x68}) | ||
68 | #define CHCR ((unsigned long[]){SH_DMAC_BASE + 0x0c, SH_DMAC_BASE + 0x1c, \ | ||
69 | SH_DMAC_BASE + 0x2c, SH_DMAC_BASE + 0x3c, \ | ||
70 | SH_DMAC_BASE + 0x5c, SH_DMAC_BASE + 0x6c}) | ||
71 | |||
72 | #define DMAOR (SH_DMAC_BASE + 0x40) | ||
73 | |||
74 | #endif /* __DMA_SH_H */ | ||
75 | |||
diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c index 078dc44d6b08..773d575a04b9 100644 --- a/arch/sh/drivers/pci/pci-sh7780.c +++ b/arch/sh/drivers/pci/pci-sh7780.c | |||
@@ -127,8 +127,8 @@ int __init sh7780_pcic_init(struct sh4_pci_address_map *map) | |||
127 | pci_write_reg(word, SH4_PCILSR0); | 127 | pci_write_reg(word, SH4_PCILSR0); |
128 | pci_write_reg(0x00000001, SH4_PCILSR1); | 128 | pci_write_reg(0x00000001, SH4_PCILSR1); |
129 | /* Set the values on window 0 PCI config registers */ | 129 | /* Set the values on window 0 PCI config registers */ |
130 | word = (CONFIG_MEMORY_SIZE > 0x08000000) ? 0x10000000 : 0x08000000; | 130 | word = CONFIG_MEMORY_START | (CONFIG_MEMORY_SIZE - 0x01000000); |
131 | pci_write_reg(word | 0xa0000000, SH4_PCILAR0); | 131 | pci_write_reg(word, SH4_PCILAR0); |
132 | pci_write_reg(word, SH7780_PCIMBAR0); | 132 | pci_write_reg(word, SH7780_PCIMBAR0); |
133 | /* Set the values on window 1 PCI config registers */ | 133 | /* Set the values on window 1 PCI config registers */ |
134 | pci_write_reg(0x00000000, SH4_PCILAR1); | 134 | pci_write_reg(0x00000000, SH4_PCILAR1); |
diff --git a/arch/sh/include/asm/addrspace.h b/arch/sh/include/asm/addrspace.h index 36736c7e93db..80d40813e057 100644 --- a/arch/sh/include/asm/addrspace.h +++ b/arch/sh/include/asm/addrspace.h | |||
@@ -31,7 +31,7 @@ | |||
31 | /* Returns the physical address of a PnSEG (n=1,2) address */ | 31 | /* Returns the physical address of a PnSEG (n=1,2) address */ |
32 | #define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff) | 32 | #define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff) |
33 | 33 | ||
34 | #ifdef CONFIG_29BIT | 34 | #if defined(CONFIG_29BIT) || defined(CONFIG_PMB_FIXED) |
35 | /* | 35 | /* |
36 | * Map an address to a certain privileged segment | 36 | * Map an address to a certain privileged segment |
37 | */ | 37 | */ |
@@ -43,7 +43,7 @@ | |||
43 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) | 43 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) |
44 | #define P4SEGADDR(a) \ | 44 | #define P4SEGADDR(a) \ |
45 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) | 45 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) |
46 | #endif /* 29BIT */ | 46 | #endif /* 29BIT || PMB_FIXED */ |
47 | #endif /* P1SEG */ | 47 | #endif /* P1SEG */ |
48 | 48 | ||
49 | /* Check if an address can be reached in 29 bits */ | 49 | /* Check if an address can be reached in 29 bits */ |
diff --git a/arch/sh/include/asm/atomic-irq.h b/arch/sh/include/asm/atomic-irq.h index 74f7943cff6f..a0b348068cae 100644 --- a/arch/sh/include/asm/atomic-irq.h +++ b/arch/sh/include/asm/atomic-irq.h | |||
@@ -11,7 +11,7 @@ static inline void atomic_add(int i, atomic_t *v) | |||
11 | unsigned long flags; | 11 | unsigned long flags; |
12 | 12 | ||
13 | local_irq_save(flags); | 13 | local_irq_save(flags); |
14 | *(long *)v += i; | 14 | v->counter += i; |
15 | local_irq_restore(flags); | 15 | local_irq_restore(flags); |
16 | } | 16 | } |
17 | 17 | ||
@@ -20,7 +20,7 @@ static inline void atomic_sub(int i, atomic_t *v) | |||
20 | unsigned long flags; | 20 | unsigned long flags; |
21 | 21 | ||
22 | local_irq_save(flags); | 22 | local_irq_save(flags); |
23 | *(long *)v -= i; | 23 | v->counter -= i; |
24 | local_irq_restore(flags); | 24 | local_irq_restore(flags); |
25 | } | 25 | } |
26 | 26 | ||
@@ -29,9 +29,9 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
29 | unsigned long temp, flags; | 29 | unsigned long temp, flags; |
30 | 30 | ||
31 | local_irq_save(flags); | 31 | local_irq_save(flags); |
32 | temp = *(long *)v; | 32 | temp = v->counter; |
33 | temp += i; | 33 | temp += i; |
34 | *(long *)v = temp; | 34 | v->counter = temp; |
35 | local_irq_restore(flags); | 35 | local_irq_restore(flags); |
36 | 36 | ||
37 | return temp; | 37 | return temp; |
@@ -42,9 +42,9 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
42 | unsigned long temp, flags; | 42 | unsigned long temp, flags; |
43 | 43 | ||
44 | local_irq_save(flags); | 44 | local_irq_save(flags); |
45 | temp = *(long *)v; | 45 | temp = v->counter; |
46 | temp -= i; | 46 | temp -= i; |
47 | *(long *)v = temp; | 47 | v->counter = temp; |
48 | local_irq_restore(flags); | 48 | local_irq_restore(flags); |
49 | 49 | ||
50 | return temp; | 50 | return temp; |
@@ -55,7 +55,7 @@ static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | |||
55 | unsigned long flags; | 55 | unsigned long flags; |
56 | 56 | ||
57 | local_irq_save(flags); | 57 | local_irq_save(flags); |
58 | *(long *)v &= ~mask; | 58 | v->counter &= ~mask; |
59 | local_irq_restore(flags); | 59 | local_irq_restore(flags); |
60 | } | 60 | } |
61 | 61 | ||
@@ -64,7 +64,7 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |||
64 | unsigned long flags; | 64 | unsigned long flags; |
65 | 65 | ||
66 | local_irq_save(flags); | 66 | local_irq_save(flags); |
67 | *(long *)v |= mask; | 67 | v->counter |= mask; |
68 | local_irq_restore(flags); | 68 | local_irq_restore(flags); |
69 | } | 69 | } |
70 | 70 | ||
diff --git a/arch/sh/include/asm/bitops-llsc.h b/arch/sh/include/asm/bitops-llsc.h index 1d2fc0b010ad..d8328be06191 100644 --- a/arch/sh/include/asm/bitops-llsc.h +++ b/arch/sh/include/asm/bitops-llsc.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef __ASM_SH_BITOPS_LLSC_H | 1 | #ifndef __ASM_SH_BITOPS_LLSC_H |
2 | #define __ASM_SH_BITOPS_LLSC_H | 2 | #define __ASM_SH_BITOPS_LLSC_H |
3 | 3 | ||
4 | static inline void set_bit(int nr, volatile void * addr) | 4 | static inline void set_bit(int nr, volatile void *addr) |
5 | { | 5 | { |
6 | int mask; | 6 | int mask; |
7 | volatile unsigned int *a = addr; | 7 | volatile unsigned int *a = addr; |
@@ -13,16 +13,16 @@ static inline void set_bit(int nr, volatile void * addr) | |||
13 | __asm__ __volatile__ ( | 13 | __asm__ __volatile__ ( |
14 | "1: \n\t" | 14 | "1: \n\t" |
15 | "movli.l @%1, %0 ! set_bit \n\t" | 15 | "movli.l @%1, %0 ! set_bit \n\t" |
16 | "or %3, %0 \n\t" | 16 | "or %2, %0 \n\t" |
17 | "movco.l %0, @%1 \n\t" | 17 | "movco.l %0, @%1 \n\t" |
18 | "bf 1b \n\t" | 18 | "bf 1b \n\t" |
19 | : "=&z" (tmp), "=r" (a) | 19 | : "=&z" (tmp) |
20 | : "1" (a), "r" (mask) | 20 | : "r" (a), "r" (mask) |
21 | : "t", "memory" | 21 | : "t", "memory" |
22 | ); | 22 | ); |
23 | } | 23 | } |
24 | 24 | ||
25 | static inline void clear_bit(int nr, volatile void * addr) | 25 | static inline void clear_bit(int nr, volatile void *addr) |
26 | { | 26 | { |
27 | int mask; | 27 | int mask; |
28 | volatile unsigned int *a = addr; | 28 | volatile unsigned int *a = addr; |
@@ -34,16 +34,16 @@ static inline void clear_bit(int nr, volatile void * addr) | |||
34 | __asm__ __volatile__ ( | 34 | __asm__ __volatile__ ( |
35 | "1: \n\t" | 35 | "1: \n\t" |
36 | "movli.l @%1, %0 ! clear_bit \n\t" | 36 | "movli.l @%1, %0 ! clear_bit \n\t" |
37 | "and %3, %0 \n\t" | 37 | "and %2, %0 \n\t" |
38 | "movco.l %0, @%1 \n\t" | 38 | "movco.l %0, @%1 \n\t" |
39 | "bf 1b \n\t" | 39 | "bf 1b \n\t" |
40 | : "=&z" (tmp), "=r" (a) | 40 | : "=&z" (tmp) |
41 | : "1" (a), "r" (~mask) | 41 | : "r" (a), "r" (~mask) |
42 | : "t", "memory" | 42 | : "t", "memory" |
43 | ); | 43 | ); |
44 | } | 44 | } |
45 | 45 | ||
46 | static inline void change_bit(int nr, volatile void * addr) | 46 | static inline void change_bit(int nr, volatile void *addr) |
47 | { | 47 | { |
48 | int mask; | 48 | int mask; |
49 | volatile unsigned int *a = addr; | 49 | volatile unsigned int *a = addr; |
@@ -55,16 +55,16 @@ static inline void change_bit(int nr, volatile void * addr) | |||
55 | __asm__ __volatile__ ( | 55 | __asm__ __volatile__ ( |
56 | "1: \n\t" | 56 | "1: \n\t" |
57 | "movli.l @%1, %0 ! change_bit \n\t" | 57 | "movli.l @%1, %0 ! change_bit \n\t" |
58 | "xor %3, %0 \n\t" | 58 | "xor %2, %0 \n\t" |
59 | "movco.l %0, @%1 \n\t" | 59 | "movco.l %0, @%1 \n\t" |
60 | "bf 1b \n\t" | 60 | "bf 1b \n\t" |
61 | : "=&z" (tmp), "=r" (a) | 61 | : "=&z" (tmp) |
62 | : "1" (a), "r" (mask) | 62 | : "r" (a), "r" (mask) |
63 | : "t", "memory" | 63 | : "t", "memory" |
64 | ); | 64 | ); |
65 | } | 65 | } |
66 | 66 | ||
67 | static inline int test_and_set_bit(int nr, volatile void * addr) | 67 | static inline int test_and_set_bit(int nr, volatile void *addr) |
68 | { | 68 | { |
69 | int mask, retval; | 69 | int mask, retval; |
70 | volatile unsigned int *a = addr; | 70 | volatile unsigned int *a = addr; |
@@ -75,21 +75,21 @@ static inline int test_and_set_bit(int nr, volatile void * addr) | |||
75 | 75 | ||
76 | __asm__ __volatile__ ( | 76 | __asm__ __volatile__ ( |
77 | "1: \n\t" | 77 | "1: \n\t" |
78 | "movli.l @%1, %0 ! test_and_set_bit \n\t" | 78 | "movli.l @%2, %0 ! test_and_set_bit \n\t" |
79 | "mov %0, %2 \n\t" | 79 | "mov %0, %1 \n\t" |
80 | "or %4, %0 \n\t" | 80 | "or %3, %0 \n\t" |
81 | "movco.l %0, @%1 \n\t" | 81 | "movco.l %0, @%2 \n\t" |
82 | "bf 1b \n\t" | 82 | "bf 1b \n\t" |
83 | "and %4, %2 \n\t" | 83 | "and %3, %1 \n\t" |
84 | : "=&z" (tmp), "=r" (a), "=&r" (retval) | 84 | : "=&z" (tmp), "=&r" (retval) |
85 | : "1" (a), "r" (mask) | 85 | : "r" (a), "r" (mask) |
86 | : "t", "memory" | 86 | : "t", "memory" |
87 | ); | 87 | ); |
88 | 88 | ||
89 | return retval != 0; | 89 | return retval != 0; |
90 | } | 90 | } |
91 | 91 | ||
92 | static inline int test_and_clear_bit(int nr, volatile void * addr) | 92 | static inline int test_and_clear_bit(int nr, volatile void *addr) |
93 | { | 93 | { |
94 | int mask, retval; | 94 | int mask, retval; |
95 | volatile unsigned int *a = addr; | 95 | volatile unsigned int *a = addr; |
@@ -100,22 +100,22 @@ static inline int test_and_clear_bit(int nr, volatile void * addr) | |||
100 | 100 | ||
101 | __asm__ __volatile__ ( | 101 | __asm__ __volatile__ ( |
102 | "1: \n\t" | 102 | "1: \n\t" |
103 | "movli.l @%1, %0 ! test_and_clear_bit \n\t" | 103 | "movli.l @%2, %0 ! test_and_clear_bit \n\t" |
104 | "mov %0, %2 \n\t" | 104 | "mov %0, %1 \n\t" |
105 | "and %5, %0 \n\t" | 105 | "and %4, %0 \n\t" |
106 | "movco.l %0, @%1 \n\t" | 106 | "movco.l %0, @%2 \n\t" |
107 | "bf 1b \n\t" | 107 | "bf 1b \n\t" |
108 | "and %4, %2 \n\t" | 108 | "and %3, %1 \n\t" |
109 | "synco \n\t" | 109 | "synco \n\t" |
110 | : "=&z" (tmp), "=r" (a), "=&r" (retval) | 110 | : "=&z" (tmp), "=&r" (retval) |
111 | : "1" (a), "r" (mask), "r" (~mask) | 111 | : "r" (a), "r" (mask), "r" (~mask) |
112 | : "t", "memory" | 112 | : "t", "memory" |
113 | ); | 113 | ); |
114 | 114 | ||
115 | return retval != 0; | 115 | return retval != 0; |
116 | } | 116 | } |
117 | 117 | ||
118 | static inline int test_and_change_bit(int nr, volatile void * addr) | 118 | static inline int test_and_change_bit(int nr, volatile void *addr) |
119 | { | 119 | { |
120 | int mask, retval; | 120 | int mask, retval; |
121 | volatile unsigned int *a = addr; | 121 | volatile unsigned int *a = addr; |
@@ -126,15 +126,15 @@ static inline int test_and_change_bit(int nr, volatile void * addr) | |||
126 | 126 | ||
127 | __asm__ __volatile__ ( | 127 | __asm__ __volatile__ ( |
128 | "1: \n\t" | 128 | "1: \n\t" |
129 | "movli.l @%1, %0 ! test_and_change_bit \n\t" | 129 | "movli.l @%2, %0 ! test_and_change_bit \n\t" |
130 | "mov %0, %2 \n\t" | 130 | "mov %0, %1 \n\t" |
131 | "xor %4, %0 \n\t" | 131 | "xor %3, %0 \n\t" |
132 | "movco.l %0, @%1 \n\t" | 132 | "movco.l %0, @%2 \n\t" |
133 | "bf 1b \n\t" | 133 | "bf 1b \n\t" |
134 | "and %4, %2 \n\t" | 134 | "and %3, %1 \n\t" |
135 | "synco \n\t" | 135 | "synco \n\t" |
136 | : "=&z" (tmp), "=r" (a), "=&r" (retval) | 136 | : "=&z" (tmp), "=&r" (retval) |
137 | : "1" (a), "r" (mask) | 137 | : "r" (a), "r" (mask) |
138 | : "t", "memory" | 138 | : "t", "memory" |
139 | ); | 139 | ); |
140 | 140 | ||
diff --git a/arch/sh/include/asm/clock.h b/arch/sh/include/asm/clock.h index f9c88583d90a..2f6c9627bc1f 100644 --- a/arch/sh/include/asm/clock.h +++ b/arch/sh/include/asm/clock.h | |||
@@ -15,6 +15,7 @@ struct clk_ops { | |||
15 | void (*disable)(struct clk *clk); | 15 | void (*disable)(struct clk *clk); |
16 | void (*recalc)(struct clk *clk); | 16 | void (*recalc)(struct clk *clk); |
17 | int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id); | 17 | int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id); |
18 | int (*set_parent)(struct clk *clk, struct clk *parent); | ||
18 | long (*round_rate)(struct clk *clk, unsigned long rate); | 19 | long (*round_rate)(struct clk *clk, unsigned long rate); |
19 | }; | 20 | }; |
20 | 21 | ||
diff --git a/arch/sh/include/asm/cmpxchg-llsc.h b/arch/sh/include/asm/cmpxchg-llsc.h index aee3bf286581..0fac3da536ca 100644 --- a/arch/sh/include/asm/cmpxchg-llsc.h +++ b/arch/sh/include/asm/cmpxchg-llsc.h | |||
@@ -8,14 +8,14 @@ static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) | |||
8 | 8 | ||
9 | __asm__ __volatile__ ( | 9 | __asm__ __volatile__ ( |
10 | "1: \n\t" | 10 | "1: \n\t" |
11 | "movli.l @%1, %0 ! xchg_u32 \n\t" | 11 | "movli.l @%2, %0 ! xchg_u32 \n\t" |
12 | "mov %0, %2 \n\t" | 12 | "mov %0, %1 \n\t" |
13 | "mov %4, %0 \n\t" | 13 | "mov %3, %0 \n\t" |
14 | "movco.l %0, @%1 \n\t" | 14 | "movco.l %0, @%2 \n\t" |
15 | "bf 1b \n\t" | 15 | "bf 1b \n\t" |
16 | "synco \n\t" | 16 | "synco \n\t" |
17 | : "=&z"(tmp), "=r" (m), "=&r" (retval) | 17 | : "=&z"(tmp), "=&r" (retval) |
18 | : "1" (m), "r" (val) | 18 | : "r" (m), "r" (val) |
19 | : "t", "memory" | 19 | : "t", "memory" |
20 | ); | 20 | ); |
21 | 21 | ||
@@ -29,14 +29,14 @@ static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) | |||
29 | 29 | ||
30 | __asm__ __volatile__ ( | 30 | __asm__ __volatile__ ( |
31 | "1: \n\t" | 31 | "1: \n\t" |
32 | "movli.l @%1, %0 ! xchg_u8 \n\t" | 32 | "movli.l @%2, %0 ! xchg_u8 \n\t" |
33 | "mov %0, %2 \n\t" | 33 | "mov %0, %1 \n\t" |
34 | "mov %4, %0 \n\t" | 34 | "mov %3, %0 \n\t" |
35 | "movco.l %0, @%1 \n\t" | 35 | "movco.l %0, @%2 \n\t" |
36 | "bf 1b \n\t" | 36 | "bf 1b \n\t" |
37 | "synco \n\t" | 37 | "synco \n\t" |
38 | : "=&z"(tmp), "=r" (m), "=&r" (retval) | 38 | : "=&z"(tmp), "=&r" (retval) |
39 | : "1" (m), "r" (val & 0xff) | 39 | : "r" (m), "r" (val & 0xff) |
40 | : "t", "memory" | 40 | : "t", "memory" |
41 | ); | 41 | ); |
42 | 42 | ||
@@ -51,17 +51,17 @@ __cmpxchg_u32(volatile int *m, unsigned long old, unsigned long new) | |||
51 | 51 | ||
52 | __asm__ __volatile__ ( | 52 | __asm__ __volatile__ ( |
53 | "1: \n\t" | 53 | "1: \n\t" |
54 | "movli.l @%1, %0 ! __cmpxchg_u32 \n\t" | 54 | "movli.l @%2, %0 ! __cmpxchg_u32 \n\t" |
55 | "mov %0, %2 \n\t" | 55 | "mov %0, %1 \n\t" |
56 | "cmp/eq %2, %4 \n\t" | 56 | "cmp/eq %1, %3 \n\t" |
57 | "bf 2f \n\t" | 57 | "bf 2f \n\t" |
58 | "mov %5, %0 \n\t" | 58 | "mov %3, %0 \n\t" |
59 | "2: \n\t" | 59 | "2: \n\t" |
60 | "movco.l %0, @%1 \n\t" | 60 | "movco.l %0, @%2 \n\t" |
61 | "bf 1b \n\t" | 61 | "bf 1b \n\t" |
62 | "synco \n\t" | 62 | "synco \n\t" |
63 | : "=&z" (tmp), "=r" (m), "=&r" (retval) | 63 | : "=&z" (tmp), "=&r" (retval) |
64 | : "1" (m), "r" (old), "r" (new) | 64 | : "r" (m), "r" (old), "r" (new) |
65 | : "t", "memory" | 65 | : "t", "memory" |
66 | ); | 66 | ); |
67 | 67 | ||
diff --git a/arch/sh/include/asm/cpu-features.h b/arch/sh/include/asm/cpu-features.h index 86308aa39731..694abe490edb 100644 --- a/arch/sh/include/asm/cpu-features.h +++ b/arch/sh/include/asm/cpu-features.h | |||
@@ -21,5 +21,6 @@ | |||
21 | #define CPU_HAS_LLSC 0x0040 /* movli.l/movco.l */ | 21 | #define CPU_HAS_LLSC 0x0040 /* movli.l/movco.l */ |
22 | #define CPU_HAS_L2_CACHE 0x0080 /* Secondary cache / URAM */ | 22 | #define CPU_HAS_L2_CACHE 0x0080 /* Secondary cache / URAM */ |
23 | #define CPU_HAS_OP32 0x0100 /* 32-bit instruction support */ | 23 | #define CPU_HAS_OP32 0x0100 /* 32-bit instruction support */ |
24 | #define CPU_HAS_PTEAEX 0x0200 /* PTE ASID Extension support */ | ||
24 | 25 | ||
25 | #endif /* __ASM_SH_CPU_FEATURES_H */ | 26 | #endif /* __ASM_SH_CPU_FEATURES_H */ |
diff --git a/arch/sh/include/asm/dma-sh.h b/arch/sh/include/asm/dma-sh.h new file mode 100644 index 000000000000..0c8f8e14622a --- /dev/null +++ b/arch/sh/include/asm/dma-sh.h | |||
@@ -0,0 +1,118 @@ | |||
1 | /* | ||
2 | * arch/sh/include/asm/dma-sh.h | ||
3 | * | ||
4 | * Copyright (C) 2000 Takashi YOSHII | ||
5 | * Copyright (C) 2003 Paul Mundt | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #ifndef __DMA_SH_H | ||
12 | #define __DMA_SH_H | ||
13 | |||
14 | #include <asm/dma.h> | ||
15 | #include <cpu/dma.h> | ||
16 | |||
17 | /* DMAOR contorl: The DMAOR access size is different by CPU.*/ | ||
18 | #if defined(CONFIG_CPU_SUBTYPE_SH7723) || \ | ||
19 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ | ||
20 | defined(CONFIG_CPU_SUBTYPE_SH7785) | ||
21 | #define dmaor_read_reg(n) \ | ||
22 | (n ? ctrl_inw(SH_DMAC_BASE1 + DMAOR) \ | ||
23 | : ctrl_inw(SH_DMAC_BASE0 + DMAOR)) | ||
24 | #define dmaor_write_reg(n, data) \ | ||
25 | (n ? ctrl_outw(data, SH_DMAC_BASE1 + DMAOR) \ | ||
26 | : ctrl_outw(data, SH_DMAC_BASE0 + DMAOR)) | ||
27 | #else /* Other CPU */ | ||
28 | #define dmaor_read_reg(n) ctrl_inw(SH_DMAC_BASE0 + DMAOR) | ||
29 | #define dmaor_write_reg(n, data) ctrl_outw(data, SH_DMAC_BASE0 + DMAOR) | ||
30 | #endif | ||
31 | |||
32 | static int dmte_irq_map[] __maybe_unused = { | ||
33 | #if (MAX_DMA_CHANNELS >= 4) | ||
34 | DMTE0_IRQ, | ||
35 | DMTE0_IRQ + 1, | ||
36 | DMTE0_IRQ + 2, | ||
37 | DMTE0_IRQ + 3, | ||
38 | #endif | ||
39 | #if (MAX_DMA_CHANNELS >= 6) | ||
40 | DMTE4_IRQ, | ||
41 | DMTE4_IRQ + 1, | ||
42 | #endif | ||
43 | #if (MAX_DMA_CHANNELS >= 8) | ||
44 | DMTE6_IRQ, | ||
45 | DMTE6_IRQ + 1, | ||
46 | #endif | ||
47 | #if (MAX_DMA_CHANNELS >= 12) | ||
48 | DMTE8_IRQ, | ||
49 | DMTE9_IRQ, | ||
50 | DMTE10_IRQ, | ||
51 | DMTE11_IRQ, | ||
52 | #endif | ||
53 | }; | ||
54 | |||
55 | /* Definitions for the SuperH DMAC */ | ||
56 | #define REQ_L 0x00000000 | ||
57 | #define REQ_E 0x00080000 | ||
58 | #define RACK_H 0x00000000 | ||
59 | #define RACK_L 0x00040000 | ||
60 | #define ACK_R 0x00000000 | ||
61 | #define ACK_W 0x00020000 | ||
62 | #define ACK_H 0x00000000 | ||
63 | #define ACK_L 0x00010000 | ||
64 | #define DM_INC 0x00004000 | ||
65 | #define DM_DEC 0x00008000 | ||
66 | #define SM_INC 0x00001000 | ||
67 | #define SM_DEC 0x00002000 | ||
68 | #define RS_IN 0x00000200 | ||
69 | #define RS_OUT 0x00000300 | ||
70 | #define TS_BLK 0x00000040 | ||
71 | #define TM_BUR 0x00000020 | ||
72 | #define CHCR_DE 0x00000001 | ||
73 | #define CHCR_TE 0x00000002 | ||
74 | #define CHCR_IE 0x00000004 | ||
75 | |||
76 | /* DMAOR definitions */ | ||
77 | #define DMAOR_AE 0x00000004 | ||
78 | #define DMAOR_NMIF 0x00000002 | ||
79 | #define DMAOR_DME 0x00000001 | ||
80 | |||
81 | /* | ||
82 | * Define the default configuration for dual address memory-memory transfer. | ||
83 | * The 0x400 value represents auto-request, external->external. | ||
84 | */ | ||
85 | #define RS_DUAL (DM_INC | SM_INC | 0x400 | TS_32) | ||
86 | |||
87 | /* DMA base address */ | ||
88 | static u32 dma_base_addr[] __maybe_unused = { | ||
89 | #if (MAX_DMA_CHANNELS >= 4) | ||
90 | SH_DMAC_BASE0 + 0x00, /* channel 0 */ | ||
91 | SH_DMAC_BASE0 + 0x10, | ||
92 | SH_DMAC_BASE0 + 0x20, | ||
93 | SH_DMAC_BASE0 + 0x30, | ||
94 | #endif | ||
95 | #if (MAX_DMA_CHANNELS >= 6) | ||
96 | SH_DMAC_BASE0 + 0x50, | ||
97 | SH_DMAC_BASE0 + 0x60, | ||
98 | #endif | ||
99 | #if (MAX_DMA_CHANNELS >= 8) | ||
100 | SH_DMAC_BASE1 + 0x00, | ||
101 | SH_DMAC_BASE1 + 0x10, | ||
102 | #endif | ||
103 | #if (MAX_DMA_CHANNELS >= 12) | ||
104 | SH_DMAC_BASE1 + 0x20, | ||
105 | SH_DMAC_BASE1 + 0x30, | ||
106 | SH_DMAC_BASE1 + 0x50, | ||
107 | SH_DMAC_BASE1 + 0x60, /* channel 11 */ | ||
108 | #endif | ||
109 | }; | ||
110 | |||
111 | /* DMA register */ | ||
112 | #define SAR 0x00 | ||
113 | #define DAR 0x04 | ||
114 | #define TCR 0x08 | ||
115 | #define CHCR 0x0C | ||
116 | #define DMAOR 0x40 | ||
117 | |||
118 | #endif /* __DMA_SH_H */ | ||
diff --git a/arch/sh/include/asm/dma.h b/arch/sh/include/asm/dma.h index beca7128e2ab..6bd178473878 100644 --- a/arch/sh/include/asm/dma.h +++ b/arch/sh/include/asm/dma.h | |||
@@ -25,9 +25,9 @@ | |||
25 | #define MAX_DMA_ADDRESS (PAGE_OFFSET+0x10000000) | 25 | #define MAX_DMA_ADDRESS (PAGE_OFFSET+0x10000000) |
26 | 26 | ||
27 | #ifdef CONFIG_NR_DMA_CHANNELS | 27 | #ifdef CONFIG_NR_DMA_CHANNELS |
28 | # define MAX_DMA_CHANNELS (CONFIG_NR_DMA_CHANNELS) | 28 | # define MAX_DMA_CHANNELS (CONFIG_NR_DMA_CHANNELS) |
29 | #else | 29 | #else |
30 | # define MAX_DMA_CHANNELS (CONFIG_NR_ONCHIP_DMA_CHANNELS) | 30 | # define MAX_DMA_CHANNELS (CONFIG_NR_ONCHIP_DMA_CHANNELS) |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | /* | 33 | /* |
diff --git a/arch/sh/include/asm/entry-macros.S b/arch/sh/include/asm/entry-macros.S index 2dab0b8d9454..3a4752a65722 100644 --- a/arch/sh/include/asm/entry-macros.S +++ b/arch/sh/include/asm/entry-macros.S | |||
@@ -31,3 +31,8 @@ | |||
31 | #endif | 31 | #endif |
32 | .endm | 32 | .endm |
33 | 33 | ||
34 | #if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH4) | ||
35 | # define PREF(x) pref @x | ||
36 | #else | ||
37 | # define PREF(x) nop | ||
38 | #endif | ||
diff --git a/arch/sh/include/asm/gpio.h b/arch/sh/include/asm/gpio.h index 90673658eb14..61f93da2c62e 100644 --- a/arch/sh/include/asm/gpio.h +++ b/arch/sh/include/asm/gpio.h | |||
@@ -19,8 +19,42 @@ | |||
19 | #include <cpu/gpio.h> | 19 | #include <cpu/gpio.h> |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #define ARCH_NR_GPIOS 512 | ||
23 | #include <asm-generic/gpio.h> | ||
24 | |||
25 | #ifdef CONFIG_GPIOLIB | ||
26 | |||
27 | static inline int gpio_get_value(unsigned gpio) | ||
28 | { | ||
29 | return __gpio_get_value(gpio); | ||
30 | } | ||
31 | |||
32 | static inline void gpio_set_value(unsigned gpio, int value) | ||
33 | { | ||
34 | __gpio_set_value(gpio, value); | ||
35 | } | ||
36 | |||
37 | static inline int gpio_cansleep(unsigned gpio) | ||
38 | { | ||
39 | return __gpio_cansleep(gpio); | ||
40 | } | ||
41 | |||
42 | static inline int gpio_to_irq(unsigned gpio) | ||
43 | { | ||
44 | WARN_ON(1); | ||
45 | return -ENOSYS; | ||
46 | } | ||
47 | |||
48 | static inline int irq_to_gpio(unsigned int irq) | ||
49 | { | ||
50 | WARN_ON(1); | ||
51 | return -EINVAL; | ||
52 | } | ||
53 | |||
54 | #endif /* CONFIG_GPIOLIB */ | ||
55 | |||
22 | typedef unsigned short pinmux_enum_t; | 56 | typedef unsigned short pinmux_enum_t; |
23 | typedef unsigned char pinmux_flag_t; | 57 | typedef unsigned short pinmux_flag_t; |
24 | 58 | ||
25 | #define PINMUX_TYPE_NONE 0 | 59 | #define PINMUX_TYPE_NONE 0 |
26 | #define PINMUX_TYPE_FUNCTION 1 | 60 | #define PINMUX_TYPE_FUNCTION 1 |
@@ -34,6 +68,11 @@ typedef unsigned char pinmux_flag_t; | |||
34 | #define PINMUX_FLAG_WANT_PULLUP (1 << 3) | 68 | #define PINMUX_FLAG_WANT_PULLUP (1 << 3) |
35 | #define PINMUX_FLAG_WANT_PULLDOWN (1 << 4) | 69 | #define PINMUX_FLAG_WANT_PULLDOWN (1 << 4) |
36 | 70 | ||
71 | #define PINMUX_FLAG_DBIT_SHIFT 5 | ||
72 | #define PINMUX_FLAG_DBIT (0x1f << PINMUX_FLAG_DBIT_SHIFT) | ||
73 | #define PINMUX_FLAG_DREG_SHIFT 10 | ||
74 | #define PINMUX_FLAG_DREG (0x3f << PINMUX_FLAG_DREG_SHIFT) | ||
75 | |||
37 | struct pinmux_gpio { | 76 | struct pinmux_gpio { |
38 | pinmux_enum_t enum_id; | 77 | pinmux_enum_t enum_id; |
39 | pinmux_flag_t flags; | 78 | pinmux_flag_t flags; |
@@ -54,7 +93,7 @@ struct pinmux_cfg_reg { | |||
54 | .enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \ | 93 | .enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \ |
55 | 94 | ||
56 | struct pinmux_data_reg { | 95 | struct pinmux_data_reg { |
57 | unsigned long reg, reg_width; | 96 | unsigned long reg, reg_width, reg_shadow; |
58 | pinmux_enum_t *enum_ids; | 97 | pinmux_enum_t *enum_ids; |
59 | }; | 98 | }; |
60 | 99 | ||
@@ -89,34 +128,9 @@ struct pinmux_info { | |||
89 | unsigned int gpio_data_size; | 128 | unsigned int gpio_data_size; |
90 | 129 | ||
91 | unsigned long *gpio_in_use; | 130 | unsigned long *gpio_in_use; |
131 | struct gpio_chip chip; | ||
92 | }; | 132 | }; |
93 | 133 | ||
94 | int register_pinmux(struct pinmux_info *pip); | 134 | int register_pinmux(struct pinmux_info *pip); |
95 | 135 | ||
96 | int __gpio_request(unsigned gpio); | ||
97 | static inline int gpio_request(unsigned gpio, const char *label) | ||
98 | { | ||
99 | return __gpio_request(gpio); | ||
100 | } | ||
101 | void gpio_free(unsigned gpio); | ||
102 | int gpio_direction_input(unsigned gpio); | ||
103 | int gpio_direction_output(unsigned gpio, int value); | ||
104 | int gpio_get_value(unsigned gpio); | ||
105 | void gpio_set_value(unsigned gpio, int value); | ||
106 | |||
107 | /* IRQ modes are unspported */ | ||
108 | static inline int gpio_to_irq(unsigned gpio) | ||
109 | { | ||
110 | WARN_ON(1); | ||
111 | return -EINVAL; | ||
112 | } | ||
113 | |||
114 | static inline int irq_to_gpio(unsigned irq) | ||
115 | { | ||
116 | WARN_ON(1); | ||
117 | return -EINVAL; | ||
118 | } | ||
119 | |||
120 | #include <asm-generic/gpio.h> | ||
121 | |||
122 | #endif /* __ASM_SH_GPIO_H */ | 136 | #endif /* __ASM_SH_GPIO_H */ |
diff --git a/arch/sh/include/asm/hd64461.h b/arch/sh/include/asm/hd64461.h index 8c1353baf00f..52b4b6238277 100644 --- a/arch/sh/include/asm/hd64461.h +++ b/arch/sh/include/asm/hd64461.h | |||
@@ -242,7 +242,6 @@ | |||
242 | #include <asm/io_generic.h> | 242 | #include <asm/io_generic.h> |
243 | 243 | ||
244 | /* arch/sh/cchips/hd6446x/hd64461/setup.c */ | 244 | /* arch/sh/cchips/hd6446x/hd64461/setup.c */ |
245 | int hd64461_irq_demux(int irq); | ||
246 | void hd64461_register_irq_demux(int irq, | 245 | void hd64461_register_irq_demux(int irq, |
247 | int (*demux) (int irq, void *dev), void *dev); | 246 | int (*demux) (int irq, void *dev), void *dev); |
248 | void hd64461_unregister_irq_demux(int irq); | 247 | void hd64461_unregister_irq_demux(int irq); |
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 61f6dae40534..0454f8d68059 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
@@ -238,7 +238,7 @@ extern void onchip_unmap(unsigned long vaddr); | |||
238 | static inline void __iomem * | 238 | static inline void __iomem * |
239 | __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | 239 | __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) |
240 | { | 240 | { |
241 | #ifdef CONFIG_SUPERH32 | 241 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) |
242 | unsigned long last_addr = offset + size - 1; | 242 | unsigned long last_addr = offset + size - 1; |
243 | #endif | 243 | #endif |
244 | void __iomem *ret; | 244 | void __iomem *ret; |
@@ -247,7 +247,7 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
247 | if (ret) | 247 | if (ret) |
248 | return ret; | 248 | return ret; |
249 | 249 | ||
250 | #ifdef CONFIG_SUPERH32 | 250 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) |
251 | /* | 251 | /* |
252 | * For P1 and P2 space this is trivial, as everything is already | 252 | * For P1 and P2 space this is trivial, as everything is already |
253 | * mapped. Uncached access for P1 addresses are done through P2. | 253 | * mapped. Uncached access for P1 addresses are done through P2. |
diff --git a/arch/sh/include/asm/kprobes.h b/arch/sh/include/asm/kprobes.h index 6078d8e551d4..613644a758e8 100644 --- a/arch/sh/include/asm/kprobes.h +++ b/arch/sh/include/asm/kprobes.h | |||
@@ -16,7 +16,7 @@ typedef u16 kprobe_opcode_t; | |||
16 | ? (MAX_STACK_SIZE) \ | 16 | ? (MAX_STACK_SIZE) \ |
17 | : (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR))) | 17 | : (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR))) |
18 | 18 | ||
19 | #define regs_return_value(regs) ((regs)->regs[0]) | 19 | #define regs_return_value(_regs) ((_regs)->regs[0]) |
20 | #define flush_insn_slot(p) do { } while (0) | 20 | #define flush_insn_slot(p) do { } while (0) |
21 | #define kretprobe_blacklist_size 0 | 21 | #define kretprobe_blacklist_size 0 |
22 | 22 | ||
diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h index 5d9157bd474d..2a9c55f1a83f 100644 --- a/arch/sh/include/asm/mmu_context.h +++ b/arch/sh/include/asm/mmu_context.h | |||
@@ -19,13 +19,18 @@ | |||
19 | * (a) TLB cache version (or round, cycle whatever expression you like) | 19 | * (a) TLB cache version (or round, cycle whatever expression you like) |
20 | * (b) ASID (Address Space IDentifier) | 20 | * (b) ASID (Address Space IDentifier) |
21 | */ | 21 | */ |
22 | #ifdef CONFIG_CPU_HAS_PTEAEX | ||
23 | #define MMU_CONTEXT_ASID_MASK 0x0000ffff | ||
24 | #else | ||
22 | #define MMU_CONTEXT_ASID_MASK 0x000000ff | 25 | #define MMU_CONTEXT_ASID_MASK 0x000000ff |
23 | #define MMU_CONTEXT_VERSION_MASK 0xffffff00 | 26 | #endif |
24 | #define MMU_CONTEXT_FIRST_VERSION 0x00000100 | ||
25 | #define NO_CONTEXT 0UL | ||
26 | 27 | ||
27 | /* ASID is 8-bit value, so it can't be 0x100 */ | 28 | #define MMU_CONTEXT_VERSION_MASK (~0UL & ~MMU_CONTEXT_ASID_MASK) |
28 | #define MMU_NO_ASID 0x100 | 29 | #define MMU_CONTEXT_FIRST_VERSION (MMU_CONTEXT_ASID_MASK + 1) |
30 | |||
31 | /* Impossible ASID value, to differentiate from NO_CONTEXT. */ | ||
32 | #define MMU_NO_ASID MMU_CONTEXT_FIRST_VERSION | ||
33 | #define NO_CONTEXT 0UL | ||
29 | 34 | ||
30 | #define asid_cache(cpu) (cpu_data[cpu].asid_cache) | 35 | #define asid_cache(cpu) (cpu_data[cpu].asid_cache) |
31 | 36 | ||
diff --git a/arch/sh/include/asm/mmu_context_32.h b/arch/sh/include/asm/mmu_context_32.h index f4f9aebd68b7..8ef800c549ab 100644 --- a/arch/sh/include/asm/mmu_context_32.h +++ b/arch/sh/include/asm/mmu_context_32.h | |||
@@ -10,6 +10,17 @@ static inline void destroy_context(struct mm_struct *mm) | |||
10 | /* Do nothing */ | 10 | /* Do nothing */ |
11 | } | 11 | } |
12 | 12 | ||
13 | #ifdef CONFIG_CPU_HAS_PTEAEX | ||
14 | static inline void set_asid(unsigned long asid) | ||
15 | { | ||
16 | __raw_writel(asid, MMU_PTEAEX); | ||
17 | } | ||
18 | |||
19 | static inline unsigned long get_asid(void) | ||
20 | { | ||
21 | return __raw_readl(MMU_PTEAEX) & MMU_CONTEXT_ASID_MASK; | ||
22 | } | ||
23 | #else | ||
13 | static inline void set_asid(unsigned long asid) | 24 | static inline void set_asid(unsigned long asid) |
14 | { | 25 | { |
15 | unsigned long __dummy; | 26 | unsigned long __dummy; |
@@ -33,6 +44,7 @@ static inline unsigned long get_asid(void) | |||
33 | asid &= MMU_CONTEXT_ASID_MASK; | 44 | asid &= MMU_CONTEXT_ASID_MASK; |
34 | return asid; | 45 | return asid; |
35 | } | 46 | } |
47 | #endif /* CONFIG_CPU_HAS_PTEAEX */ | ||
36 | 48 | ||
37 | /* MMU_TTB is used for optimizing the fault handling. */ | 49 | /* MMU_TTB is used for optimizing the fault handling. */ |
38 | static inline void set_TTB(pgd_t *pgd) | 50 | static inline void set_TTB(pgd_t *pgd) |
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h index 5871d78e47e5..9c6d21ec0240 100644 --- a/arch/sh/include/asm/page.h +++ b/arch/sh/include/asm/page.h | |||
@@ -129,7 +129,12 @@ typedef struct page *pgtable_t; | |||
129 | * is not visible (it is part of the PMB mapping) and so needs to be | 129 | * is not visible (it is part of the PMB mapping) and so needs to be |
130 | * added or subtracted as required. | 130 | * added or subtracted as required. |
131 | */ | 131 | */ |
132 | #ifdef CONFIG_32BIT | 132 | #if defined(CONFIG_PMB_FIXED) |
133 | /* phys = virt - PAGE_OFFSET - (__MEMORY_START & 0xe0000000) */ | ||
134 | #define PMB_OFFSET (PAGE_OFFSET - PXSEG(__MEMORY_START)) | ||
135 | #define __pa(x) ((unsigned long)(x) - PMB_OFFSET) | ||
136 | #define __va(x) ((void *)((unsigned long)(x) + PMB_OFFSET)) | ||
137 | #elif defined(CONFIG_32BIT) | ||
133 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) | 138 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) |
134 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) | 139 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) |
135 | #else | 140 | #else |
diff --git a/arch/sh/include/asm/processor.h b/arch/sh/include/asm/processor.h index 1ef4b24d7619..1fd58b421438 100644 --- a/arch/sh/include/asm/processor.h +++ b/arch/sh/include/asm/processor.h | |||
@@ -31,7 +31,7 @@ enum cpu_type { | |||
31 | CPU_SH7760, CPU_SH4_202, CPU_SH4_501, | 31 | CPU_SH7760, CPU_SH4_202, CPU_SH4_501, |
32 | 32 | ||
33 | /* SH-4A types */ | 33 | /* SH-4A types */ |
34 | CPU_SH7763, CPU_SH7770, CPU_SH7780, CPU_SH7781, CPU_SH7785, | 34 | CPU_SH7763, CPU_SH7770, CPU_SH7780, CPU_SH7781, CPU_SH7785, CPU_SH7786, |
35 | CPU_SH7723, CPU_SHX3, | 35 | CPU_SH7723, CPU_SHX3, |
36 | 36 | ||
37 | /* SH4AL-DSP types */ | 37 | /* SH4AL-DSP types */ |
diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h index d79063c5eb9c..efdd78a53b11 100644 --- a/arch/sh/include/asm/processor_32.h +++ b/arch/sh/include/asm/processor_32.h | |||
@@ -108,12 +108,12 @@ extern int ubc_usercnt; | |||
108 | /* | 108 | /* |
109 | * Do necessary setup to start up a newly executed thread. | 109 | * Do necessary setup to start up a newly executed thread. |
110 | */ | 110 | */ |
111 | #define start_thread(regs, new_pc, new_sp) \ | 111 | #define start_thread(_regs, new_pc, new_sp) \ |
112 | set_fs(USER_DS); \ | 112 | set_fs(USER_DS); \ |
113 | regs->pr = 0; \ | 113 | _regs->pr = 0; \ |
114 | regs->sr = SR_FD; /* User mode. */ \ | 114 | _regs->sr = SR_FD; /* User mode. */ \ |
115 | regs->pc = new_pc; \ | 115 | _regs->pc = new_pc; \ |
116 | regs->regs[15] = new_sp | 116 | _regs->regs[15] = new_sp |
117 | 117 | ||
118 | /* Forward declaration, a strange C thing */ | 118 | /* Forward declaration, a strange C thing */ |
119 | struct task_struct; | 119 | struct task_struct; |
@@ -189,10 +189,9 @@ extern unsigned long get_wchan(struct task_struct *p); | |||
189 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) | 189 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc) |
190 | #define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[15]) | 190 | #define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[15]) |
191 | 191 | ||
192 | #define user_stack_pointer(regs) ((regs)->regs[15]) | 192 | #define user_stack_pointer(_regs) ((_regs)->regs[15]) |
193 | 193 | ||
194 | #if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH3) || \ | 194 | #if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH4) |
195 | defined(CONFIG_CPU_SH4) | ||
196 | #define PREFETCH_STRIDE L1_CACHE_BYTES | 195 | #define PREFETCH_STRIDE L1_CACHE_BYTES |
197 | #define ARCH_HAS_PREFETCH | 196 | #define ARCH_HAS_PREFETCH |
198 | #define ARCH_HAS_PREFETCHW | 197 | #define ARCH_HAS_PREFETCHW |
diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index 803177fcf086..5727d31b0ccf 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h | |||
@@ -145,13 +145,13 @@ struct thread_struct { | |||
145 | */ | 145 | */ |
146 | #define SR_USER (SR_MMU | SR_FD) | 146 | #define SR_USER (SR_MMU | SR_FD) |
147 | 147 | ||
148 | #define start_thread(regs, new_pc, new_sp) \ | 148 | #define start_thread(_regs, new_pc, new_sp) \ |
149 | set_fs(USER_DS); \ | 149 | set_fs(USER_DS); \ |
150 | regs->sr = SR_USER; /* User mode. */ \ | 150 | _regs->sr = SR_USER; /* User mode. */ \ |
151 | regs->pc = new_pc - 4; /* Compensate syscall exit */ \ | 151 | _regs->pc = new_pc - 4; /* Compensate syscall exit */ \ |
152 | regs->pc |= 1; /* Set SHmedia ! */ \ | 152 | _regs->pc |= 1; /* Set SHmedia ! */ \ |
153 | regs->regs[18] = 0; \ | 153 | _regs->regs[18] = 0; \ |
154 | regs->regs[15] = new_sp | 154 | _regs->regs[15] = new_sp |
155 | 155 | ||
156 | /* Forward declaration, a strange C thing */ | 156 | /* Forward declaration, a strange C thing */ |
157 | struct task_struct; | 157 | struct task_struct; |
@@ -226,7 +226,7 @@ extern unsigned long get_wchan(struct task_struct *p); | |||
226 | #define KSTK_EIP(tsk) ((tsk)->thread.pc) | 226 | #define KSTK_EIP(tsk) ((tsk)->thread.pc) |
227 | #define KSTK_ESP(tsk) ((tsk)->thread.sp) | 227 | #define KSTK_ESP(tsk) ((tsk)->thread.sp) |
228 | 228 | ||
229 | #define user_stack_pointer(regs) ((regs)->regs[15]) | 229 | #define user_stack_pointer(_regs) ((_regs)->regs[15]) |
230 | 230 | ||
231 | #endif /* __ASSEMBLY__ */ | 231 | #endif /* __ASSEMBLY__ */ |
232 | #endif /* __ASM_SH_PROCESSOR_64_H */ | 232 | #endif /* __ASM_SH_PROCESSOR_64_H */ |
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index 12912ab80c15..81c6568fdb3e 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -122,14 +122,12 @@ extern void user_disable_single_step(struct task_struct *); | |||
122 | #ifdef CONFIG_SH_DSP | 122 | #ifdef CONFIG_SH_DSP |
123 | #define task_pt_regs(task) \ | 123 | #define task_pt_regs(task) \ |
124 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ | 124 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ |
125 | - sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1) | 125 | - sizeof(struct pt_dspregs)) - 1) |
126 | #define task_pt_dspregs(task) \ | 126 | #define task_pt_dspregs(task) \ |
127 | ((struct pt_dspregs *) (task_stack_page(task) + THREAD_SIZE \ | 127 | ((struct pt_dspregs *) (task_stack_page(task) + THREAD_SIZE) - 1) |
128 | - sizeof(unsigned long)) - 1) | ||
129 | #else | 128 | #else |
130 | #define task_pt_regs(task) \ | 129 | #define task_pt_regs(task) \ |
131 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \ | 130 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE) - 1) |
132 | - sizeof(unsigned long)) - 1) | ||
133 | #endif | 131 | #endif |
134 | 132 | ||
135 | static inline unsigned long profile_pc(struct pt_regs *regs) | 133 | static inline unsigned long profile_pc(struct pt_regs *regs) |
diff --git a/arch/sh/include/asm/sections.h b/arch/sh/include/asm/sections.h index 8f8f4ad400df..01a4076a3719 100644 --- a/arch/sh/include/asm/sections.h +++ b/arch/sh/include/asm/sections.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <asm-generic/sections.h> | 4 | #include <asm-generic/sections.h> |
5 | 5 | ||
6 | extern void __nosave_begin, __nosave_end; | ||
6 | extern long __machvec_start, __machvec_end; | 7 | extern long __machvec_start, __machvec_end; |
7 | extern char __uncached_start, __uncached_end; | 8 | extern char __uncached_start, __uncached_end; |
8 | extern char _ebss[]; | 9 | extern char _ebss[]; |
diff --git a/arch/sh/include/asm/socket.h b/arch/sh/include/asm/socket.h index 6d4bf6512959..345653b96826 100644 --- a/arch/sh/include/asm/socket.h +++ b/arch/sh/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* __ASM_SH_SOCKET_H */ | 60 | #endif /* __ASM_SH_SOCKET_H */ |
diff --git a/arch/sh/include/asm/suspend.h b/arch/sh/include/asm/suspend.h new file mode 100644 index 000000000000..b1b995370e79 --- /dev/null +++ b/arch/sh/include/asm/suspend.h | |||
@@ -0,0 +1,22 @@ | |||
1 | #ifndef _ASM_SH_SUSPEND_H | ||
2 | #define _ASM_SH_SUSPEND_H | ||
3 | |||
4 | #ifndef __ASSEMBLY__ | ||
5 | static inline int arch_prepare_suspend(void) { return 0; } | ||
6 | |||
7 | #include <asm/ptrace.h> | ||
8 | |||
9 | struct swsusp_arch_regs { | ||
10 | struct pt_regs user_regs; | ||
11 | unsigned long bank1_regs[8]; | ||
12 | }; | ||
13 | #endif | ||
14 | |||
15 | /* flags passed to assembly suspend code */ | ||
16 | #define SUSP_SH_SLEEP (1 << 0) /* Regular sleep mode */ | ||
17 | #define SUSP_SH_STANDBY (1 << 1) /* SH-Mobile Software standby mode */ | ||
18 | #define SUSP_SH_RSTANDBY (1 << 2) /* SH-Mobile R-standby mode */ | ||
19 | #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ | ||
20 | #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ | ||
21 | |||
22 | #endif /* _ASM_SH_SUSPEND_H */ | ||
diff --git a/arch/sh/include/asm/timer.h b/arch/sh/include/asm/timer.h index a7ca3a195bb5..4c3b66e30af2 100644 --- a/arch/sh/include/asm/timer.h +++ b/arch/sh/include/asm/timer.h | |||
@@ -9,7 +9,6 @@ struct sys_timer_ops { | |||
9 | int (*init)(void); | 9 | int (*init)(void); |
10 | int (*start)(void); | 10 | int (*start)(void); |
11 | int (*stop)(void); | 11 | int (*stop)(void); |
12 | cycle_t (*read)(void); | ||
13 | #ifndef CONFIG_GENERIC_TIME | 12 | #ifndef CONFIG_GENERIC_TIME |
14 | unsigned long (*get_offset)(void); | 13 | unsigned long (*get_offset)(void); |
15 | #endif | 14 | #endif |
@@ -39,6 +38,7 @@ struct sys_timer *get_sys_timer(void); | |||
39 | 38 | ||
40 | /* arch/sh/kernel/time.c */ | 39 | /* arch/sh/kernel/time.c */ |
41 | void handle_timer_tick(void); | 40 | void handle_timer_tick(void); |
42 | extern unsigned long sh_hpt_frequency; | 41 | |
42 | extern struct clocksource clocksource_sh; | ||
43 | 43 | ||
44 | #endif /* __ASM_SH_TIMER_H */ | 44 | #endif /* __ASM_SH_TIMER_H */ |
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index 88ff1ae8a6b8..9c16f737074a 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
@@ -6,22 +6,106 @@ | |||
6 | #endif | 6 | #endif |
7 | 7 | ||
8 | #ifndef __ASSEMBLY__ | 8 | #ifndef __ASSEMBLY__ |
9 | #include <linux/pagemap.h> | ||
10 | |||
11 | #ifdef CONFIG_MMU | ||
12 | #include <asm/pgalloc.h> | ||
13 | #include <asm/tlbflush.h> | ||
14 | |||
15 | /* | ||
16 | * TLB handling. This allows us to remove pages from the page | ||
17 | * tables, and efficiently handle the TLB issues. | ||
18 | */ | ||
19 | struct mmu_gather { | ||
20 | struct mm_struct *mm; | ||
21 | unsigned int fullmm; | ||
22 | unsigned long start, end; | ||
23 | }; | ||
9 | 24 | ||
10 | #define tlb_start_vma(tlb, vma) \ | 25 | DECLARE_PER_CPU(struct mmu_gather, mmu_gathers); |
11 | flush_cache_range(vma, vma->vm_start, vma->vm_end) | ||
12 | 26 | ||
13 | #define tlb_end_vma(tlb, vma) \ | 27 | static inline void init_tlb_gather(struct mmu_gather *tlb) |
14 | flush_tlb_range(vma, vma->vm_start, vma->vm_end) | 28 | { |
29 | tlb->start = TASK_SIZE; | ||
30 | tlb->end = 0; | ||
15 | 31 | ||
16 | #define __tlb_remove_tlb_entry(tlb, pte, address) do { } while (0) | 32 | if (tlb->fullmm) { |
33 | tlb->start = 0; | ||
34 | tlb->end = TASK_SIZE; | ||
35 | } | ||
36 | } | ||
37 | |||
38 | static inline struct mmu_gather * | ||
39 | tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) | ||
40 | { | ||
41 | struct mmu_gather *tlb = &get_cpu_var(mmu_gathers); | ||
42 | |||
43 | tlb->mm = mm; | ||
44 | tlb->fullmm = full_mm_flush; | ||
45 | |||
46 | init_tlb_gather(tlb); | ||
47 | |||
48 | return tlb; | ||
49 | } | ||
50 | |||
51 | static inline void | ||
52 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) | ||
53 | { | ||
54 | if (tlb->fullmm) | ||
55 | flush_tlb_mm(tlb->mm); | ||
56 | |||
57 | /* keep the page table cache within bounds */ | ||
58 | check_pgt_cache(); | ||
59 | |||
60 | put_cpu_var(mmu_gathers); | ||
61 | } | ||
62 | |||
63 | static inline void | ||
64 | tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long address) | ||
65 | { | ||
66 | if (tlb->start > address) | ||
67 | tlb->start = address; | ||
68 | if (tlb->end < address + PAGE_SIZE) | ||
69 | tlb->end = address + PAGE_SIZE; | ||
70 | } | ||
17 | 71 | ||
18 | /* | 72 | /* |
19 | * Flush whole TLBs for MM | 73 | * In the case of tlb vma handling, we can optimise these away in the |
74 | * case where we're doing a full MM flush. When we're doing a munmap, | ||
75 | * the vmas are adjusted to only cover the region to be torn down. | ||
20 | */ | 76 | */ |
21 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) | 77 | static inline void |
78 | tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | ||
79 | { | ||
80 | if (!tlb->fullmm) | ||
81 | flush_cache_range(vma, vma->vm_start, vma->vm_end); | ||
82 | } | ||
83 | |||
84 | static inline void | ||
85 | tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | ||
86 | { | ||
87 | if (!tlb->fullmm && tlb->end) { | ||
88 | flush_tlb_range(vma, tlb->start, tlb->end); | ||
89 | init_tlb_gather(tlb); | ||
90 | } | ||
91 | } | ||
92 | |||
93 | #define tlb_remove_page(tlb,page) free_page_and_swap_cache(page) | ||
94 | #define pte_free_tlb(tlb, ptep) pte_free((tlb)->mm, ptep) | ||
95 | #define pmd_free_tlb(tlb, pmdp) pmd_free((tlb)->mm, pmdp) | ||
96 | #define pud_free_tlb(tlb, pudp) pud_free((tlb)->mm, pudp) | ||
97 | |||
98 | #define tlb_migrate_finish(mm) do { } while (0) | ||
99 | |||
100 | #else /* CONFIG_MMU */ | ||
101 | |||
102 | #define tlb_start_vma(tlb, vma) do { } while (0) | ||
103 | #define tlb_end_vma(tlb, vma) do { } while (0) | ||
104 | #define __tlb_remove_tlb_entry(tlb, pte, address) do { } while (0) | ||
105 | #define tlb_flush(tlb) do { } while (0) | ||
22 | 106 | ||
23 | #include <linux/pagemap.h> | ||
24 | #include <asm-generic/tlb.h> | 107 | #include <asm-generic/tlb.h> |
25 | 108 | ||
109 | #endif /* CONFIG_MMU */ | ||
26 | #endif /* __ASSEMBLY__ */ | 110 | #endif /* __ASSEMBLY__ */ |
27 | #endif /* __ASM_SH_TLB_H */ | 111 | #endif /* __ASM_SH_TLB_H */ |
diff --git a/arch/sh/include/cpu-sh3/cpu/dma.h b/arch/sh/include/cpu-sh3/cpu/dma.h index 6813c3220a1d..0ea15f3f2363 100644 --- a/arch/sh/include/cpu-sh3/cpu/dma.h +++ b/arch/sh/include/cpu-sh3/cpu/dma.h | |||
@@ -1,22 +1,17 @@ | |||
1 | #ifndef __ASM_CPU_SH3_DMA_H | 1 | #ifndef __ASM_CPU_SH3_DMA_H |
2 | #define __ASM_CPU_SH3_DMA_H | 2 | #define __ASM_CPU_SH3_DMA_H |
3 | 3 | ||
4 | |||
5 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | 4 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ |
6 | defined(CONFIG_CPU_SUBTYPE_SH7721) | 5 | defined(CONFIG_CPU_SUBTYPE_SH7721) || \ |
7 | #define SH_DMAC_BASE 0xa4010020 | 6 | defined(CONFIG_CPU_SUBTYPE_SH7710) || \ |
8 | #else | 7 | defined(CONFIG_CPU_SUBTYPE_SH7712) |
9 | #define SH_DMAC_BASE 0xa4000020 | 8 | #define SH_DMAC_BASE0 0xa4010020 |
9 | #else /* SH7705/06/07/09 */ | ||
10 | #define SH_DMAC_BASE0 0xa4000020 | ||
10 | #endif | 11 | #endif |
11 | 12 | ||
12 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) || defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
13 | #define DMTE0_IRQ 48 | 13 | #define DMTE0_IRQ 48 |
14 | #define DMTE1_IRQ 49 | ||
15 | #define DMTE2_IRQ 50 | ||
16 | #define DMTE3_IRQ 51 | ||
17 | #define DMTE4_IRQ 76 | 14 | #define DMTE4_IRQ 76 |
18 | #define DMTE5_IRQ 77 | ||
19 | #endif | ||
20 | 15 | ||
21 | /* Definitions for the SuperH DMAC */ | 16 | /* Definitions for the SuperH DMAC */ |
22 | #define TM_BURST 0x00000020 | 17 | #define TM_BURST 0x00000020 |
diff --git a/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h b/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h new file mode 100644 index 000000000000..0ed5178fed69 --- /dev/null +++ b/arch/sh/include/cpu-sh4/cpu/dma-sh4a.h | |||
@@ -0,0 +1,94 @@ | |||
1 | #ifndef __ASM_SH_CPU_SH4_DMA_SH7780_H | ||
2 | #define __ASM_SH_CPU_SH4_DMA_SH7780_H | ||
3 | |||
4 | #if defined(CONFIG_CPU_SUBTYPE_SH7343) || \ | ||
5 | defined(CONFIG_CPU_SUBTYPE_SH7722) || \ | ||
6 | defined(CONFIG_CPU_SUBTYPE_SH7730) | ||
7 | #define DMTE0_IRQ 48 | ||
8 | #define DMTE4_IRQ 76 | ||
9 | #define DMAE0_IRQ 78 /* DMA Error IRQ*/ | ||
10 | #define SH_DMAC_BASE0 0xFE008020 | ||
11 | #define SH_DMARS_BASE 0xFE009000 | ||
12 | #elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \ | ||
13 | defined(CONFIG_CPU_SUBTYPE_SH7764) | ||
14 | #define DMTE0_IRQ 34 | ||
15 | #define DMTE4_IRQ 44 | ||
16 | #define DMAE0_IRQ 38 | ||
17 | #define SH_DMAC_BASE0 0xFF608020 | ||
18 | #define SH_DMARS_BASE 0xFF609000 | ||
19 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | ||
20 | #define DMTE0_IRQ 48 /* DMAC0A*/ | ||
21 | #define DMTE4_IRQ 40 /* DMAC0B */ | ||
22 | #define DMTE6_IRQ 42 | ||
23 | #define DMTE8_IRQ 76 /* DMAC1A */ | ||
24 | #define DMTE9_IRQ 77 | ||
25 | #define DMTE10_IRQ 72 /* DMAC1B */ | ||
26 | #define DMTE11_IRQ 73 | ||
27 | #define DMAE0_IRQ 78 /* DMA Error IRQ*/ | ||
28 | #define DMAE1_IRQ 74 /* DMA Error IRQ*/ | ||
29 | #define SH_DMAC_BASE0 0xFE008020 | ||
30 | #define SH_DMAC_BASE1 0xFDC08020 | ||
31 | #define SH_DMARS_BASE 0xFDC09000 | ||
32 | #elif defined(CONFIG_CPU_SUBTYPE_SH7780) | ||
33 | #define DMTE0_IRQ 34 | ||
34 | #define DMTE4_IRQ 44 | ||
35 | #define DMTE6_IRQ 46 | ||
36 | #define DMTE8_IRQ 92 | ||
37 | #define DMTE9_IRQ 93 | ||
38 | #define DMTE10_IRQ 94 | ||
39 | #define DMTE11_IRQ 95 | ||
40 | #define DMAE0_IRQ 38 /* DMA Error IRQ */ | ||
41 | #define SH_DMAC_BASE0 0xFC808020 | ||
42 | #define SH_DMAC_BASE1 0xFC818020 | ||
43 | #define SH_DMARS_BASE 0xFC809000 | ||
44 | #else /* SH7785 */ | ||
45 | #define DMTE0_IRQ 33 | ||
46 | #define DMTE4_IRQ 37 | ||
47 | #define DMTE6_IRQ 52 | ||
48 | #define DMTE8_IRQ 54 | ||
49 | #define DMTE9_IRQ 55 | ||
50 | #define DMTE10_IRQ 56 | ||
51 | #define DMTE11_IRQ 57 | ||
52 | #define DMAE0_IRQ 39 /* DMA Error IRQ0 */ | ||
53 | #define DMAE1_IRQ 58 /* DMA Error IRQ1 */ | ||
54 | #define SH_DMAC_BASE0 0xFC808020 | ||
55 | #define SH_DMAC_BASE1 0xFCC08020 | ||
56 | #define SH_DMARS_BASE 0xFC809000 | ||
57 | #endif | ||
58 | |||
59 | #define REQ_HE 0x000000C0 | ||
60 | #define REQ_H 0x00000080 | ||
61 | #define REQ_LE 0x00000040 | ||
62 | #define TM_BURST 0x0000020 | ||
63 | #define TS_8 0x00000000 | ||
64 | #define TS_16 0x00000008 | ||
65 | #define TS_32 0x00000010 | ||
66 | #define TS_16BLK 0x00000018 | ||
67 | #define TS_32BLK 0x00100000 | ||
68 | |||
69 | /* | ||
70 | * The SuperH DMAC supports a number of transmit sizes, we list them here, | ||
71 | * with their respective values as they appear in the CHCR registers. | ||
72 | * | ||
73 | * Defaults to a 64-bit transfer size. | ||
74 | */ | ||
75 | enum { | ||
76 | XMIT_SZ_8BIT, | ||
77 | XMIT_SZ_16BIT, | ||
78 | XMIT_SZ_32BIT, | ||
79 | XMIT_SZ_128BIT, | ||
80 | XMIT_SZ_256BIT, | ||
81 | }; | ||
82 | |||
83 | /* | ||
84 | * The DMA count is defined as the number of bytes to transfer. | ||
85 | */ | ||
86 | static unsigned int ts_shift[] __maybe_unused = { | ||
87 | [XMIT_SZ_8BIT] = 0, | ||
88 | [XMIT_SZ_16BIT] = 1, | ||
89 | [XMIT_SZ_32BIT] = 2, | ||
90 | [XMIT_SZ_128BIT] = 4, | ||
91 | [XMIT_SZ_256BIT] = 5, | ||
92 | }; | ||
93 | |||
94 | #endif /* __ASM_SH_CPU_SH4_DMA_SH7780_H */ | ||
diff --git a/arch/sh/include/cpu-sh4/cpu/dma-sh7780.h b/arch/sh/include/cpu-sh4/cpu/dma-sh7780.h deleted file mode 100644 index 71b426a6e482..000000000000 --- a/arch/sh/include/cpu-sh4/cpu/dma-sh7780.h +++ /dev/null | |||
@@ -1,39 +0,0 @@ | |||
1 | #ifndef __ASM_SH_CPU_SH4_DMA_SH7780_H | ||
2 | #define __ASM_SH_CPU_SH4_DMA_SH7780_H | ||
3 | |||
4 | #define REQ_HE 0x000000C0 | ||
5 | #define REQ_H 0x00000080 | ||
6 | #define REQ_LE 0x00000040 | ||
7 | #define TM_BURST 0x0000020 | ||
8 | #define TS_8 0x00000000 | ||
9 | #define TS_16 0x00000008 | ||
10 | #define TS_32 0x00000010 | ||
11 | #define TS_16BLK 0x00000018 | ||
12 | #define TS_32BLK 0x00100000 | ||
13 | |||
14 | /* | ||
15 | * The SuperH DMAC supports a number of transmit sizes, we list them here, | ||
16 | * with their respective values as they appear in the CHCR registers. | ||
17 | * | ||
18 | * Defaults to a 64-bit transfer size. | ||
19 | */ | ||
20 | enum { | ||
21 | XMIT_SZ_8BIT, | ||
22 | XMIT_SZ_16BIT, | ||
23 | XMIT_SZ_32BIT, | ||
24 | XMIT_SZ_128BIT, | ||
25 | XMIT_SZ_256BIT, | ||
26 | }; | ||
27 | |||
28 | /* | ||
29 | * The DMA count is defined as the number of bytes to transfer. | ||
30 | */ | ||
31 | static unsigned int ts_shift[] __maybe_unused = { | ||
32 | [XMIT_SZ_8BIT] = 0, | ||
33 | [XMIT_SZ_16BIT] = 1, | ||
34 | [XMIT_SZ_32BIT] = 2, | ||
35 | [XMIT_SZ_128BIT] = 4, | ||
36 | [XMIT_SZ_256BIT] = 5, | ||
37 | }; | ||
38 | |||
39 | #endif /* __ASM_SH_CPU_SH4_DMA_SH7780_H */ | ||
diff --git a/arch/sh/include/cpu-sh4/cpu/dma.h b/arch/sh/include/cpu-sh4/cpu/dma.h index 235b7cd1fc9a..bcb30246e85c 100644 --- a/arch/sh/include/cpu-sh4/cpu/dma.h +++ b/arch/sh/include/cpu-sh4/cpu/dma.h | |||
@@ -1,31 +1,29 @@ | |||
1 | #ifndef __ASM_CPU_SH4_DMA_H | 1 | #ifndef __ASM_CPU_SH4_DMA_H |
2 | #define __ASM_CPU_SH4_DMA_H | 2 | #define __ASM_CPU_SH4_DMA_H |
3 | 3 | ||
4 | #define DMAOR_INIT ( 0x8000 | DMAOR_DME ) | ||
5 | |||
6 | /* SH7751/7760/7780 DMA IRQ sources */ | 4 | /* SH7751/7760/7780 DMA IRQ sources */ |
7 | #define DMTE0_IRQ 34 | ||
8 | #define DMTE1_IRQ 35 | ||
9 | #define DMTE2_IRQ 36 | ||
10 | #define DMTE3_IRQ 37 | ||
11 | #define DMTE4_IRQ 44 | ||
12 | #define DMTE5_IRQ 45 | ||
13 | #define DMTE6_IRQ 46 | ||
14 | #define DMTE7_IRQ 47 | ||
15 | #define DMAE_IRQ 38 | ||
16 | 5 | ||
17 | #ifdef CONFIG_CPU_SH4A | 6 | #ifdef CONFIG_CPU_SH4A |
18 | #define SH_DMAC_BASE 0xfc808020 | ||
19 | 7 | ||
8 | #define DMAOR_INIT (DMAOR_DME) | ||
20 | #define CHCR_TS_MASK 0x18 | 9 | #define CHCR_TS_MASK 0x18 |
21 | #define CHCR_TS_SHIFT 3 | 10 | #define CHCR_TS_SHIFT 3 |
22 | 11 | ||
23 | #include <cpu/dma-sh7780.h> | 12 | #include <cpu/dma-sh4a.h> |
24 | #else | 13 | #else /* CONFIG_CPU_SH4A */ |
25 | #define SH_DMAC_BASE 0xffa00000 | 14 | /* |
15 | * SH7750/SH7751/SH7760 | ||
16 | */ | ||
17 | #define DMTE0_IRQ 34 | ||
18 | #define DMTE4_IRQ 44 | ||
19 | #define DMTE6_IRQ 46 | ||
20 | #define DMAE0_IRQ 38 | ||
26 | 21 | ||
22 | #define DMAOR_INIT (0x8000|DMAOR_DME) | ||
23 | #define SH_DMAC_BASE0 0xffa00000 | ||
24 | #define SH_DMAC_BASE1 0xffa00070 | ||
27 | /* Definitions for the SuperH DMAC */ | 25 | /* Definitions for the SuperH DMAC */ |
28 | #define TM_BURST 0x0000080 | 26 | #define TM_BURST 0x00000080 |
29 | #define TS_8 0x00000010 | 27 | #define TS_8 0x00000010 |
30 | #define TS_16 0x00000020 | 28 | #define TS_16 0x00000020 |
31 | #define TS_32 0x00000030 | 29 | #define TS_32 0x00000030 |
diff --git a/arch/sh/include/cpu-sh4/cpu/freq.h b/arch/sh/include/cpu-sh4/cpu/freq.h index c23af81c2e70..749d1c434337 100644 --- a/arch/sh/include/cpu-sh4/cpu/freq.h +++ b/arch/sh/include/cpu-sh4/cpu/freq.h | |||
@@ -29,6 +29,10 @@ | |||
29 | #define FRQCR0 0xffc80000 | 29 | #define FRQCR0 0xffc80000 |
30 | #define FRQCR1 0xffc80004 | 30 | #define FRQCR1 0xffc80004 |
31 | #define FRQMR1 0xffc80014 | 31 | #define FRQMR1 0xffc80014 |
32 | #elif defined(CONFIG_CPU_SUBTYPE_SH7786) | ||
33 | #define FRQCR0 0xffc40000 | ||
34 | #define FRQCR1 0xffc40004 | ||
35 | #define FRQMR1 0xffc40014 | ||
32 | #elif defined(CONFIG_CPU_SUBTYPE_SHX3) | 36 | #elif defined(CONFIG_CPU_SUBTYPE_SHX3) |
33 | #define FRQCR 0xffc00014 | 37 | #define FRQCR 0xffc00014 |
34 | #else | 38 | #else |
diff --git a/arch/sh/include/cpu-sh4/cpu/mmu_context.h b/arch/sh/include/cpu-sh4/cpu/mmu_context.h index 9ea8eb27b18e..3ce7ef6c2978 100644 --- a/arch/sh/include/cpu-sh4/cpu/mmu_context.h +++ b/arch/sh/include/cpu-sh4/cpu/mmu_context.h | |||
@@ -14,28 +14,35 @@ | |||
14 | #define MMU_PTEL 0xFF000004 /* Page table entry register LOW */ | 14 | #define MMU_PTEL 0xFF000004 /* Page table entry register LOW */ |
15 | #define MMU_TTB 0xFF000008 /* Translation table base register */ | 15 | #define MMU_TTB 0xFF000008 /* Translation table base register */ |
16 | #define MMU_TEA 0xFF00000C /* TLB Exception Address */ | 16 | #define MMU_TEA 0xFF00000C /* TLB Exception Address */ |
17 | #define MMU_PTEA 0xFF000034 /* Page table entry assistance register */ | 17 | #define MMU_PTEA 0xFF000034 /* PTE assistance register */ |
18 | #define MMU_PTEAEX 0xFF00007C /* PTE ASID extension register */ | ||
18 | 19 | ||
19 | #define MMUCR 0xFF000010 /* MMU Control Register */ | 20 | #define MMUCR 0xFF000010 /* MMU Control Register */ |
20 | 21 | ||
21 | #define MMU_ITLB_ADDRESS_ARRAY 0xF2000000 | ||
22 | #define MMU_UTLB_ADDRESS_ARRAY 0xF6000000 | 22 | #define MMU_UTLB_ADDRESS_ARRAY 0xF6000000 |
23 | #define MMU_UTLB_ADDRESS_ARRAY2 0xF6800000 | ||
23 | #define MMU_PAGE_ASSOC_BIT 0x80 | 24 | #define MMU_PAGE_ASSOC_BIT 0x80 |
24 | 25 | ||
25 | #define MMUCR_TI (1<<2) | 26 | #define MMUCR_TI (1<<2) |
26 | 27 | ||
27 | #ifdef CONFIG_X2TLB | ||
28 | #define MMUCR_ME (1 << 7) | ||
29 | #else | ||
30 | #define MMUCR_ME (0) | ||
31 | #endif | ||
32 | |||
33 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40) | 28 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40) |
34 | #define MMUCR_SE (1 << 4) | 29 | #define MMUCR_SE (1 << 4) |
35 | #else | 30 | #else |
36 | #define MMUCR_SE (0) | 31 | #define MMUCR_SE (0) |
37 | #endif | 32 | #endif |
38 | 33 | ||
34 | #ifdef CONFIG_CPU_HAS_PTEAEX | ||
35 | #define MMUCR_AEX (1 << 6) | ||
36 | #else | ||
37 | #define MMUCR_AEX (0) | ||
38 | #endif | ||
39 | |||
40 | #ifdef CONFIG_X2TLB | ||
41 | #define MMUCR_ME (1 << 7) | ||
42 | #else | ||
43 | #define MMUCR_ME (0) | ||
44 | #endif | ||
45 | |||
39 | #ifdef CONFIG_SH_STORE_QUEUES | 46 | #ifdef CONFIG_SH_STORE_QUEUES |
40 | #define MMUCR_SQMD (1 << 9) | 47 | #define MMUCR_SQMD (1 << 9) |
41 | #else | 48 | #else |
@@ -43,17 +50,7 @@ | |||
43 | #endif | 50 | #endif |
44 | 51 | ||
45 | #define MMU_NTLB_ENTRIES 64 | 52 | #define MMU_NTLB_ENTRIES 64 |
46 | #define MMU_CONTROL_INIT (0x05|MMUCR_SQMD|MMUCR_ME|MMUCR_SE) | 53 | #define MMU_CONTROL_INIT (0x05|MMUCR_SQMD|MMUCR_ME|MMUCR_SE|MMUCR_AEX) |
47 | |||
48 | #define MMU_ITLB_DATA_ARRAY 0xF3000000 | ||
49 | #define MMU_UTLB_DATA_ARRAY 0xF7000000 | ||
50 | |||
51 | #define MMU_UTLB_ENTRIES 64 | ||
52 | #define MMU_U_ENTRY_SHIFT 8 | ||
53 | #define MMU_UTLB_VALID 0x100 | ||
54 | #define MMU_ITLB_ENTRIES 4 | ||
55 | #define MMU_I_ENTRY_SHIFT 8 | ||
56 | #define MMU_ITLB_VALID 0x100 | ||
57 | 54 | ||
58 | #define TRA 0xff000020 | 55 | #define TRA 0xff000020 |
59 | #define EXPEVT 0xff000024 | 56 | #define EXPEVT 0xff000024 |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7786.h b/arch/sh/include/cpu-sh4/cpu/sh7786.h new file mode 100644 index 000000000000..48688adc0c84 --- /dev/null +++ b/arch/sh/include/cpu-sh4/cpu/sh7786.h | |||
@@ -0,0 +1,192 @@ | |||
1 | /* | ||
2 | * SH7786 Pinmux | ||
3 | * | ||
4 | * Copyright (C) 2008, 2009 Renesas Solutions Corp. | ||
5 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
6 | * | ||
7 | * Based on sh7785.h | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | */ | ||
13 | |||
14 | #ifndef __CPU_SH7786_H__ | ||
15 | #define __CPU_SH7786_H__ | ||
16 | |||
17 | enum { | ||
18 | /* PA */ | ||
19 | GPIO_PA7, GPIO_PA6, GPIO_PA5, GPIO_PA4, | ||
20 | GPIO_PA3, GPIO_PA2, GPIO_PA1, GPIO_PA0, | ||
21 | |||
22 | /* PB */ | ||
23 | GPIO_PB7, GPIO_PB6, GPIO_PB5, GPIO_PB4, | ||
24 | GPIO_PB3, GPIO_PB2, GPIO_PB1, GPIO_PB0, | ||
25 | |||
26 | /* PC */ | ||
27 | GPIO_PC7, GPIO_PC6, GPIO_PC5, GPIO_PC4, | ||
28 | GPIO_PC3, GPIO_PC2, GPIO_PC1, GPIO_PC0, | ||
29 | |||
30 | /* PD */ | ||
31 | GPIO_PD7, GPIO_PD6, GPIO_PD5, GPIO_PD4, | ||
32 | GPIO_PD3, GPIO_PD2, GPIO_PD1, GPIO_PD0, | ||
33 | |||
34 | /* PE */ | ||
35 | GPIO_PE5, GPIO_PE4, GPIO_PE3, GPIO_PE2, | ||
36 | GPIO_PE1, GPIO_PE0, | ||
37 | |||
38 | /* PF */ | ||
39 | GPIO_PF7, GPIO_PF6, GPIO_PF5, GPIO_PF4, | ||
40 | GPIO_PF3, GPIO_PF2, GPIO_PF1, GPIO_PF0, | ||
41 | |||
42 | /* PG */ | ||
43 | GPIO_PG7, GPIO_PG6, GPIO_PG5, GPIO_PG4, | ||
44 | GPIO_PG3, GPIO_PG2, GPIO_PG1, GPIO_PG0, | ||
45 | |||
46 | /* PH */ | ||
47 | GPIO_PH7, GPIO_PH6, GPIO_PH5, GPIO_PH4, | ||
48 | GPIO_PH3, GPIO_PH2, GPIO_PH1, GPIO_PH0, | ||
49 | |||
50 | /* PJ */ | ||
51 | GPIO_PJ7, GPIO_PJ6, GPIO_PJ5, GPIO_PJ4, | ||
52 | GPIO_PJ3, GPIO_PJ2, GPIO_PJ1, GPIO_PJ0, | ||
53 | |||
54 | GPIO_FN_CDE, | ||
55 | GPIO_FN_ETH_MAGIC, | ||
56 | GPIO_FN_DISP, | ||
57 | GPIO_FN_ETH_LINK, | ||
58 | GPIO_FN_DR5, | ||
59 | GPIO_FN_ETH_TX_ER, | ||
60 | GPIO_FN_DR4, | ||
61 | GPIO_FN_ETH_TX_EN, | ||
62 | GPIO_FN_DR3, | ||
63 | GPIO_FN_ETH_TXD3, | ||
64 | GPIO_FN_DR2, | ||
65 | GPIO_FN_ETH_TXD2, | ||
66 | GPIO_FN_DR1, | ||
67 | GPIO_FN_ETH_TXD1, | ||
68 | GPIO_FN_DR0, | ||
69 | GPIO_FN_ETH_TXD0, | ||
70 | GPIO_FN_VSYNC, | ||
71 | GPIO_FN_HSPI_CLK, | ||
72 | GPIO_FN_ODDF, | ||
73 | GPIO_FN_HSPI_CS, | ||
74 | GPIO_FN_DG5, | ||
75 | GPIO_FN_ETH_MDIO, | ||
76 | GPIO_FN_DG4, | ||
77 | GPIO_FN_ETH_RX_CLK, | ||
78 | GPIO_FN_DG3, | ||
79 | GPIO_FN_ETH_MDC, | ||
80 | GPIO_FN_DG2, | ||
81 | GPIO_FN_ETH_COL, | ||
82 | GPIO_FN_DG1, | ||
83 | GPIO_FN_ETH_TX_CLK, | ||
84 | GPIO_FN_DG0, | ||
85 | GPIO_FN_ETH_CRS, | ||
86 | GPIO_FN_DCLKIN, | ||
87 | GPIO_FN_HSPI_RX, | ||
88 | GPIO_FN_HSYNC, | ||
89 | GPIO_FN_HSPI_TX, | ||
90 | GPIO_FN_DB5, | ||
91 | GPIO_FN_ETH_RXD3, | ||
92 | GPIO_FN_DB4, | ||
93 | GPIO_FN_ETH_RXD2, | ||
94 | GPIO_FN_DB3, | ||
95 | GPIO_FN_ETH_RXD1, | ||
96 | GPIO_FN_DB2, | ||
97 | GPIO_FN_ETH_RXD0, | ||
98 | GPIO_FN_DB1, | ||
99 | GPIO_FN_ETH_RX_DV, | ||
100 | GPIO_FN_DB0, | ||
101 | GPIO_FN_ETH_RX_ER, | ||
102 | GPIO_FN_DCLKOUT, | ||
103 | GPIO_FN_SCIF1_SLK, | ||
104 | GPIO_FN_SCIF1_RXD, | ||
105 | GPIO_FN_SCIF1_TXD, | ||
106 | GPIO_FN_DACK1, | ||
107 | GPIO_FN_BACK, | ||
108 | GPIO_FN_FALE, | ||
109 | GPIO_FN_DACK0, | ||
110 | GPIO_FN_FCLE, | ||
111 | GPIO_FN_DREQ1, | ||
112 | GPIO_FN_BREQ, | ||
113 | GPIO_FN_USB_OVC1, | ||
114 | GPIO_FN_DREQ0, | ||
115 | GPIO_FN_USB_OVC0, | ||
116 | GPIO_FN_USB_PENC1, | ||
117 | GPIO_FN_USB_PENC0, | ||
118 | GPIO_FN_HAC1_SDOUT, | ||
119 | GPIO_FN_SSI1_SDATA, | ||
120 | GPIO_FN_SDIF1CMD, | ||
121 | GPIO_FN_HAC1_SDIN, | ||
122 | GPIO_FN_SSI1_SCK, | ||
123 | GPIO_FN_SDIF1CD, | ||
124 | GPIO_FN_HAC1_SYNC, | ||
125 | GPIO_FN_SSI1_WS, | ||
126 | GPIO_FN_SDIF1WP, | ||
127 | GPIO_FN_HAC1_BITCLK, | ||
128 | GPIO_FN_SSI1_CLK, | ||
129 | GPIO_FN_SDIF1CLK, | ||
130 | GPIO_FN_HAC0_SDOUT, | ||
131 | GPIO_FN_SSI0_SDATA, | ||
132 | GPIO_FN_SDIF1D3, | ||
133 | GPIO_FN_HAC0_SDIN, | ||
134 | GPIO_FN_SSI0_SCK, | ||
135 | GPIO_FN_SDIF1D2, | ||
136 | GPIO_FN_HAC0_SYNC, | ||
137 | GPIO_FN_SSI0_WS, | ||
138 | GPIO_FN_SDIF1D1, | ||
139 | GPIO_FN_HAC0_BITCLK, | ||
140 | GPIO_FN_SSI0_CLK, | ||
141 | GPIO_FN_SDIF1D0, | ||
142 | GPIO_FN_SCIF3_SCK, | ||
143 | GPIO_FN_SSI2_SDATA, | ||
144 | GPIO_FN_SCIF3_RXD, | ||
145 | GPIO_FN_TCLK, | ||
146 | GPIO_FN_SSI2_SCK, | ||
147 | GPIO_FN_SCIF3_TXD, | ||
148 | GPIO_FN_HAC_RES, | ||
149 | GPIO_FN_SSI2_WS, | ||
150 | GPIO_FN_DACK3, | ||
151 | GPIO_FN_SDIF0CMD, | ||
152 | GPIO_FN_DACK2, | ||
153 | GPIO_FN_SDIF0CD, | ||
154 | GPIO_FN_DREQ3, | ||
155 | GPIO_FN_SDIF0WP, | ||
156 | GPIO_FN_SCIF0_CTS, | ||
157 | GPIO_FN_DREQ2, | ||
158 | GPIO_FN_SDIF0CLK, | ||
159 | GPIO_FN_SCIF0_RTS, | ||
160 | GPIO_FN_IRL7, | ||
161 | GPIO_FN_SDIF0D3, | ||
162 | GPIO_FN_SCIF0_SCK, | ||
163 | GPIO_FN_IRL6, | ||
164 | GPIO_FN_SDIF0D2, | ||
165 | GPIO_FN_SCIF0_RXD, | ||
166 | GPIO_FN_IRL5, | ||
167 | GPIO_FN_SDIF0D1, | ||
168 | GPIO_FN_SCIF0_TXD, | ||
169 | GPIO_FN_IRL4, | ||
170 | GPIO_FN_SDIF0D0, | ||
171 | GPIO_FN_SCIF5_SCK, | ||
172 | GPIO_FN_FRB, | ||
173 | GPIO_FN_SCIF5_RXD, | ||
174 | GPIO_FN_IOIS16, | ||
175 | GPIO_FN_SCIF5_TXD, | ||
176 | GPIO_FN_CE2B, | ||
177 | GPIO_FN_DRAK3, | ||
178 | GPIO_FN_CE2A, | ||
179 | GPIO_FN_SCIF4_SCK, | ||
180 | GPIO_FN_DRAK2, | ||
181 | GPIO_FN_SSI3_WS, | ||
182 | GPIO_FN_SCIF4_RXD, | ||
183 | GPIO_FN_DRAK1, | ||
184 | GPIO_FN_SSI3_SDATA, | ||
185 | GPIO_FN_FSTATUS, | ||
186 | GPIO_FN_SCIF4_TXD, | ||
187 | GPIO_FN_DRAK0, | ||
188 | GPIO_FN_SSI3_SCK, | ||
189 | GPIO_FN_FSE, | ||
190 | }; | ||
191 | |||
192 | #endif /* __CPU_SH7786_H__ */ | ||
diff --git a/arch/sh/include/mach-common/mach/urquell.h b/arch/sh/include/mach-common/mach/urquell.h new file mode 100644 index 000000000000..14b3e1d01777 --- /dev/null +++ b/arch/sh/include/mach-common/mach/urquell.h | |||
@@ -0,0 +1,68 @@ | |||
1 | #ifndef __MACH_URQUELL_H | ||
2 | #define __MACH_URQUELL_H | ||
3 | |||
4 | /* | ||
5 | * ------ 0x00000000 ------------------------------------ | ||
6 | * CS0 | (SW1,SW47) EEPROM, SRAM, NOR FLASH | ||
7 | * -----+ 0x04000000 ------------------------------------ | ||
8 | * CS1 | (SW47) SRAM, SRAM-LAN-PCMCIA, NOR FLASH | ||
9 | * -----+ 0x08000000 ------------------------------------ | ||
10 | * CS2 | DDR3 | ||
11 | * CS3 | | ||
12 | * -----+ 0x10000000 ------------------------------------ | ||
13 | * CS4 | PCIe | ||
14 | * -----+ 0x14000000 ------------------------------------ | ||
15 | * CS5 | (SW47) LRAM/URAM, SRAM-LAN-PCMCIA | ||
16 | * -----+ 0x18000000 ------------------------------------ | ||
17 | * CS6 | ATA, NAND FLASH | ||
18 | * -----+ 0x1c000000 ------------------------------------ | ||
19 | * CS7 | SH7786 register | ||
20 | * -----+------------------------------------------------ | ||
21 | */ | ||
22 | |||
23 | #define NOR_FLASH_ADDR 0x00000000 | ||
24 | #define NOR_FLASH_SIZE 0x04000000 | ||
25 | |||
26 | #define CS1_BASE 0x05000000 | ||
27 | #define CS5_BASE 0x15000000 | ||
28 | #define FPGA_BASE CS1_BASE | ||
29 | |||
30 | #define BOARDREG(ofs) (FPGA_BASE + ofs##_OFS) | ||
31 | #define UBOARDREG(ofs) (0xa0000000 + FPGA_BASE + ofs##_OFS) | ||
32 | |||
33 | #define SRSTR_OFS 0x0000 /* System reset register */ | ||
34 | #define BDMR_OFS 0x0010 /* Board operating mode resister */ | ||
35 | #define IRL0SR_OFS 0x0020 /* IRL0 Status register */ | ||
36 | #define IRL0MSKR_OFS 0x0030 /* IRL0 Mask register */ | ||
37 | #define IRL1SR_OFS 0x0040 /* IRL1 Status register */ | ||
38 | #define IRL1MSKR_OFS 0x0050 /* IRL1 Mask register */ | ||
39 | #define IRL2SR_OFS 0x0060 /* IRL2 Status register */ | ||
40 | #define IRL2MSKR_OFS 0x0070 /* IRL2 Mask register */ | ||
41 | #define IRL3SR_OFS 0x0080 /* IRL3 Status register */ | ||
42 | #define IRL3MSKR_OFS 0x0090 /* IRL3 Mask register */ | ||
43 | #define SOFTINTR_OFS 0x0120 /* Softwear Interrupt register */ | ||
44 | #define SLEDR_OFS 0x0130 /* LED control resister */ | ||
45 | #define MAPSCIFSWR_OFS 0x0140 /* Map/SCIF Switch register */ | ||
46 | #define FPVERR_OFS 0x0150 /* FPGA Version register */ | ||
47 | #define FPDATER_OFS 0x0160 /* FPGA Date register */ | ||
48 | #define FPYEARR_OFS 0x0170 /* FPGA Year register */ | ||
49 | #define TCLKCR_OFS 0x0180 /* TCLK Control register */ | ||
50 | #define DIPSWMR_OFS 0x1000 /* DIPSW monitor register */ | ||
51 | #define FPODR_OFS 0x1010 /* Output port data register */ | ||
52 | #define ATACNR_OFS 0x1020 /* ATA-CN Control/status register */ | ||
53 | #define FPINDR_OFS 0x1030 /* Input port data register */ | ||
54 | #define MDSWMR_OFS 0x1040 /* MODE SW monitor register */ | ||
55 | #define DDR3BUPCR_OFS 0x1050 /* DDR3 Backup control register */ | ||
56 | #define SSICODECCR_OFS 0x1060 /* SSI-CODEC control register */ | ||
57 | #define PCIESLOTSR_OFS 0x1070 /* PCIexpress Slot status register */ | ||
58 | #define ETHERPORTSR_OFS 0x1080 /* EtherPhy Port status register */ | ||
59 | #define LATCHCR_OFS 0x3000 /* Latch control register */ | ||
60 | #define LATCUAR_OFS 0x3010 /* Latch upper address register */ | ||
61 | #define LATCLAR_OFS 0x3012 /* Latch lower address register */ | ||
62 | #define LATCLUDR_OFS 0x3024 /* Latch D31-16 register */ | ||
63 | #define LATCLLDR_OFS 0x3026 /* Latch D15-0 register */ | ||
64 | |||
65 | #define CHARLED_OFS 0x2000 /* Character LED */ | ||
66 | |||
67 | #endif /* __MACH_URQUELL_H */ | ||
68 | |||
diff --git a/arch/sh/kernel/Makefile_32 b/arch/sh/kernel/Makefile_32 index 2e1b86e16ab5..82a3a150c00d 100644 --- a/arch/sh/kernel/Makefile_32 +++ b/arch/sh/kernel/Makefile_32 | |||
@@ -30,5 +30,6 @@ obj-$(CONFIG_KPROBES) += kprobes.o | |||
30 | obj-$(CONFIG_GENERIC_GPIO) += gpio.o | 30 | obj-$(CONFIG_GENERIC_GPIO) += gpio.o |
31 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o | 31 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o |
32 | obj-$(CONFIG_DUMP_CODE) += disassemble.o | 32 | obj-$(CONFIG_DUMP_CODE) += disassemble.o |
33 | obj-$(CONFIG_HIBERNATION) += swsusp.o | ||
33 | 34 | ||
34 | EXTRA_CFLAGS += -Werror | 35 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/sh/kernel/asm-offsets.c b/arch/sh/kernel/asm-offsets.c index 57cf0e0680f3..99aceb28ee24 100644 --- a/arch/sh/kernel/asm-offsets.c +++ b/arch/sh/kernel/asm-offsets.c | |||
@@ -12,8 +12,10 @@ | |||
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/kbuild.h> | 14 | #include <linux/kbuild.h> |
15 | #include <linux/suspend.h> | ||
15 | 16 | ||
16 | #include <asm/thread_info.h> | 17 | #include <asm/thread_info.h> |
18 | #include <asm/suspend.h> | ||
17 | 19 | ||
18 | int main(void) | 20 | int main(void) |
19 | { | 21 | { |
@@ -25,5 +27,11 @@ int main(void) | |||
25 | DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count)); | 27 | DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count)); |
26 | DEFINE(TI_RESTART_BLOCK,offsetof(struct thread_info, restart_block)); | 28 | DEFINE(TI_RESTART_BLOCK,offsetof(struct thread_info, restart_block)); |
27 | 29 | ||
30 | #ifdef CONFIG_HIBERNATION | ||
31 | DEFINE(PBE_ADDRESS, offsetof(struct pbe, address)); | ||
32 | DEFINE(PBE_ORIG_ADDRESS, offsetof(struct pbe, orig_address)); | ||
33 | DEFINE(PBE_NEXT, offsetof(struct pbe, next)); | ||
34 | DEFINE(SWSUSP_ARCH_REGS_SIZE, sizeof(struct swsusp_arch_regs)); | ||
35 | #endif | ||
28 | return 0; | 36 | return 0; |
29 | } | 37 | } |
diff --git a/arch/sh/kernel/cpu/Makefile b/arch/sh/kernel/cpu/Makefile index f471d242774e..2600641a483f 100644 --- a/arch/sh/kernel/cpu/Makefile +++ b/arch/sh/kernel/cpu/Makefile | |||
@@ -11,6 +11,7 @@ obj-$(CONFIG_CPU_SH5) = sh5/ | |||
11 | # Special cases for family ancestry. | 11 | # Special cases for family ancestry. |
12 | 12 | ||
13 | obj-$(CONFIG_CPU_SH4A) += sh4a/ | 13 | obj-$(CONFIG_CPU_SH4A) += sh4a/ |
14 | obj-$(CONFIG_ARCH_SHMOBILE) += shmobile/ | ||
14 | 15 | ||
15 | # Common interfaces. | 16 | # Common interfaces. |
16 | 17 | ||
diff --git a/arch/sh/kernel/cpu/clock.c b/arch/sh/kernel/cpu/clock.c index 7b17137536d6..1dc896483b59 100644 --- a/arch/sh/kernel/cpu/clock.c +++ b/arch/sh/kernel/cpu/clock.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
22 | #include <linux/kref.h> | 22 | #include <linux/kref.h> |
23 | #include <linux/kobject.h> | ||
24 | #include <linux/sysdev.h> | ||
23 | #include <linux/seq_file.h> | 25 | #include <linux/seq_file.h> |
24 | #include <linux/err.h> | 26 | #include <linux/err.h> |
25 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
@@ -239,6 +241,35 @@ void clk_recalc_rate(struct clk *clk) | |||
239 | } | 241 | } |
240 | EXPORT_SYMBOL_GPL(clk_recalc_rate); | 242 | EXPORT_SYMBOL_GPL(clk_recalc_rate); |
241 | 243 | ||
244 | int clk_set_parent(struct clk *clk, struct clk *parent) | ||
245 | { | ||
246 | int ret = -EINVAL; | ||
247 | struct clk *old; | ||
248 | |||
249 | if (!parent || !clk) | ||
250 | return ret; | ||
251 | |||
252 | old = clk->parent; | ||
253 | if (likely(clk->ops && clk->ops->set_parent)) { | ||
254 | unsigned long flags; | ||
255 | spin_lock_irqsave(&clock_lock, flags); | ||
256 | ret = clk->ops->set_parent(clk, parent); | ||
257 | spin_unlock_irqrestore(&clock_lock, flags); | ||
258 | clk->parent = (ret ? old : parent); | ||
259 | } | ||
260 | |||
261 | if (unlikely(clk->flags & CLK_RATE_PROPAGATES)) | ||
262 | propagate_rate(clk); | ||
263 | return ret; | ||
264 | } | ||
265 | EXPORT_SYMBOL_GPL(clk_set_parent); | ||
266 | |||
267 | struct clk *clk_get_parent(struct clk *clk) | ||
268 | { | ||
269 | return clk->parent; | ||
270 | } | ||
271 | EXPORT_SYMBOL_GPL(clk_get_parent); | ||
272 | |||
242 | long clk_round_rate(struct clk *clk, unsigned long rate) | 273 | long clk_round_rate(struct clk *clk, unsigned long rate) |
243 | { | 274 | { |
244 | if (likely(clk->ops && clk->ops->round_rate)) { | 275 | if (likely(clk->ops && clk->ops->round_rate)) { |
@@ -329,6 +360,70 @@ static int show_clocks(char *buf, char **start, off_t off, | |||
329 | return p - buf; | 360 | return p - buf; |
330 | } | 361 | } |
331 | 362 | ||
363 | #ifdef CONFIG_PM | ||
364 | static int clks_sysdev_suspend(struct sys_device *dev, pm_message_t state) | ||
365 | { | ||
366 | static pm_message_t prev_state; | ||
367 | struct clk *clkp; | ||
368 | |||
369 | switch (state.event) { | ||
370 | case PM_EVENT_ON: | ||
371 | /* Resumeing from hibernation */ | ||
372 | if (prev_state.event == PM_EVENT_FREEZE) { | ||
373 | list_for_each_entry(clkp, &clock_list, node) | ||
374 | if (likely(clkp->ops)) { | ||
375 | unsigned long rate = clkp->rate; | ||
376 | |||
377 | if (likely(clkp->ops->set_parent)) | ||
378 | clkp->ops->set_parent(clkp, | ||
379 | clkp->parent); | ||
380 | if (likely(clkp->ops->set_rate)) | ||
381 | clkp->ops->set_rate(clkp, | ||
382 | rate, NO_CHANGE); | ||
383 | else if (likely(clkp->ops->recalc)) | ||
384 | clkp->ops->recalc(clkp); | ||
385 | } | ||
386 | } | ||
387 | break; | ||
388 | case PM_EVENT_FREEZE: | ||
389 | break; | ||
390 | case PM_EVENT_SUSPEND: | ||
391 | break; | ||
392 | } | ||
393 | |||
394 | prev_state = state; | ||
395 | return 0; | ||
396 | } | ||
397 | |||
398 | static int clks_sysdev_resume(struct sys_device *dev) | ||
399 | { | ||
400 | return clks_sysdev_suspend(dev, PMSG_ON); | ||
401 | } | ||
402 | |||
403 | static struct sysdev_class clks_sysdev_class = { | ||
404 | .name = "clks", | ||
405 | }; | ||
406 | |||
407 | static struct sysdev_driver clks_sysdev_driver = { | ||
408 | .suspend = clks_sysdev_suspend, | ||
409 | .resume = clks_sysdev_resume, | ||
410 | }; | ||
411 | |||
412 | static struct sys_device clks_sysdev_dev = { | ||
413 | .cls = &clks_sysdev_class, | ||
414 | }; | ||
415 | |||
416 | static int __init clk_sysdev_init(void) | ||
417 | { | ||
418 | sysdev_class_register(&clks_sysdev_class); | ||
419 | sysdev_driver_register(&clks_sysdev_class, &clks_sysdev_driver); | ||
420 | sysdev_register(&clks_sysdev_dev); | ||
421 | |||
422 | return 0; | ||
423 | } | ||
424 | subsys_initcall(clk_sysdev_init); | ||
425 | #endif | ||
426 | |||
332 | int __init clk_init(void) | 427 | int __init clk_init(void) |
333 | { | 428 | { |
334 | int i, ret = 0; | 429 | int i, ret = 0; |
diff --git a/arch/sh/kernel/cpu/sh2/setup-sh7619.c b/arch/sh/kernel/cpu/sh2/setup-sh7619.c index 56e5878e5516..0e32d8e448ca 100644 --- a/arch/sh/kernel/cpu/sh2/setup-sh7619.c +++ b/arch/sh/kernel/cpu/sh2/setup-sh7619.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * SH7619 Setup | 2 | * SH7619 Setup |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Yoshinori Sato | 4 | * Copyright (C) 2006 Yoshinori Sato |
5 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | 6 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 8 | * License. See the file "COPYING" in the main directory of this archive |
@@ -18,15 +19,10 @@ enum { | |||
18 | /* interrupt sources */ | 19 | /* interrupt sources */ |
19 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 20 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
20 | WDT, EDMAC, CMT0, CMT1, | 21 | WDT, EDMAC, CMT0, CMT1, |
21 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | 22 | SCIF0, SCIF1, SCIF2, |
22 | SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, | ||
23 | SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI, | ||
24 | HIF_HIFI, HIF_HIFBI, | 23 | HIF_HIFI, HIF_HIFBI, |
25 | DMAC0, DMAC1, DMAC2, DMAC3, | 24 | DMAC0, DMAC1, DMAC2, DMAC3, |
26 | SIOF, | 25 | SIOF, |
27 | |||
28 | /* interrupt groups */ | ||
29 | SCIF0, SCIF1, SCIF2, | ||
30 | }; | 26 | }; |
31 | 27 | ||
32 | static struct intc_vect vectors[] __initdata = { | 28 | static struct intc_vect vectors[] __initdata = { |
@@ -36,24 +32,18 @@ static struct intc_vect vectors[] __initdata = { | |||
36 | INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83), | 32 | INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83), |
37 | INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85), | 33 | INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85), |
38 | INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87), | 34 | INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87), |
39 | INTC_IRQ(SCIF0_ERI, 88), INTC_IRQ(SCIF0_RXI, 89), | 35 | INTC_IRQ(SCIF0, 88), INTC_IRQ(SCIF0, 89), |
40 | INTC_IRQ(SCIF0_BRI, 90), INTC_IRQ(SCIF0_TXI, 91), | 36 | INTC_IRQ(SCIF0, 90), INTC_IRQ(SCIF0, 91), |
41 | INTC_IRQ(SCIF1_ERI, 92), INTC_IRQ(SCIF1_RXI, 93), | 37 | INTC_IRQ(SCIF1, 92), INTC_IRQ(SCIF1, 93), |
42 | INTC_IRQ(SCIF1_BRI, 94), INTC_IRQ(SCIF1_TXI, 95), | 38 | INTC_IRQ(SCIF1, 94), INTC_IRQ(SCIF1, 95), |
43 | INTC_IRQ(SCIF2_ERI, 96), INTC_IRQ(SCIF2_RXI, 97), | 39 | INTC_IRQ(SCIF2, 96), INTC_IRQ(SCIF2, 97), |
44 | INTC_IRQ(SCIF2_BRI, 98), INTC_IRQ(SCIF2_TXI, 99), | 40 | INTC_IRQ(SCIF2, 98), INTC_IRQ(SCIF2, 99), |
45 | INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101), | 41 | INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101), |
46 | INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105), | 42 | INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105), |
47 | INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107), | 43 | INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107), |
48 | INTC_IRQ(SIOF, 108), | 44 | INTC_IRQ(SIOF, 108), |
49 | }; | 45 | }; |
50 | 46 | ||
51 | static struct intc_group groups[] __initdata = { | ||
52 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
53 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | ||
54 | INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI), | ||
55 | }; | ||
56 | |||
57 | static struct intc_prio_reg prio_registers[] __initdata = { | 47 | static struct intc_prio_reg prio_registers[] __initdata = { |
58 | { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } }, | 48 | { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } }, |
59 | { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } }, | 49 | { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } }, |
@@ -64,7 +54,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
64 | { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } }, | 54 | { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } }, |
65 | }; | 55 | }; |
66 | 56 | ||
67 | static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, groups, | 57 | static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, NULL, |
68 | NULL, prio_registers, NULL); | 58 | NULL, prio_registers, NULL); |
69 | 59 | ||
70 | static struct plat_sci_port sci_platform_data[] = { | 60 | static struct plat_sci_port sci_platform_data[] = { |
@@ -72,17 +62,17 @@ static struct plat_sci_port sci_platform_data[] = { | |||
72 | .mapbase = 0xf8400000, | 62 | .mapbase = 0xf8400000, |
73 | .flags = UPF_BOOT_AUTOCONF, | 63 | .flags = UPF_BOOT_AUTOCONF, |
74 | .type = PORT_SCIF, | 64 | .type = PORT_SCIF, |
75 | .irqs = { 88, 89, 91, 90}, | 65 | .irqs = { 88, 88, 88, 88 }, |
76 | }, { | 66 | }, { |
77 | .mapbase = 0xf8410000, | 67 | .mapbase = 0xf8410000, |
78 | .flags = UPF_BOOT_AUTOCONF, | 68 | .flags = UPF_BOOT_AUTOCONF, |
79 | .type = PORT_SCIF, | 69 | .type = PORT_SCIF, |
80 | .irqs = { 92, 93, 95, 94}, | 70 | .irqs = { 92, 92, 92, 92 }, |
81 | }, { | 71 | }, { |
82 | .mapbase = 0xf8420000, | 72 | .mapbase = 0xf8420000, |
83 | .flags = UPF_BOOT_AUTOCONF, | 73 | .flags = UPF_BOOT_AUTOCONF, |
84 | .type = PORT_SCIF, | 74 | .type = PORT_SCIF, |
85 | .irqs = { 96, 97, 99, 98}, | 75 | .irqs = { 96, 96, 96, 96 }, |
86 | }, { | 76 | }, { |
87 | .flags = 0, | 77 | .flags = 0, |
88 | } | 78 | } |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-mxg.c b/arch/sh/kernel/cpu/sh2a/setup-mxg.c index e611d79fac4c..844293723cfc 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-mxg.c +++ b/arch/sh/kernel/cpu/sh2a/setup-mxg.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Renesas MX-G (R8A03022BG) Setup | 2 | * Renesas MX-G (R8A03022BG) Setup |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Paul Mundt | 4 | * Copyright (C) 2008, 2009 Paul Mundt |
5 | * | 5 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 6 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 7 | * License. See the file "COPYING" in the main directory of this archive |
@@ -20,23 +20,15 @@ enum { | |||
20 | IRQ8, IRQ9, IRQ10, IRQ11, IRQ12, IRQ13, IRQ14, IRQ15, | 20 | IRQ8, IRQ9, IRQ10, IRQ11, IRQ12, IRQ13, IRQ14, IRQ15, |
21 | 21 | ||
22 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, | 22 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, |
23 | |||
24 | SINT8, SINT7, SINT6, SINT5, SINT4, SINT3, SINT2, SINT1, | 23 | SINT8, SINT7, SINT6, SINT5, SINT4, SINT3, SINT2, SINT1, |
25 | 24 | ||
26 | SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI, | 25 | SCIF0, SCIF1, |
27 | SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI, | ||
28 | 26 | ||
29 | MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D, | 27 | MTU2_GROUP1, MTU2_GROUP2, MTU2_GROUP3, MTU2_GROUP4, MTU2_GROUP5 |
30 | MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F, | 28 | MTU2_TGI3B, MTU2_TGI3C, |
31 | MTU2_TGI1A, MTU2_TGI1B, MTU2_TCI1V, MTU2_TCI1U, | ||
32 | MTU2_TGI2A, MTU2_TGI2B, MTU2_TCI2V, MTU2_TCI2U, | ||
33 | MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D, MTU2_TCI3V, | ||
34 | MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D, MTU2_TCI4V, | ||
35 | MTU2_TGI5U, MTU2_TGI5V, MTU2_TGI5W, | ||
36 | 29 | ||
37 | /* interrupt groups */ | 30 | /* interrupt groups */ |
38 | PINT, SCIF0, SCIF1, | 31 | PINT, |
39 | MTU2_GROUP1, MTU2_GROUP2, MTU2_GROUP3, MTU2_GROUP4, MTU2_GROUP5 | ||
40 | }; | 32 | }; |
41 | 33 | ||
42 | static struct intc_vect vectors[] __initdata = { | 34 | static struct intc_vect vectors[] __initdata = { |
@@ -59,47 +51,36 @@ static struct intc_vect vectors[] __initdata = { | |||
59 | INTC_IRQ(SINT4, 98), INTC_IRQ(SINT3, 99), | 51 | INTC_IRQ(SINT4, 98), INTC_IRQ(SINT3, 99), |
60 | INTC_IRQ(SINT2, 100), INTC_IRQ(SINT1, 101), | 52 | INTC_IRQ(SINT2, 100), INTC_IRQ(SINT1, 101), |
61 | 53 | ||
62 | INTC_IRQ(SCIF0_RXI, 220), INTC_IRQ(SCIF0_TXI, 221), | 54 | INTC_IRQ(SCIF0, 220), INTC_IRQ(SCIF0, 221), |
63 | INTC_IRQ(SCIF0_BRI, 222), INTC_IRQ(SCIF0_ERI, 223), | 55 | INTC_IRQ(SCIF0, 222), INTC_IRQ(SCIF0, 223), |
64 | INTC_IRQ(SCIF1_RXI, 224), INTC_IRQ(SCIF1_TXI, 225), | 56 | INTC_IRQ(SCIF1, 224), INTC_IRQ(SCIF1, 225), |
65 | INTC_IRQ(SCIF1_BRI, 226), INTC_IRQ(SCIF1_ERI, 227), | 57 | INTC_IRQ(SCIF1, 226), INTC_IRQ(SCIF1, 227), |
66 | 58 | ||
67 | INTC_IRQ(MTU2_TGI0A, 228), INTC_IRQ(MTU2_TGI0B, 229), | 59 | INTC_IRQ(MTU2_GROUP1, 228), INTC_IRQ(MTU2_GROUP1, 229), |
68 | INTC_IRQ(MTU2_TGI0C, 230), INTC_IRQ(MTU2_TGI0D, 231), | 60 | INTC_IRQ(MTU2_GROUP1, 230), INTC_IRQ(MTU2_GROUP1, 231), |
69 | INTC_IRQ(MTU2_TCI0V, 232), INTC_IRQ(MTU2_TGI0E, 233), | 61 | INTC_IRQ(MTU2_GROUP1, 232), INTC_IRQ(MTU2_GROUP1, 233), |
70 | 62 | ||
71 | INTC_IRQ(MTU2_TGI0F, 234), INTC_IRQ(MTU2_TGI1A, 235), | 63 | INTC_IRQ(MTU2_GROUP2, 234), INTC_IRQ(MTU2_GROUP2, 235), |
72 | INTC_IRQ(MTU2_TGI1B, 236), INTC_IRQ(MTU2_TCI1V, 237), | 64 | INTC_IRQ(MTU2_GROUP2, 236), INTC_IRQ(MTU2_GROUP2, 237), |
73 | INTC_IRQ(MTU2_TCI1U, 238), INTC_IRQ(MTU2_TGI2A, 239), | 65 | INTC_IRQ(MTU2_GROUP2, 238), INTC_IRQ(MTU2_GROUP2, 239), |
74 | 66 | ||
75 | INTC_IRQ(MTU2_TGI2B, 240), INTC_IRQ(MTU2_TCI2V, 241), | 67 | INTC_IRQ(MTU2_GROUP3, 240), INTC_IRQ(MTU2_GROUP3, 241), |
76 | INTC_IRQ(MTU2_TCI2U, 242), INTC_IRQ(MTU2_TGI3A, 243), | 68 | INTC_IRQ(MTU2_GROUP3, 242), INTC_IRQ(MTU2_GROUP3, 243), |
77 | 69 | ||
78 | INTC_IRQ(MTU2_TGI3B, 244), | 70 | INTC_IRQ(MTU2_TGI3B, 244), |
79 | INTC_IRQ(MTU2_TGI3C, 245), | 71 | INTC_IRQ(MTU2_TGI3C, 245), |
80 | 72 | ||
81 | INTC_IRQ(MTU2_TGI3D, 246), INTC_IRQ(MTU2_TCI3V, 247), | 73 | INTC_IRQ(MTU2_GROUP4, 246), INTC_IRQ(MTU2_GROUP4, 247), |
82 | INTC_IRQ(MTU2_TGI4A, 248), INTC_IRQ(MTU2_TGI4B, 249), | 74 | INTC_IRQ(MTU2_GROUP4, 248), INTC_IRQ(MTU2_GROUP4, 249), |
83 | INTC_IRQ(MTU2_TGI4C, 250), INTC_IRQ(MTU2_TGI4D, 251), | 75 | INTC_IRQ(MTU2_GROUP4, 250), INTC_IRQ(MTU2_GROUP4, 251), |
84 | 76 | ||
85 | INTC_IRQ(MTU2_TCI4V, 252), INTC_IRQ(MTU2_TGI5U, 253), | 77 | INTC_IRQ(MTU2_GROUP5, 252), INTC_IRQ(MTU2_GROUP5, 253), |
86 | INTC_IRQ(MTU2_TGI5V, 254), INTC_IRQ(MTU2_TGI5W, 255), | 78 | INTC_IRQ(MTU2_GROUP5, 254), INTC_IRQ(MTU2_GROUP5, 255), |
87 | }; | 79 | }; |
88 | 80 | ||
89 | static struct intc_group groups[] __initdata = { | 81 | static struct intc_group groups[] __initdata = { |
90 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, | 82 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, |
91 | PINT4, PINT5, PINT6, PINT7), | 83 | PINT4, PINT5, PINT6, PINT7), |
92 | INTC_GROUP(MTU2_GROUP1, MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D, | ||
93 | MTU2_TCI0V, MTU2_TGI0E), | ||
94 | INTC_GROUP(MTU2_GROUP2, MTU2_TGI0F, MTU2_TGI1A, MTU2_TGI1B, | ||
95 | MTU2_TCI1V, MTU2_TCI1U, MTU2_TGI2A), | ||
96 | INTC_GROUP(MTU2_GROUP3, MTU2_TGI2B, MTU2_TCI2V, MTU2_TCI2U, | ||
97 | MTU2_TGI3A), | ||
98 | INTC_GROUP(MTU2_GROUP4, MTU2_TGI3D, MTU2_TCI3V, MTU2_TGI4A, | ||
99 | MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D), | ||
100 | INTC_GROUP(MTU2_GROUP5, MTU2_TCI4V, MTU2_TGI5U, MTU2_TGI5V, MTU2_TGI5W), | ||
101 | INTC_GROUP(SCIF0, SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI), | ||
102 | INTC_GROUP(SCIF1, SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI), | ||
103 | }; | 84 | }; |
104 | 85 | ||
105 | static struct intc_prio_reg prio_registers[] __initdata = { | 86 | static struct intc_prio_reg prio_registers[] __initdata = { |
@@ -137,7 +118,7 @@ static struct plat_sci_port sci_platform_data[] = { | |||
137 | .mapbase = 0xff804000, | 118 | .mapbase = 0xff804000, |
138 | .flags = UPF_BOOT_AUTOCONF, | 119 | .flags = UPF_BOOT_AUTOCONF, |
139 | .type = PORT_SCIF, | 120 | .type = PORT_SCIF, |
140 | .irqs = { 223, 220, 221, 222 }, | 121 | .irqs = { 220, 220, 220, 220 }, |
141 | }, { | 122 | }, { |
142 | .flags = 0, | 123 | .flags = 0, |
143 | } | 124 | } |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7201.c b/arch/sh/kernel/cpu/sh2a/setup-sh7201.c index 0631e421c022..00f42f9e3f5c 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7201.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7201.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * SH7201 setup | 2 | * SH7201 setup |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Peter Griffin pgriffin@mpc-data.co.uk | 4 | * Copyright (C) 2008 Peter Griffin pgriffin@mpc-data.co.uk |
5 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | 6 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 8 | * License. See the file "COPYING" in the main directory of this archive |
@@ -18,57 +19,32 @@ enum { | |||
18 | /* interrupt sources */ | 19 | /* interrupt sources */ |
19 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 20 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
20 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, | 21 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, |
22 | |||
21 | ADC_ADI, | 23 | ADC_ADI, |
22 | MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D, | 24 | |
23 | MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F, | 25 | MTU20_ABCD, MTU20_VEF, MTU21_AB, MTU21_VU, MTU22_AB, MTU22_VU, |
24 | MTU2_TGI1A, MTU2_TGI1B, MTU2_TCI1V, MTU2_TCI1U, | 26 | MTU23_ABCD, MTU24_ABCD, MTU25_UVW, MTU2_TCI3V, MTU2_TCI4V, |
25 | MTU2_TGI2A, MTU2_TGI2B, MTU2_TCI2V, MTU2_TCI2U, | 27 | |
26 | MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D, MTU2_TCI3V, | 28 | RTC, WDT, |
27 | MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D, MTU2_TCI4V, | 29 | |
28 | MTU2_TGI5U, MTU2_TGI5V, MTU2_TGI5W, | 30 | IIC30, IIC31, IIC32, |
29 | RTC_ARM, RTC_PRD, RTC_CUP, | ||
30 | WDT, | ||
31 | IIC30_STPI, IIC30_NAKI, IIC30_RXI, IIC30_TXI, IIC30_TEI, | ||
32 | IIC31_STPI, IIC31_NAKI, IIC31_RXI, IIC31_TXI, IIC31_TEI, | ||
33 | IIC32_STPI, IIC32_NAKI, IIC32_RXI, IIC32_TXI, IIC32_TEI, | ||
34 | 31 | ||
35 | DMAC0_DMINT0, DMAC1_DMINT1, | 32 | DMAC0_DMINT0, DMAC1_DMINT1, |
36 | DMAC2_DMINT2, DMAC3_DMINT3, | 33 | DMAC2_DMINT2, DMAC3_DMINT3, |
37 | 34 | ||
38 | SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI, | 35 | SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5, SCIF6, SCIF7, |
39 | SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI, | ||
40 | SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI, | ||
41 | SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI, | ||
42 | SCIF4_BRI, SCIF4_ERI, SCIF4_RXI, SCIF4_TXI, | ||
43 | SCIF5_BRI, SCIF5_ERI, SCIF5_RXI, SCIF5_TXI, | ||
44 | SCIF6_BRI, SCIF6_ERI, SCIF6_RXI, SCIF6_TXI, | ||
45 | SCIF7_BRI, SCIF7_ERI, SCIF7_RXI, SCIF7_TXI, | ||
46 | 36 | ||
47 | DMAC0_DMINTA, DMAC4_DMINT4, DMAC5_DMINT5, DMAC6_DMINT6, | 37 | DMAC0_DMINTA, DMAC4_DMINT4, DMAC5_DMINT5, DMAC6_DMINT6, |
48 | DMAC7_DMINT7, | 38 | DMAC7_DMINT7, |
49 | 39 | ||
50 | RCAN0_ERS, RCAN0_OVR, | 40 | RCAN0, RCAN1, |
51 | RCAN0_SLE, | ||
52 | RCAN0_RM0, RCAN0_RM1, | ||
53 | |||
54 | RCAN1_ERS, RCAN1_OVR, | ||
55 | RCAN1_SLE, | ||
56 | RCAN1_RM0, RCAN1_RM1, | ||
57 | 41 | ||
58 | SSI0_SSII, SSI1_SSII, | 42 | SSI0_SSII, SSI1_SSII, |
59 | 43 | ||
60 | TMR0_CMIA0, TMR0_CMIB0, TMR0_OVI0, | 44 | TMR0, TMR1, |
61 | TMR1_CMIA1, TMR1_CMIB1, TMR1_OVI1, | ||
62 | 45 | ||
63 | /* interrupt groups */ | 46 | /* interrupt groups */ |
64 | 47 | PINT, | |
65 | IRQ, PINT, ADC, | ||
66 | MTU20_ABCD, MTU20_VEF, MTU21_AB, MTU21_VU, MTU22_AB, MTU22_VU, | ||
67 | MTU23_ABCD, MTU24_ABCD, MTU25_UVW, | ||
68 | RTC, IIC30, IIC31, IIC32, | ||
69 | SCIF0, SCIF1, SCIF2, SCIF3, SCIF4, SCIF5, SCIF6, SCIF7, | ||
70 | RCAN0, RCAN1, TMR0, TMR1 | ||
71 | |||
72 | }; | 48 | }; |
73 | 49 | ||
74 | static struct intc_vect vectors[] __initdata = { | 50 | static struct intc_vect vectors[] __initdata = { |
@@ -76,6 +52,7 @@ static struct intc_vect vectors[] __initdata = { | |||
76 | INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67), | 52 | INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67), |
77 | INTC_IRQ(IRQ4, 68), INTC_IRQ(IRQ5, 69), | 53 | INTC_IRQ(IRQ4, 68), INTC_IRQ(IRQ5, 69), |
78 | INTC_IRQ(IRQ6, 70), INTC_IRQ(IRQ7, 71), | 54 | INTC_IRQ(IRQ6, 70), INTC_IRQ(IRQ7, 71), |
55 | |||
79 | INTC_IRQ(PINT0, 80), INTC_IRQ(PINT1, 81), | 56 | INTC_IRQ(PINT0, 80), INTC_IRQ(PINT1, 81), |
80 | INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83), | 57 | INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83), |
81 | INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85), | 58 | INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85), |
@@ -83,123 +60,92 @@ static struct intc_vect vectors[] __initdata = { | |||
83 | 60 | ||
84 | INTC_IRQ(ADC_ADI, 92), | 61 | INTC_IRQ(ADC_ADI, 92), |
85 | 62 | ||
86 | INTC_IRQ(MTU2_TGI0A, 108), INTC_IRQ(MTU2_TGI0B, 109), | 63 | INTC_IRQ(MTU20_ABCD, 108), INTC_IRQ(MTU20_ABCD, 109), |
87 | INTC_IRQ(MTU2_TGI0C, 110), INTC_IRQ(MTU2_TGI0D, 111), | 64 | INTC_IRQ(MTU20_ABCD, 110), INTC_IRQ(MTU20_ABCD, 111), |
88 | INTC_IRQ(MTU2_TCI0V, 112), | 65 | |
89 | INTC_IRQ(MTU2_TGI0E, 113), INTC_IRQ(MTU2_TGI0F, 114), | 66 | INTC_IRQ(MTU20_VEF, 112), INTC_IRQ(MTU20_VEF, 113), |
67 | INTC_IRQ(MTU20_VEF, 114), | ||
68 | |||
69 | INTC_IRQ(MTU21_AB, 116), INTC_IRQ(MTU21_AB, 117), | ||
70 | INTC_IRQ(MTU21_VU, 120), INTC_IRQ(MTU21_VU, 121), | ||
90 | 71 | ||
91 | INTC_IRQ(MTU2_TGI1A, 116), INTC_IRQ(MTU2_TGI1B, 117), | 72 | INTC_IRQ(MTU22_AB, 124), INTC_IRQ(MTU22_AB, 125), |
92 | INTC_IRQ(MTU2_TCI1V, 120), INTC_IRQ(MTU2_TCI1U, 121), | 73 | INTC_IRQ(MTU22_VU, 128), INTC_IRQ(MTU22_VU, 129), |
93 | 74 | ||
94 | INTC_IRQ(MTU2_TGI2A, 124), INTC_IRQ(MTU2_TGI2B, 125), | 75 | INTC_IRQ(MTU23_ABCD, 132), INTC_IRQ(MTU23_ABCD, 133), |
95 | INTC_IRQ(MTU2_TCI2V, 128), INTC_IRQ(MTU2_TCI2U, 129), | 76 | INTC_IRQ(MTU23_ABCD, 134), INTC_IRQ(MTU23_ABCD, 135), |
96 | 77 | ||
97 | INTC_IRQ(MTU2_TGI3A, 132), INTC_IRQ(MTU2_TGI3B, 133), | ||
98 | INTC_IRQ(MTU2_TGI3C, 134), INTC_IRQ(MTU2_TGI3D, 135), | ||
99 | INTC_IRQ(MTU2_TCI3V, 136), | 78 | INTC_IRQ(MTU2_TCI3V, 136), |
100 | 79 | ||
101 | INTC_IRQ(MTU2_TGI4A, 140), INTC_IRQ(MTU2_TGI4B, 141), | 80 | INTC_IRQ(MTU24_ABCD, 140), INTC_IRQ(MTU24_ABCD, 141), |
102 | INTC_IRQ(MTU2_TGI4C, 142), INTC_IRQ(MTU2_TGI4D, 143), | 81 | INTC_IRQ(MTU24_ABCD, 142), INTC_IRQ(MTU24_ABCD, 143), |
82 | |||
103 | INTC_IRQ(MTU2_TCI4V, 144), | 83 | INTC_IRQ(MTU2_TCI4V, 144), |
104 | 84 | ||
105 | INTC_IRQ(MTU2_TGI5U, 148), INTC_IRQ(MTU2_TGI5V, 149), | 85 | INTC_IRQ(MTU25_UVW, 148), INTC_IRQ(MTU25_UVW, 149), |
106 | INTC_IRQ(MTU2_TGI5W, 150), | 86 | INTC_IRQ(MTU25_UVW, 150), |
87 | |||
88 | INTC_IRQ(RTC, 152), INTC_IRQ(RTC, 153), | ||
89 | INTC_IRQ(RTC, 154), | ||
107 | 90 | ||
108 | INTC_IRQ(RTC_ARM, 152), INTC_IRQ(RTC_PRD, 153), | 91 | INTC_IRQ(WDT, 156), |
109 | INTC_IRQ(RTC_CUP, 154), INTC_IRQ(WDT, 156), | ||
110 | 92 | ||
111 | INTC_IRQ(IIC30_STPI, 157), INTC_IRQ(IIC30_NAKI, 158), | 93 | INTC_IRQ(IIC30, 157), INTC_IRQ(IIC30, 158), |
112 | INTC_IRQ(IIC30_RXI, 159), INTC_IRQ(IIC30_TXI, 160), | 94 | INTC_IRQ(IIC30, 159), INTC_IRQ(IIC30, 160), |
113 | INTC_IRQ(IIC30_TEI, 161), | 95 | INTC_IRQ(IIC30, 161), |
114 | 96 | ||
115 | INTC_IRQ(IIC31_STPI, 164), INTC_IRQ(IIC31_NAKI, 165), | 97 | INTC_IRQ(IIC31, 164), INTC_IRQ(IIC31, 165), |
116 | INTC_IRQ(IIC31_RXI, 166), INTC_IRQ(IIC31_TXI, 167), | 98 | INTC_IRQ(IIC31, 166), INTC_IRQ(IIC31, 167), |
117 | INTC_IRQ(IIC31_TEI, 168), | 99 | INTC_IRQ(IIC31, 168), |
118 | 100 | ||
119 | INTC_IRQ(IIC32_STPI, 170), INTC_IRQ(IIC32_NAKI, 171), | 101 | INTC_IRQ(IIC32, 170), INTC_IRQ(IIC32, 171), |
120 | INTC_IRQ(IIC32_RXI, 172), INTC_IRQ(IIC32_TXI, 173), | 102 | INTC_IRQ(IIC32, 172), INTC_IRQ(IIC32, 173), |
121 | INTC_IRQ(IIC32_TEI, 174), | 103 | INTC_IRQ(IIC32, 174), |
122 | 104 | ||
123 | INTC_IRQ(DMAC0_DMINT0, 176), INTC_IRQ(DMAC1_DMINT1, 177), | 105 | INTC_IRQ(DMAC0_DMINT0, 176), INTC_IRQ(DMAC1_DMINT1, 177), |
124 | INTC_IRQ(DMAC2_DMINT2, 178), INTC_IRQ(DMAC3_DMINT3, 179), | 106 | INTC_IRQ(DMAC2_DMINT2, 178), INTC_IRQ(DMAC3_DMINT3, 179), |
125 | 107 | ||
126 | INTC_IRQ(SCIF0_BRI, 180), INTC_IRQ(SCIF0_ERI, 181), | 108 | INTC_IRQ(SCIF0, 180), INTC_IRQ(SCIF0, 181), |
127 | INTC_IRQ(SCIF0_RXI, 182), INTC_IRQ(SCIF0_TXI, 183), | 109 | INTC_IRQ(SCIF0, 182), INTC_IRQ(SCIF0, 183), |
128 | INTC_IRQ(SCIF1_BRI, 184), INTC_IRQ(SCIF1_ERI, 185), | 110 | INTC_IRQ(SCIF1, 184), INTC_IRQ(SCIF1, 185), |
129 | INTC_IRQ(SCIF1_RXI, 186), INTC_IRQ(SCIF1_TXI, 187), | 111 | INTC_IRQ(SCIF1, 186), INTC_IRQ(SCIF1, 187), |
130 | INTC_IRQ(SCIF2_BRI, 188), INTC_IRQ(SCIF2_ERI, 189), | 112 | INTC_IRQ(SCIF2, 188), INTC_IRQ(SCIF2, 189), |
131 | INTC_IRQ(SCIF2_RXI, 190), INTC_IRQ(SCIF2_TXI, 191), | 113 | INTC_IRQ(SCIF2, 190), INTC_IRQ(SCIF2, 191), |
132 | INTC_IRQ(SCIF3_BRI, 192), INTC_IRQ(SCIF3_ERI, 193), | 114 | INTC_IRQ(SCIF3, 192), INTC_IRQ(SCIF3, 193), |
133 | INTC_IRQ(SCIF3_RXI, 194), INTC_IRQ(SCIF3_TXI, 195), | 115 | INTC_IRQ(SCIF3, 194), INTC_IRQ(SCIF3, 195), |
134 | INTC_IRQ(SCIF4_BRI, 196), INTC_IRQ(SCIF4_ERI, 197), | 116 | INTC_IRQ(SCIF4, 196), INTC_IRQ(SCIF4, 197), |
135 | INTC_IRQ(SCIF4_RXI, 198), INTC_IRQ(SCIF4_TXI, 199), | 117 | INTC_IRQ(SCIF4, 198), INTC_IRQ(SCIF4, 199), |
136 | INTC_IRQ(SCIF5_BRI, 200), INTC_IRQ(SCIF5_ERI, 201), | 118 | INTC_IRQ(SCIF5, 200), INTC_IRQ(SCIF5, 201), |
137 | INTC_IRQ(SCIF5_RXI, 202), INTC_IRQ(SCIF5_TXI, 203), | 119 | INTC_IRQ(SCIF5, 202), INTC_IRQ(SCIF5, 203), |
138 | INTC_IRQ(SCIF6_BRI, 204), INTC_IRQ(SCIF6_ERI, 205), | 120 | INTC_IRQ(SCIF6, 204), INTC_IRQ(SCIF6, 205), |
139 | INTC_IRQ(SCIF6_RXI, 206), INTC_IRQ(SCIF6_TXI, 207), | 121 | INTC_IRQ(SCIF6, 206), INTC_IRQ(SCIF6, 207), |
140 | INTC_IRQ(SCIF7_BRI, 208), INTC_IRQ(SCIF7_ERI, 209), | 122 | INTC_IRQ(SCIF7, 208), INTC_IRQ(SCIF7, 209), |
141 | INTC_IRQ(SCIF7_RXI, 210), INTC_IRQ(SCIF7_TXI, 211), | 123 | INTC_IRQ(SCIF7, 210), INTC_IRQ(SCIF7, 211), |
142 | 124 | ||
143 | INTC_IRQ(DMAC0_DMINTA, 212), INTC_IRQ(DMAC4_DMINT4, 216), | 125 | INTC_IRQ(DMAC0_DMINTA, 212), INTC_IRQ(DMAC4_DMINT4, 216), |
144 | INTC_IRQ(DMAC5_DMINT5, 217), INTC_IRQ(DMAC6_DMINT6, 218), | 126 | INTC_IRQ(DMAC5_DMINT5, 217), INTC_IRQ(DMAC6_DMINT6, 218), |
145 | INTC_IRQ(DMAC7_DMINT7, 219), | 127 | INTC_IRQ(DMAC7_DMINT7, 219), |
146 | 128 | ||
147 | INTC_IRQ(RCAN0_ERS, 228), INTC_IRQ(RCAN0_OVR, 229), | 129 | INTC_IRQ(RCAN0, 228), INTC_IRQ(RCAN0, 229), |
148 | INTC_IRQ(RCAN0_SLE, 230), | 130 | INTC_IRQ(RCAN0, 230), |
149 | INTC_IRQ(RCAN0_RM0, 231), INTC_IRQ(RCAN0_RM1, 232), | 131 | INTC_IRQ(RCAN0, 231), INTC_IRQ(RCAN0, 232), |
150 | 132 | ||
151 | INTC_IRQ(RCAN1_ERS, 234), INTC_IRQ(RCAN1_OVR, 235), | 133 | INTC_IRQ(RCAN1, 234), INTC_IRQ(RCAN1, 235), |
152 | INTC_IRQ(RCAN1_SLE, 236), | 134 | INTC_IRQ(RCAN1, 236), |
153 | INTC_IRQ(RCAN1_RM0, 237), INTC_IRQ(RCAN1_RM1, 238), | 135 | INTC_IRQ(RCAN1, 237), INTC_IRQ(RCAN1, 238), |
154 | 136 | ||
155 | INTC_IRQ(SSI0_SSII, 244), INTC_IRQ(SSI1_SSII, 245), | 137 | INTC_IRQ(SSI0_SSII, 244), INTC_IRQ(SSI1_SSII, 245), |
156 | 138 | ||
157 | INTC_IRQ(TMR0_CMIA0, 246), INTC_IRQ(TMR0_CMIB0, 247), | 139 | INTC_IRQ(TMR0, 246), INTC_IRQ(TMR0, 247), |
158 | INTC_IRQ(TMR0_OVI0, 248), | 140 | INTC_IRQ(TMR0, 248), |
159 | |||
160 | INTC_IRQ(TMR1_CMIA1, 252), INTC_IRQ(TMR1_CMIB1, 253), | ||
161 | INTC_IRQ(TMR1_OVI1, 254), | ||
162 | 141 | ||
142 | INTC_IRQ(TMR1, 252), INTC_IRQ(TMR1, 253), | ||
143 | INTC_IRQ(TMR1, 254), | ||
163 | }; | 144 | }; |
164 | 145 | ||
165 | static struct intc_group groups[] __initdata = { | 146 | static struct intc_group groups[] __initdata = { |
166 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, | 147 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, |
167 | PINT4, PINT5, PINT6, PINT7), | 148 | PINT4, PINT5, PINT6, PINT7), |
168 | INTC_GROUP(MTU20_ABCD, MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D), | ||
169 | INTC_GROUP(MTU20_VEF, MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F), | ||
170 | |||
171 | INTC_GROUP(MTU21_AB, MTU2_TGI1A, MTU2_TGI1B), | ||
172 | INTC_GROUP(MTU21_VU, MTU2_TCI1V, MTU2_TCI1U), | ||
173 | INTC_GROUP(MTU22_AB, MTU2_TGI2A, MTU2_TGI2B), | ||
174 | INTC_GROUP(MTU22_VU, MTU2_TCI2V, MTU2_TCI2U), | ||
175 | INTC_GROUP(MTU23_ABCD, MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D), | ||
176 | INTC_GROUP(MTU24_ABCD, MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D), | ||
177 | INTC_GROUP(MTU25_UVW, MTU2_TGI5U, MTU2_TGI5V, MTU2_TGI5W), | ||
178 | INTC_GROUP(RTC, RTC_ARM, RTC_PRD, RTC_CUP ), | ||
179 | |||
180 | INTC_GROUP(IIC30, IIC30_STPI, IIC30_NAKI, IIC30_RXI, IIC30_TXI, | ||
181 | IIC30_TEI), | ||
182 | INTC_GROUP(IIC31, IIC31_STPI, IIC31_NAKI, IIC31_RXI, IIC31_TXI, | ||
183 | IIC31_TEI), | ||
184 | INTC_GROUP(IIC32, IIC32_STPI, IIC32_NAKI, IIC32_RXI, IIC32_TXI, | ||
185 | IIC32_TEI), | ||
186 | |||
187 | INTC_GROUP(SCIF0, SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI), | ||
188 | INTC_GROUP(SCIF1, SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI), | ||
189 | INTC_GROUP(SCIF2, SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI), | ||
190 | INTC_GROUP(SCIF3, SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI), | ||
191 | INTC_GROUP(SCIF4, SCIF4_BRI, SCIF4_ERI, SCIF4_RXI, SCIF4_TXI), | ||
192 | INTC_GROUP(SCIF5, SCIF5_BRI, SCIF5_ERI, SCIF5_RXI, SCIF5_TXI), | ||
193 | INTC_GROUP(SCIF6, SCIF6_BRI, SCIF6_ERI, SCIF6_RXI, SCIF6_TXI), | ||
194 | INTC_GROUP(SCIF7, SCIF7_BRI, SCIF7_ERI, SCIF7_RXI, SCIF7_TXI), | ||
195 | |||
196 | INTC_GROUP(RCAN0, RCAN0_ERS, RCAN0_OVR, RCAN0_RM0, RCAN0_RM1, | ||
197 | RCAN0_SLE), | ||
198 | INTC_GROUP(RCAN1, RCAN1_ERS, RCAN1_OVR, RCAN1_RM0, RCAN1_RM1, | ||
199 | RCAN1_SLE), | ||
200 | |||
201 | INTC_GROUP(TMR0, TMR0_CMIA0, TMR0_CMIB0, TMR0_OVI0), | ||
202 | INTC_GROUP(TMR1, TMR1_CMIA1, TMR1_CMIB1, TMR1_OVI1), | ||
203 | }; | 149 | }; |
204 | 150 | ||
205 | static struct intc_prio_reg prio_registers[] __initdata = { | 151 | static struct intc_prio_reg prio_registers[] __initdata = { |
@@ -212,7 +158,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
212 | 158 | ||
213 | { 0xfffe9806, 0, 16, 4, /* IPR09 */ { RTC, WDT, IIC30, 0 } }, | 159 | { 0xfffe9806, 0, 16, 4, /* IPR09 */ { RTC, WDT, IIC30, 0 } }, |
214 | { 0xfffe9808, 0, 16, 4, /* IPR10 */ { IIC31, IIC32, DMAC0_DMINT0, DMAC1_DMINT1 } }, | 160 | { 0xfffe9808, 0, 16, 4, /* IPR10 */ { IIC31, IIC32, DMAC0_DMINT0, DMAC1_DMINT1 } }, |
215 | { 0xfffe980a, 0, 16, 4, /* IPR11 */ { DMAC2_DMINT2, DMAC3_DMINT3, SCIF0 , SCIF1 } }, | 161 | { 0xfffe980a, 0, 16, 4, /* IPR11 */ { DMAC2_DMINT2, DMAC3_DMINT3, SCIF0, SCIF1 } }, |
216 | { 0xfffe980c, 0, 16, 4, /* IPR12 */ { SCIF2, SCIF3, SCIF4, SCIF5 } }, | 162 | { 0xfffe980c, 0, 16, 4, /* IPR12 */ { SCIF2, SCIF3, SCIF4, SCIF5 } }, |
217 | { 0xfffe980e, 0, 16, 4, /* IPR13 */ { SCIF6, SCIF7, DMAC0_DMINTA, DMAC4_DMINT4 } }, | 163 | { 0xfffe980e, 0, 16, 4, /* IPR13 */ { SCIF6, SCIF7, DMAC0_DMINTA, DMAC4_DMINT4 } }, |
218 | { 0xfffe9810, 0, 16, 4, /* IPR14 */ { DMAC5_DMINT5, DMAC6_DMINT6, DMAC7_DMINT7, 0 } }, | 164 | { 0xfffe9810, 0, 16, 4, /* IPR14 */ { DMAC5_DMINT5, DMAC6_DMINT6, DMAC7_DMINT7, 0 } }, |
@@ -234,42 +180,42 @@ static struct plat_sci_port sci_platform_data[] = { | |||
234 | .mapbase = 0xfffe8000, | 180 | .mapbase = 0xfffe8000, |
235 | .flags = UPF_BOOT_AUTOCONF, | 181 | .flags = UPF_BOOT_AUTOCONF, |
236 | .type = PORT_SCIF, | 182 | .type = PORT_SCIF, |
237 | .irqs = { 181, 182, 183, 180} | 183 | .irqs = { 180, 180, 180, 180 } |
238 | }, { | 184 | }, { |
239 | .mapbase = 0xfffe8800, | 185 | .mapbase = 0xfffe8800, |
240 | .flags = UPF_BOOT_AUTOCONF, | 186 | .flags = UPF_BOOT_AUTOCONF, |
241 | .type = PORT_SCIF, | 187 | .type = PORT_SCIF, |
242 | .irqs = { 185, 186, 187, 184} | 188 | .irqs = { 184, 184, 184, 184 } |
243 | }, { | 189 | }, { |
244 | .mapbase = 0xfffe9000, | 190 | .mapbase = 0xfffe9000, |
245 | .flags = UPF_BOOT_AUTOCONF, | 191 | .flags = UPF_BOOT_AUTOCONF, |
246 | .type = PORT_SCIF, | 192 | .type = PORT_SCIF, |
247 | .irqs = { 189, 186, 187, 188} | 193 | .irqs = { 188, 188, 188, 188 } |
248 | }, { | 194 | }, { |
249 | .mapbase = 0xfffe9800, | 195 | .mapbase = 0xfffe9800, |
250 | .flags = UPF_BOOT_AUTOCONF, | 196 | .flags = UPF_BOOT_AUTOCONF, |
251 | .type = PORT_SCIF, | 197 | .type = PORT_SCIF, |
252 | .irqs = { 193, 194, 195, 192} | 198 | .irqs = { 192, 192, 192, 192 } |
253 | }, { | 199 | }, { |
254 | .mapbase = 0xfffea000, | 200 | .mapbase = 0xfffea000, |
255 | .flags = UPF_BOOT_AUTOCONF, | 201 | .flags = UPF_BOOT_AUTOCONF, |
256 | .type = PORT_SCIF, | 202 | .type = PORT_SCIF, |
257 | .irqs = { 196, 198, 199, 196} | 203 | .irqs = { 196, 196, 196, 196 } |
258 | }, { | 204 | }, { |
259 | .mapbase = 0xfffea800, | 205 | .mapbase = 0xfffea800, |
260 | .flags = UPF_BOOT_AUTOCONF, | 206 | .flags = UPF_BOOT_AUTOCONF, |
261 | .type = PORT_SCIF, | 207 | .type = PORT_SCIF, |
262 | .irqs = { 201, 202, 203, 200} | 208 | .irqs = { 200, 200, 200, 200 } |
263 | }, { | 209 | }, { |
264 | .mapbase = 0xfffeb000, | 210 | .mapbase = 0xfffeb000, |
265 | .flags = UPF_BOOT_AUTOCONF, | 211 | .flags = UPF_BOOT_AUTOCONF, |
266 | .type = PORT_SCIF, | 212 | .type = PORT_SCIF, |
267 | .irqs = { 205, 206, 207, 204} | 213 | .irqs = { 204, 204, 204, 204 } |
268 | }, { | 214 | }, { |
269 | .mapbase = 0xfffeb800, | 215 | .mapbase = 0xfffeb800, |
270 | .flags = UPF_BOOT_AUTOCONF, | 216 | .flags = UPF_BOOT_AUTOCONF, |
271 | .type = PORT_SCIF, | 217 | .type = PORT_SCIF, |
272 | .irqs = { 209, 210, 211, 208} | 218 | .irqs = { 208, 208, 208, 208 } |
273 | }, { | 219 | }, { |
274 | .flags = 0, | 220 | .flags = 0, |
275 | } | 221 | } |
@@ -290,17 +236,7 @@ static struct resource rtc_resources[] = { | |||
290 | .flags = IORESOURCE_IO, | 236 | .flags = IORESOURCE_IO, |
291 | }, | 237 | }, |
292 | [1] = { | 238 | [1] = { |
293 | /* Period IRQ */ | 239 | /* Shared Period/Carry/Alarm IRQ */ |
294 | .start = 153, | ||
295 | .flags = IORESOURCE_IRQ, | ||
296 | }, | ||
297 | [2] = { | ||
298 | /* Carry IRQ */ | ||
299 | .start = 154, | ||
300 | .flags = IORESOURCE_IRQ, | ||
301 | }, | ||
302 | [3] = { | ||
303 | /* Alarm IRQ */ | ||
304 | .start = 152, | 240 | .start = 152, |
305 | .flags = IORESOURCE_IRQ, | 241 | .flags = IORESOURCE_IRQ, |
306 | }, | 242 | }, |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c index e98dc4450352..820dfb2e8656 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SH7203 and SH7263 Setup | 2 | * SH7203 and SH7263 Setup |
3 | * | 3 | * |
4 | * Copyright (C) 2007 Paul Mundt | 4 | * Copyright (C) 2007 - 2009 Paul Mundt |
5 | * | 5 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 6 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 7 | * License. See the file "COPYING" in the main directory of this archive |
@@ -18,50 +18,27 @@ enum { | |||
18 | /* interrupt sources */ | 18 | /* interrupt sources */ |
19 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 19 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
20 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, | 20 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, |
21 | DMAC0_DEI, DMAC0_HEI, DMAC1_DEI, DMAC1_HEI, | 21 | DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7, |
22 | DMAC2_DEI, DMAC2_HEI, DMAC3_DEI, DMAC3_HEI, | ||
23 | DMAC4_DEI, DMAC4_HEI, DMAC5_DEI, DMAC5_HEI, | ||
24 | DMAC6_DEI, DMAC6_HEI, DMAC7_DEI, DMAC7_HEI, | ||
25 | USB, LCDC, CMT0, CMT1, BSC, WDT, | 22 | USB, LCDC, CMT0, CMT1, BSC, WDT, |
26 | MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D, | ||
27 | MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F, | ||
28 | MTU2_TGI1A, MTU2_TGI1B, MTU2_TCI1V, MTU2_TCI1U, | ||
29 | MTU2_TGI2A, MTU2_TGI2B, MTU2_TCI2V, MTU2_TCI2U, | ||
30 | MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D, MTU2_TCI3V, | ||
31 | MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D, MTU2_TCI4V, | ||
32 | ADC_ADI, | ||
33 | IIC30_STPI, IIC30_NAKI, IIC30_RXI, IIC30_TXI, IIC30_TEI, | ||
34 | IIC31_STPI, IIC31_NAKI, IIC31_RXI, IIC31_TXI, IIC31_TEI, | ||
35 | IIC32_STPI, IIC32_NAKI, IIC32_RXI, IIC32_TXI, IIC32_TEI, | ||
36 | IIC33_STPI, IIC33_NAKI, IIC33_RXI, IIC33_TXI, IIC33_TEI, | ||
37 | SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI, | ||
38 | SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI, | ||
39 | SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI, | ||
40 | SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI, | ||
41 | SSU0_SSERI, SSU0_SSRXI, SSU0_SSTXI, | ||
42 | SSU1_SSERI, SSU1_SSRXI, SSU1_SSTXI, | ||
43 | SSI0_SSII, SSI1_SSII, SSI2_SSII, SSI3_SSII, | ||
44 | 23 | ||
45 | /* ROM-DEC, SDHI, SRC, and IEB are SH7263 specific */ | 24 | MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU, |
46 | ROMDEC_ISY, ROMDEC_IERR, ROMDEC_IARG, ROMDEC_ISEC, ROMDEC_IBUF, | 25 | MTU3_ABCD, MTU4_ABCD, MTU2_TCI3V, MTU2_TCI4V, |
47 | ROMDEC_IREADY, | ||
48 | 26 | ||
49 | FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I, | 27 | ADC_ADI, |
28 | |||
29 | IIC30, IIC31, IIC32, IIC33, | ||
30 | SCIF0, SCIF1, SCIF2, SCIF3, | ||
50 | 31 | ||
51 | SDHI3, SDHI0, SDHI1, | 32 | SSU0, SSU1, |
52 | 33 | ||
53 | RTC_ARM, RTC_PRD, RTC_CUP, | 34 | SSI0_SSII, SSI1_SSII, SSI2_SSII, SSI3_SSII, |
54 | RCAN0_ERS, RCAN0_OVR, RCAN0_RM0, RCAN0_RM1, RCAN0_SLE, | ||
55 | RCAN1_ERS, RCAN1_OVR, RCAN1_RM0, RCAN1_RM1, RCAN1_SLE, | ||
56 | 35 | ||
57 | SRC_OVF, SRC_ODFI, SRC_IDEI, IEBI, | 36 | /* ROM-DEC, SDHI, SRC, and IEB are SH7263 specific */ |
37 | ROMDEC, FLCTL, SDHI, RTC, RCAN0, RCAN1, | ||
38 | SRC, IEBI, | ||
58 | 39 | ||
59 | /* interrupt groups */ | 40 | /* interrupt groups */ |
60 | PINT, DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7, | 41 | PINT, |
61 | MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU, | ||
62 | MTU3_ABCD, MTU4_ABCD, | ||
63 | IIC30, IIC31, IIC32, IIC33, SCIF0, SCIF1, SCIF2, SCIF3, | ||
64 | SSU0, SSU1, ROMDEC, SDHI, FLCTL, RTC, RCAN0, RCAN1, SRC | ||
65 | }; | 42 | }; |
66 | 43 | ||
67 | static struct intc_vect vectors[] __initdata = { | 44 | static struct intc_vect vectors[] __initdata = { |
@@ -73,79 +50,80 @@ static struct intc_vect vectors[] __initdata = { | |||
73 | INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83), | 50 | INTC_IRQ(PINT2, 82), INTC_IRQ(PINT3, 83), |
74 | INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85), | 51 | INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85), |
75 | INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87), | 52 | INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87), |
76 | INTC_IRQ(DMAC0_DEI, 108), INTC_IRQ(DMAC0_HEI, 109), | 53 | INTC_IRQ(DMAC0, 108), INTC_IRQ(DMAC0, 109), |
77 | INTC_IRQ(DMAC1_DEI, 112), INTC_IRQ(DMAC1_HEI, 113), | 54 | INTC_IRQ(DMAC1, 112), INTC_IRQ(DMAC1, 113), |
78 | INTC_IRQ(DMAC2_DEI, 116), INTC_IRQ(DMAC2_HEI, 117), | 55 | INTC_IRQ(DMAC2, 116), INTC_IRQ(DMAC2, 117), |
79 | INTC_IRQ(DMAC3_DEI, 120), INTC_IRQ(DMAC3_HEI, 121), | 56 | INTC_IRQ(DMAC3, 120), INTC_IRQ(DMAC3, 121), |
80 | INTC_IRQ(DMAC4_DEI, 124), INTC_IRQ(DMAC4_HEI, 125), | 57 | INTC_IRQ(DMAC4, 124), INTC_IRQ(DMAC4, 125), |
81 | INTC_IRQ(DMAC5_DEI, 128), INTC_IRQ(DMAC5_HEI, 129), | 58 | INTC_IRQ(DMAC5, 128), INTC_IRQ(DMAC5, 129), |
82 | INTC_IRQ(DMAC6_DEI, 132), INTC_IRQ(DMAC6_HEI, 133), | 59 | INTC_IRQ(DMAC6, 132), INTC_IRQ(DMAC6, 133), |
83 | INTC_IRQ(DMAC7_DEI, 136), INTC_IRQ(DMAC7_HEI, 137), | 60 | INTC_IRQ(DMAC7, 136), INTC_IRQ(DMAC7, 137), |
84 | INTC_IRQ(USB, 140), INTC_IRQ(LCDC, 141), | 61 | INTC_IRQ(USB, 140), INTC_IRQ(LCDC, 141), |
85 | INTC_IRQ(CMT0, 142), INTC_IRQ(CMT1, 143), | 62 | INTC_IRQ(CMT0, 142), INTC_IRQ(CMT1, 143), |
86 | INTC_IRQ(BSC, 144), INTC_IRQ(WDT, 145), | 63 | INTC_IRQ(BSC, 144), INTC_IRQ(WDT, 145), |
87 | INTC_IRQ(MTU2_TGI0A, 146), INTC_IRQ(MTU2_TGI0B, 147), | 64 | INTC_IRQ(MTU0_ABCD, 146), INTC_IRQ(MTU0_ABCD, 147), |
88 | INTC_IRQ(MTU2_TGI0C, 148), INTC_IRQ(MTU2_TGI0D, 149), | 65 | INTC_IRQ(MTU0_ABCD, 148), INTC_IRQ(MTU0_ABCD, 149), |
89 | INTC_IRQ(MTU2_TCI0V, 150), | 66 | INTC_IRQ(MTU0_VEF, 150), |
90 | INTC_IRQ(MTU2_TGI0E, 151), INTC_IRQ(MTU2_TGI0F, 152), | 67 | INTC_IRQ(MTU0_VEF, 151), INTC_IRQ(MTU0_VEF, 152), |
91 | INTC_IRQ(MTU2_TGI1A, 153), INTC_IRQ(MTU2_TGI1B, 154), | 68 | INTC_IRQ(MTU1_AB, 153), INTC_IRQ(MTU1_AB, 154), |
92 | INTC_IRQ(MTU2_TCI1V, 155), INTC_IRQ(MTU2_TCI1U, 156), | 69 | INTC_IRQ(MTU1_VU, 155), INTC_IRQ(MTU1_VU, 156), |
93 | INTC_IRQ(MTU2_TGI2A, 157), INTC_IRQ(MTU2_TGI2B, 158), | 70 | INTC_IRQ(MTU2_AB, 157), INTC_IRQ(MTU2_AB, 158), |
94 | INTC_IRQ(MTU2_TCI2V, 159), INTC_IRQ(MTU2_TCI2U, 160), | 71 | INTC_IRQ(MTU2_VU, 159), INTC_IRQ(MTU2_VU, 160), |
95 | INTC_IRQ(MTU2_TGI3A, 161), INTC_IRQ(MTU2_TGI3B, 162), | 72 | INTC_IRQ(MTU3_ABCD, 161), INTC_IRQ(MTU3_ABCD, 162), |
96 | INTC_IRQ(MTU2_TGI3C, 163), INTC_IRQ(MTU2_TGI3D, 164), | 73 | INTC_IRQ(MTU3_ABCD, 163), INTC_IRQ(MTU3_ABCD, 164), |
97 | INTC_IRQ(MTU2_TCI3V, 165), | 74 | INTC_IRQ(MTU2_TCI3V, 165), |
98 | INTC_IRQ(MTU2_TGI4A, 166), INTC_IRQ(MTU2_TGI4B, 167), | 75 | INTC_IRQ(MTU4_ABCD, 166), INTC_IRQ(MTU4_ABCD, 167), |
99 | INTC_IRQ(MTU2_TGI4C, 168), INTC_IRQ(MTU2_TGI4D, 169), | 76 | INTC_IRQ(MTU4_ABCD, 168), INTC_IRQ(MTU4_ABCD, 169), |
100 | INTC_IRQ(MTU2_TCI4V, 170), | 77 | INTC_IRQ(MTU2_TCI4V, 170), |
101 | INTC_IRQ(ADC_ADI, 171), | 78 | INTC_IRQ(ADC_ADI, 171), |
102 | INTC_IRQ(IIC30_STPI, 172), INTC_IRQ(IIC30_NAKI, 173), | 79 | INTC_IRQ(IIC30, 172), INTC_IRQ(IIC30, 173), |
103 | INTC_IRQ(IIC30_RXI, 174), INTC_IRQ(IIC30_TXI, 175), | 80 | INTC_IRQ(IIC30, 174), INTC_IRQ(IIC30, 175), |
104 | INTC_IRQ(IIC30_TEI, 176), | 81 | INTC_IRQ(IIC30, 176), |
105 | INTC_IRQ(IIC31_STPI, 177), INTC_IRQ(IIC31_NAKI, 178), | 82 | INTC_IRQ(IIC31, 177), INTC_IRQ(IIC31, 178), |
106 | INTC_IRQ(IIC31_RXI, 179), INTC_IRQ(IIC31_TXI, 180), | 83 | INTC_IRQ(IIC31, 179), INTC_IRQ(IIC31, 180), |
107 | INTC_IRQ(IIC31_TEI, 181), | 84 | INTC_IRQ(IIC31, 181), |
108 | INTC_IRQ(IIC32_STPI, 182), INTC_IRQ(IIC32_NAKI, 183), | 85 | INTC_IRQ(IIC32, 182), INTC_IRQ(IIC32, 183), |
109 | INTC_IRQ(IIC32_RXI, 184), INTC_IRQ(IIC32_TXI, 185), | 86 | INTC_IRQ(IIC32, 184), INTC_IRQ(IIC32, 185), |
110 | INTC_IRQ(IIC32_TEI, 186), | 87 | INTC_IRQ(IIC32, 186), |
111 | INTC_IRQ(IIC33_STPI, 187), INTC_IRQ(IIC33_NAKI, 188), | 88 | INTC_IRQ(IIC33, 187), INTC_IRQ(IIC33, 188), |
112 | INTC_IRQ(IIC33_RXI, 189), INTC_IRQ(IIC33_TXI, 190), | 89 | INTC_IRQ(IIC33, 189), INTC_IRQ(IIC33, 190), |
113 | INTC_IRQ(IIC33_TEI, 191), | 90 | INTC_IRQ(IIC33, 191), |
114 | INTC_IRQ(SCIF0_BRI, 192), INTC_IRQ(SCIF0_ERI, 193), | 91 | INTC_IRQ(SCIF0, 192), INTC_IRQ(SCIF0, 193), |
115 | INTC_IRQ(SCIF0_RXI, 194), INTC_IRQ(SCIF0_TXI, 195), | 92 | INTC_IRQ(SCIF0, 194), INTC_IRQ(SCIF0, 195), |
116 | INTC_IRQ(SCIF1_BRI, 196), INTC_IRQ(SCIF1_ERI, 197), | 93 | INTC_IRQ(SCIF1, 196), INTC_IRQ(SCIF1, 197), |
117 | INTC_IRQ(SCIF1_RXI, 198), INTC_IRQ(SCIF1_TXI, 199), | 94 | INTC_IRQ(SCIF1, 198), INTC_IRQ(SCIF1, 199), |
118 | INTC_IRQ(SCIF2_BRI, 200), INTC_IRQ(SCIF2_ERI, 201), | 95 | INTC_IRQ(SCIF2, 200), INTC_IRQ(SCIF2, 201), |
119 | INTC_IRQ(SCIF2_RXI, 202), INTC_IRQ(SCIF2_TXI, 203), | 96 | INTC_IRQ(SCIF2, 202), INTC_IRQ(SCIF2, 203), |
120 | INTC_IRQ(SCIF3_BRI, 204), INTC_IRQ(SCIF3_ERI, 205), | 97 | INTC_IRQ(SCIF3, 204), INTC_IRQ(SCIF3, 205), |
121 | INTC_IRQ(SCIF3_RXI, 206), INTC_IRQ(SCIF3_TXI, 207), | 98 | INTC_IRQ(SCIF3, 206), INTC_IRQ(SCIF3, 207), |
122 | INTC_IRQ(SSU0_SSERI, 208), INTC_IRQ(SSU0_SSRXI, 209), | 99 | INTC_IRQ(SSU0, 208), INTC_IRQ(SSU0, 209), |
123 | INTC_IRQ(SSU0_SSTXI, 210), | 100 | INTC_IRQ(SSU0, 210), |
124 | INTC_IRQ(SSU1_SSERI, 211), INTC_IRQ(SSU1_SSRXI, 212), | 101 | INTC_IRQ(SSU1, 211), INTC_IRQ(SSU1, 212), |
125 | INTC_IRQ(SSU1_SSTXI, 213), | 102 | INTC_IRQ(SSU1, 213), |
126 | INTC_IRQ(SSI0_SSII, 214), INTC_IRQ(SSI1_SSII, 215), | 103 | INTC_IRQ(SSI0_SSII, 214), INTC_IRQ(SSI1_SSII, 215), |
127 | INTC_IRQ(SSI2_SSII, 216), INTC_IRQ(SSI3_SSII, 217), | 104 | INTC_IRQ(SSI2_SSII, 216), INTC_IRQ(SSI3_SSII, 217), |
128 | INTC_IRQ(FLCTL_FLSTEI, 224), INTC_IRQ(FLCTL_FLTENDI, 225), | 105 | INTC_IRQ(FLCTL, 224), INTC_IRQ(FLCTL, 225), |
129 | INTC_IRQ(FLCTL_FLTREQ0I, 226), INTC_IRQ(FLCTL_FLTREQ1I, 227), | 106 | INTC_IRQ(FLCTL, 226), INTC_IRQ(FLCTL, 227), |
130 | INTC_IRQ(RTC_ARM, 231), INTC_IRQ(RTC_PRD, 232), | 107 | INTC_IRQ(RTC, 231), INTC_IRQ(RTC, 232), |
131 | INTC_IRQ(RTC_CUP, 233), | 108 | INTC_IRQ(RTC, 233), |
132 | INTC_IRQ(RCAN0_ERS, 234), INTC_IRQ(RCAN0_OVR, 235), | 109 | INTC_IRQ(RCAN0, 234), INTC_IRQ(RCAN0, 235), |
133 | INTC_IRQ(RCAN0_RM0, 236), INTC_IRQ(RCAN0_RM1, 237), | 110 | INTC_IRQ(RCAN0, 236), INTC_IRQ(RCAN0, 237), |
134 | INTC_IRQ(RCAN0_SLE, 238), | 111 | INTC_IRQ(RCAN0, 238), |
135 | INTC_IRQ(RCAN1_ERS, 239), INTC_IRQ(RCAN1_OVR, 240), | 112 | INTC_IRQ(RCAN1, 239), INTC_IRQ(RCAN1, 240), |
136 | INTC_IRQ(RCAN1_RM0, 241), INTC_IRQ(RCAN1_RM1, 242), | 113 | INTC_IRQ(RCAN1, 241), INTC_IRQ(RCAN1, 242), |
137 | INTC_IRQ(RCAN1_SLE, 243), | 114 | INTC_IRQ(RCAN1, 243), |
138 | 115 | ||
139 | /* SH7263-specific trash */ | 116 | /* SH7263-specific trash */ |
140 | #ifdef CONFIG_CPU_SUBTYPE_SH7263 | 117 | #ifdef CONFIG_CPU_SUBTYPE_SH7263 |
141 | INTC_IRQ(ROMDEC_ISY, 218), INTC_IRQ(ROMDEC_IERR, 219), | 118 | INTC_IRQ(ROMDEC, 218), INTC_IRQ(ROMDEC, 219), |
142 | INTC_IRQ(ROMDEC_IARG, 220), INTC_IRQ(ROMDEC_ISEC, 221), | 119 | INTC_IRQ(ROMDEC, 220), INTC_IRQ(ROMDEC, 221), |
143 | INTC_IRQ(ROMDEC_IBUF, 222), INTC_IRQ(ROMDEC_IREADY, 223), | 120 | INTC_IRQ(ROMDEC, 222), INTC_IRQ(ROMDEC, 223), |
144 | 121 | ||
145 | INTC_IRQ(SDHI3, 228), INTC_IRQ(SDHI0, 229), INTC_IRQ(SDHI1, 230), | 122 | INTC_IRQ(SDHI, 228), INTC_IRQ(SDHI, 229), |
123 | INTC_IRQ(SDHI, 230), | ||
146 | 124 | ||
147 | INTC_IRQ(SRC_OVF, 244), INTC_IRQ(SRC_ODFI, 245), | 125 | INTC_IRQ(SRC, 244), INTC_IRQ(SRC, 245), |
148 | INTC_IRQ(SRC_IDEI, 246), | 126 | INTC_IRQ(SRC, 246), |
149 | 127 | ||
150 | INTC_IRQ(IEBI, 247), | 128 | INTC_IRQ(IEBI, 247), |
151 | #endif | 129 | #endif |
@@ -154,50 +132,6 @@ static struct intc_vect vectors[] __initdata = { | |||
154 | static struct intc_group groups[] __initdata = { | 132 | static struct intc_group groups[] __initdata = { |
155 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, | 133 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, |
156 | PINT4, PINT5, PINT6, PINT7), | 134 | PINT4, PINT5, PINT6, PINT7), |
157 | INTC_GROUP(DMAC0, DMAC0_DEI, DMAC0_HEI), | ||
158 | INTC_GROUP(DMAC1, DMAC1_DEI, DMAC1_HEI), | ||
159 | INTC_GROUP(DMAC2, DMAC2_DEI, DMAC2_HEI), | ||
160 | INTC_GROUP(DMAC3, DMAC3_DEI, DMAC3_HEI), | ||
161 | INTC_GROUP(DMAC4, DMAC4_DEI, DMAC4_HEI), | ||
162 | INTC_GROUP(DMAC5, DMAC5_DEI, DMAC5_HEI), | ||
163 | INTC_GROUP(DMAC6, DMAC6_DEI, DMAC6_HEI), | ||
164 | INTC_GROUP(DMAC7, DMAC7_DEI, DMAC7_HEI), | ||
165 | INTC_GROUP(MTU0_ABCD, MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D), | ||
166 | INTC_GROUP(MTU0_VEF, MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F), | ||
167 | INTC_GROUP(MTU1_AB, MTU2_TGI1A, MTU2_TGI1B), | ||
168 | INTC_GROUP(MTU1_VU, MTU2_TCI1V, MTU2_TCI1U), | ||
169 | INTC_GROUP(MTU2_AB, MTU2_TGI2A, MTU2_TGI2B), | ||
170 | INTC_GROUP(MTU2_VU, MTU2_TCI2V, MTU2_TCI2U), | ||
171 | INTC_GROUP(MTU3_ABCD, MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D), | ||
172 | INTC_GROUP(MTU4_ABCD, MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D), | ||
173 | INTC_GROUP(IIC30, IIC30_STPI, IIC30_NAKI, IIC30_RXI, IIC30_TXI, | ||
174 | IIC30_TEI), | ||
175 | INTC_GROUP(IIC31, IIC31_STPI, IIC31_NAKI, IIC31_RXI, IIC31_TXI, | ||
176 | IIC31_TEI), | ||
177 | INTC_GROUP(IIC32, IIC32_STPI, IIC32_NAKI, IIC32_RXI, IIC32_TXI, | ||
178 | IIC32_TEI), | ||
179 | INTC_GROUP(IIC33, IIC33_STPI, IIC33_NAKI, IIC33_RXI, IIC33_TXI, | ||
180 | IIC33_TEI), | ||
181 | INTC_GROUP(SCIF0, SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI), | ||
182 | INTC_GROUP(SCIF1, SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI), | ||
183 | INTC_GROUP(SCIF2, SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI), | ||
184 | INTC_GROUP(SCIF3, SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI), | ||
185 | INTC_GROUP(SSU0, SSU0_SSERI, SSU0_SSRXI, SSU0_SSTXI), | ||
186 | INTC_GROUP(SSU1, SSU1_SSERI, SSU1_SSRXI, SSU1_SSTXI), | ||
187 | INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, | ||
188 | FLCTL_FLTREQ1I), | ||
189 | INTC_GROUP(RTC, RTC_ARM, RTC_PRD, RTC_CUP), | ||
190 | INTC_GROUP(RCAN0, RCAN0_ERS, RCAN0_OVR, RCAN0_RM0, RCAN0_RM1, | ||
191 | RCAN0_SLE), | ||
192 | INTC_GROUP(RCAN1, RCAN1_ERS, RCAN1_OVR, RCAN1_RM0, RCAN1_RM1, | ||
193 | RCAN1_SLE), | ||
194 | |||
195 | #ifdef CONFIG_CPU_SUBTYPE_SH7263 | ||
196 | INTC_GROUP(ROMDEC, ROMDEC_ISY, ROMDEC_IERR, ROMDEC_IARG, | ||
197 | ROMDEC_ISEC, ROMDEC_IBUF, ROMDEC_IREADY), | ||
198 | INTC_GROUP(SDHI, SDHI3, SDHI0, SDHI1), | ||
199 | INTC_GROUP(SRC, SRC_OVF, SRC_ODFI, SRC_IDEI), | ||
200 | #endif | ||
201 | }; | 135 | }; |
202 | 136 | ||
203 | static struct intc_prio_reg prio_registers[] __initdata = { | 137 | static struct intc_prio_reg prio_registers[] __initdata = { |
@@ -242,22 +176,22 @@ static struct plat_sci_port sci_platform_data[] = { | |||
242 | .mapbase = 0xfffe8000, | 176 | .mapbase = 0xfffe8000, |
243 | .flags = UPF_BOOT_AUTOCONF, | 177 | .flags = UPF_BOOT_AUTOCONF, |
244 | .type = PORT_SCIF, | 178 | .type = PORT_SCIF, |
245 | .irqs = { 193, 194, 195, 192 }, | 179 | .irqs = { 192, 192, 192, 192 }, |
246 | }, { | 180 | }, { |
247 | .mapbase = 0xfffe8800, | 181 | .mapbase = 0xfffe8800, |
248 | .flags = UPF_BOOT_AUTOCONF, | 182 | .flags = UPF_BOOT_AUTOCONF, |
249 | .type = PORT_SCIF, | 183 | .type = PORT_SCIF, |
250 | .irqs = { 197, 198, 199, 196 }, | 184 | .irqs = { 196, 196, 196, 196 }, |
251 | }, { | 185 | }, { |
252 | .mapbase = 0xfffe9000, | 186 | .mapbase = 0xfffe9000, |
253 | .flags = UPF_BOOT_AUTOCONF, | 187 | .flags = UPF_BOOT_AUTOCONF, |
254 | .type = PORT_SCIF, | 188 | .type = PORT_SCIF, |
255 | .irqs = { 201, 202, 203, 200 }, | 189 | .irqs = { 200, 200, 200, 200 }, |
256 | }, { | 190 | }, { |
257 | .mapbase = 0xfffe9800, | 191 | .mapbase = 0xfffe9800, |
258 | .flags = UPF_BOOT_AUTOCONF, | 192 | .flags = UPF_BOOT_AUTOCONF, |
259 | .type = PORT_SCIF, | 193 | .type = PORT_SCIF, |
260 | .irqs = { 205, 206, 207, 204 }, | 194 | .irqs = { 204, 204, 204, 204 }, |
261 | }, { | 195 | }, { |
262 | .flags = 0, | 196 | .flags = 0, |
263 | } | 197 | } |
@@ -278,17 +212,7 @@ static struct resource rtc_resources[] = { | |||
278 | .flags = IORESOURCE_IO, | 212 | .flags = IORESOURCE_IO, |
279 | }, | 213 | }, |
280 | [1] = { | 214 | [1] = { |
281 | /* Period IRQ */ | 215 | /* Shared Period/Carry/Alarm IRQ */ |
282 | .start = 232, | ||
283 | .flags = IORESOURCE_IRQ, | ||
284 | }, | ||
285 | [2] = { | ||
286 | /* Carry IRQ */ | ||
287 | .start = 233, | ||
288 | .flags = IORESOURCE_IRQ, | ||
289 | }, | ||
290 | [3] = { | ||
291 | /* Alarm IRQ */ | ||
292 | .start = 231, | 216 | .start = 231, |
293 | .flags = IORESOURCE_IRQ, | 217 | .flags = IORESOURCE_IRQ, |
294 | }, | 218 | }, |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c index e6d4ec445dd8..c46a8355726d 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * SH7206 Setup | 2 | * SH7206 Setup |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Yoshinori Sato | 4 | * Copyright (C) 2006 Yoshinori Sato |
5 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | 6 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file "COPYING" in the main directory of this archive | 8 | * License. See the file "COPYING" in the main directory of this archive |
@@ -19,34 +20,23 @@ enum { | |||
19 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 20 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
20 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, | 21 | PINT0, PINT1, PINT2, PINT3, PINT4, PINT5, PINT6, PINT7, |
21 | ADC_ADI0, ADC_ADI1, | 22 | ADC_ADI0, ADC_ADI1, |
22 | DMAC0_DEI, DMAC0_HEI, DMAC1_DEI, DMAC1_HEI, | 23 | |
23 | DMAC2_DEI, DMAC2_HEI, DMAC3_DEI, DMAC3_HEI, | 24 | DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7, |
24 | DMAC4_DEI, DMAC4_HEI, DMAC5_DEI, DMAC5_HEI, | 25 | |
25 | DMAC6_DEI, DMAC6_HEI, DMAC7_DEI, DMAC7_HEI, | 26 | MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU, |
27 | MTU3_ABCD, MTU4_ABCD, MTU5, POE2_12, MTU3S_ABCD, MTU4S_ABCD, MTU5S, | ||
28 | IIC3, | ||
29 | |||
26 | CMT0, CMT1, BSC, WDT, | 30 | CMT0, CMT1, BSC, WDT, |
27 | MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D, | 31 | |
28 | MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F, | 32 | MTU2_TCI3V, MTU2_TCI4V, MTU2S_TCI3V, MTU2S_TCI4V, |
29 | MTU2_TGI1A, MTU2_TGI1B, MTU2_TCI1V, MTU2_TCI1U, | 33 | |
30 | MTU2_TGI2A, MTU2_TGI2B, MTU2_TCI2V, MTU2_TCI2U, | ||
31 | MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D, MTU2_TCI3V, | ||
32 | MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D, MTU2_TCI4V, | ||
33 | MTU2_TGI5U, MTU2_TGI5V, MTU2_TGI5W, | ||
34 | POE2_OEI1, POE2_OEI2, | ||
35 | MTU2S_TGI3A, MTU2S_TGI3B, MTU2S_TGI3C, MTU2S_TGI3D, MTU2S_TCI3V, | ||
36 | MTU2S_TGI4A, MTU2S_TGI4B, MTU2S_TGI4C, MTU2S_TGI4D, MTU2S_TCI4V, | ||
37 | MTU2S_TGI5U, MTU2S_TGI5V, MTU2S_TGI5W, | ||
38 | POE2_OEI3, | 34 | POE2_OEI3, |
39 | IIC3_STPI, IIC3_NAKI, IIC3_RXI, IIC3_TXI, IIC3_TEI, | 35 | |
40 | SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI, | 36 | SCIF0, SCIF1, SCIF2, SCIF3, |
41 | SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI, | ||
42 | SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI, | ||
43 | SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI, | ||
44 | 37 | ||
45 | /* interrupt groups */ | 38 | /* interrupt groups */ |
46 | PINT, DMAC0, DMAC1, DMAC2, DMAC3, DMAC4, DMAC5, DMAC6, DMAC7, | 39 | PINT, |
47 | MTU0_ABCD, MTU0_VEF, MTU1_AB, MTU1_VU, MTU2_AB, MTU2_VU, | ||
48 | MTU3_ABCD, MTU4_ABCD, MTU5, POE2_12, MTU3S_ABCD, MTU4S_ABCD, MTU5S, | ||
49 | IIC3, SCIF0, SCIF1, SCIF2, SCIF3, | ||
50 | }; | 40 | }; |
51 | 41 | ||
52 | static struct intc_vect vectors[] __initdata = { | 42 | static struct intc_vect vectors[] __initdata = { |
@@ -59,86 +49,58 @@ static struct intc_vect vectors[] __initdata = { | |||
59 | INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85), | 49 | INTC_IRQ(PINT4, 84), INTC_IRQ(PINT5, 85), |
60 | INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87), | 50 | INTC_IRQ(PINT6, 86), INTC_IRQ(PINT7, 87), |
61 | INTC_IRQ(ADC_ADI0, 92), INTC_IRQ(ADC_ADI1, 96), | 51 | INTC_IRQ(ADC_ADI0, 92), INTC_IRQ(ADC_ADI1, 96), |
62 | INTC_IRQ(DMAC0_DEI, 108), INTC_IRQ(DMAC0_HEI, 109), | 52 | INTC_IRQ(DMAC0, 108), INTC_IRQ(DMAC0, 109), |
63 | INTC_IRQ(DMAC1_DEI, 112), INTC_IRQ(DMAC1_HEI, 113), | 53 | INTC_IRQ(DMAC1, 112), INTC_IRQ(DMAC1, 113), |
64 | INTC_IRQ(DMAC2_DEI, 116), INTC_IRQ(DMAC2_HEI, 117), | 54 | INTC_IRQ(DMAC2, 116), INTC_IRQ(DMAC2, 117), |
65 | INTC_IRQ(DMAC3_DEI, 120), INTC_IRQ(DMAC3_HEI, 121), | 55 | INTC_IRQ(DMAC3, 120), INTC_IRQ(DMAC3, 121), |
66 | INTC_IRQ(DMAC4_DEI, 124), INTC_IRQ(DMAC4_HEI, 125), | 56 | INTC_IRQ(DMAC4, 124), INTC_IRQ(DMAC4, 125), |
67 | INTC_IRQ(DMAC5_DEI, 128), INTC_IRQ(DMAC5_HEI, 129), | 57 | INTC_IRQ(DMAC5, 128), INTC_IRQ(DMAC5, 129), |
68 | INTC_IRQ(DMAC6_DEI, 132), INTC_IRQ(DMAC6_HEI, 133), | 58 | INTC_IRQ(DMAC6, 132), INTC_IRQ(DMAC6, 133), |
69 | INTC_IRQ(DMAC7_DEI, 136), INTC_IRQ(DMAC7_HEI, 137), | 59 | INTC_IRQ(DMAC7, 136), INTC_IRQ(DMAC7, 137), |
70 | INTC_IRQ(CMT0, 140), INTC_IRQ(CMT1, 144), | 60 | INTC_IRQ(CMT0, 140), INTC_IRQ(CMT1, 144), |
71 | INTC_IRQ(BSC, 148), INTC_IRQ(WDT, 152), | 61 | INTC_IRQ(BSC, 148), INTC_IRQ(WDT, 152), |
72 | INTC_IRQ(MTU2_TGI0A, 156), INTC_IRQ(MTU2_TGI0B, 157), | 62 | INTC_IRQ(MTU0_ABCD, 156), INTC_IRQ(MTU0_ABCD, 157), |
73 | INTC_IRQ(MTU2_TGI0C, 158), INTC_IRQ(MTU2_TGI0D, 159), | 63 | INTC_IRQ(MTU0_ABCD, 158), INTC_IRQ(MTU0_ABCD, 159), |
74 | INTC_IRQ(MTU2_TCI0V, 160), | 64 | INTC_IRQ(MTU0_VEF, 160), INTC_IRQ(MTU0_VEF, 161), |
75 | INTC_IRQ(MTU2_TGI0E, 161), INTC_IRQ(MTU2_TGI0F, 162), | 65 | INTC_IRQ(MTU0_VEF, 162), |
76 | INTC_IRQ(MTU2_TGI1A, 164), INTC_IRQ(MTU2_TGI1B, 165), | 66 | INTC_IRQ(MTU1_AB, 164), INTC_IRQ(MTU1_AB, 165), |
77 | INTC_IRQ(MTU2_TCI1V, 168), INTC_IRQ(MTU2_TCI1U, 169), | 67 | INTC_IRQ(MTU1_VU, 168), INTC_IRQ(MTU1_VU, 169), |
78 | INTC_IRQ(MTU2_TGI2A, 172), INTC_IRQ(MTU2_TGI2B, 173), | 68 | INTC_IRQ(MTU2_AB, 172), INTC_IRQ(MTU2_AB, 173), |
79 | INTC_IRQ(MTU2_TCI2V, 176), INTC_IRQ(MTU2_TCI2U, 177), | 69 | INTC_IRQ(MTU2_VU, 176), INTC_IRQ(MTU2_VU, 177), |
80 | INTC_IRQ(MTU2_TGI3A, 180), INTC_IRQ(MTU2_TGI3B, 181), | 70 | INTC_IRQ(MTU3_ABCD, 180), INTC_IRQ(MTU3_ABCD, 181), |
81 | INTC_IRQ(MTU2_TGI3C, 182), INTC_IRQ(MTU2_TGI3D, 183), | 71 | INTC_IRQ(MTU3_ABCD, 182), INTC_IRQ(MTU3_ABCD, 183), |
82 | INTC_IRQ(MTU2_TCI3V, 184), | 72 | INTC_IRQ(MTU2_TCI3V, 184), |
83 | INTC_IRQ(MTU2_TGI4A, 188), INTC_IRQ(MTU2_TGI4B, 189), | 73 | INTC_IRQ(MTU4_ABCD, 188), INTC_IRQ(MTU4_ABCD, 189), |
84 | INTC_IRQ(MTU2_TGI4C, 190), INTC_IRQ(MTU2_TGI4D, 191), | 74 | INTC_IRQ(MTU4_ABCD, 190), INTC_IRQ(MTU4_ABCD, 191), |
85 | INTC_IRQ(MTU2_TCI4V, 192), | 75 | INTC_IRQ(MTU2_TCI4V, 192), |
86 | INTC_IRQ(MTU2_TGI5U, 196), INTC_IRQ(MTU2_TGI5V, 197), | 76 | INTC_IRQ(MTU5, 196), INTC_IRQ(MTU5, 197), |
87 | INTC_IRQ(MTU2_TGI5W, 198), | 77 | INTC_IRQ(MTU5, 198), |
88 | INTC_IRQ(POE2_OEI1, 200), INTC_IRQ(POE2_OEI2, 201), | 78 | INTC_IRQ(POE2_12, 200), INTC_IRQ(POE2_12, 201), |
89 | INTC_IRQ(MTU2S_TGI3A, 204), INTC_IRQ(MTU2S_TGI3B, 205), | 79 | INTC_IRQ(MTU3S_ABCD, 204), INTC_IRQ(MTU3S_ABCD, 205), |
90 | INTC_IRQ(MTU2S_TGI3C, 206), INTC_IRQ(MTU2S_TGI3D, 207), | 80 | INTC_IRQ(MTU3S_ABCD, 206), INTC_IRQ(MTU3S_ABCD, 207), |
91 | INTC_IRQ(MTU2S_TCI3V, 208), | 81 | INTC_IRQ(MTU2S_TCI3V, 208), |
92 | INTC_IRQ(MTU2S_TGI4A, 212), INTC_IRQ(MTU2S_TGI4B, 213), | 82 | INTC_IRQ(MTU4S_ABCD, 212), INTC_IRQ(MTU4S_ABCD, 213), |
93 | INTC_IRQ(MTU2S_TGI4C, 214), INTC_IRQ(MTU2S_TGI4D, 215), | 83 | INTC_IRQ(MTU4S_ABCD, 214), INTC_IRQ(MTU4S_ABCD, 215), |
94 | INTC_IRQ(MTU2S_TCI4V, 216), | 84 | INTC_IRQ(MTU2S_TCI4V, 216), |
95 | INTC_IRQ(MTU2S_TGI5U, 220), INTC_IRQ(MTU2S_TGI5V, 221), | 85 | INTC_IRQ(MTU5S, 220), INTC_IRQ(MTU5S, 221), |
96 | INTC_IRQ(MTU2S_TGI5W, 222), | 86 | INTC_IRQ(MTU5S, 222), |
97 | INTC_IRQ(POE2_OEI3, 224), | 87 | INTC_IRQ(POE2_OEI3, 224), |
98 | INTC_IRQ(IIC3_STPI, 228), INTC_IRQ(IIC3_NAKI, 229), | 88 | INTC_IRQ(IIC3, 228), INTC_IRQ(IIC3, 229), |
99 | INTC_IRQ(IIC3_RXI, 230), INTC_IRQ(IIC3_TXI, 231), | 89 | INTC_IRQ(IIC3, 230), INTC_IRQ(IIC3, 231), |
100 | INTC_IRQ(IIC3_TEI, 232), | 90 | INTC_IRQ(IIC3, 232), |
101 | INTC_IRQ(SCIF0_BRI, 240), INTC_IRQ(SCIF0_ERI, 241), | 91 | INTC_IRQ(SCIF0, 240), INTC_IRQ(SCIF0, 241), |
102 | INTC_IRQ(SCIF0_RXI, 242), INTC_IRQ(SCIF0_TXI, 243), | 92 | INTC_IRQ(SCIF0, 242), INTC_IRQ(SCIF0, 243), |
103 | INTC_IRQ(SCIF1_BRI, 244), INTC_IRQ(SCIF1_ERI, 245), | 93 | INTC_IRQ(SCIF1, 244), INTC_IRQ(SCIF1, 245), |
104 | INTC_IRQ(SCIF1_RXI, 246), INTC_IRQ(SCIF1_TXI, 247), | 94 | INTC_IRQ(SCIF1, 246), INTC_IRQ(SCIF1, 247), |
105 | INTC_IRQ(SCIF2_BRI, 248), INTC_IRQ(SCIF2_ERI, 249), | 95 | INTC_IRQ(SCIF2, 248), INTC_IRQ(SCIF2, 249), |
106 | INTC_IRQ(SCIF2_RXI, 250), INTC_IRQ(SCIF2_TXI, 251), | 96 | INTC_IRQ(SCIF2, 250), INTC_IRQ(SCIF2, 251), |
107 | INTC_IRQ(SCIF3_BRI, 252), INTC_IRQ(SCIF3_ERI, 253), | 97 | INTC_IRQ(SCIF3, 252), INTC_IRQ(SCIF3, 253), |
108 | INTC_IRQ(SCIF3_RXI, 254), INTC_IRQ(SCIF3_TXI, 255), | 98 | INTC_IRQ(SCIF3, 254), INTC_IRQ(SCIF3, 255), |
109 | }; | 99 | }; |
110 | 100 | ||
111 | static struct intc_group groups[] __initdata = { | 101 | static struct intc_group groups[] __initdata = { |
112 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, | 102 | INTC_GROUP(PINT, PINT0, PINT1, PINT2, PINT3, |
113 | PINT4, PINT5, PINT6, PINT7), | 103 | PINT4, PINT5, PINT6, PINT7), |
114 | INTC_GROUP(DMAC0, DMAC0_DEI, DMAC0_HEI), | ||
115 | INTC_GROUP(DMAC1, DMAC1_DEI, DMAC1_HEI), | ||
116 | INTC_GROUP(DMAC2, DMAC2_DEI, DMAC2_HEI), | ||
117 | INTC_GROUP(DMAC3, DMAC3_DEI, DMAC3_HEI), | ||
118 | INTC_GROUP(DMAC4, DMAC4_DEI, DMAC4_HEI), | ||
119 | INTC_GROUP(DMAC5, DMAC5_DEI, DMAC5_HEI), | ||
120 | INTC_GROUP(DMAC6, DMAC6_DEI, DMAC6_HEI), | ||
121 | INTC_GROUP(DMAC7, DMAC7_DEI, DMAC7_HEI), | ||
122 | INTC_GROUP(MTU0_ABCD, MTU2_TGI0A, MTU2_TGI0B, MTU2_TGI0C, MTU2_TGI0D), | ||
123 | INTC_GROUP(MTU0_VEF, MTU2_TCI0V, MTU2_TGI0E, MTU2_TGI0F), | ||
124 | INTC_GROUP(MTU1_AB, MTU2_TGI1A, MTU2_TGI1B), | ||
125 | INTC_GROUP(MTU1_VU, MTU2_TCI1V, MTU2_TCI1U), | ||
126 | INTC_GROUP(MTU2_AB, MTU2_TGI2A, MTU2_TGI2B), | ||
127 | INTC_GROUP(MTU2_VU, MTU2_TCI2V, MTU2_TCI2U), | ||
128 | INTC_GROUP(MTU3_ABCD, MTU2_TGI3A, MTU2_TGI3B, MTU2_TGI3C, MTU2_TGI3D), | ||
129 | INTC_GROUP(MTU4_ABCD, MTU2_TGI4A, MTU2_TGI4B, MTU2_TGI4C, MTU2_TGI4D), | ||
130 | INTC_GROUP(MTU5, MTU2_TGI5U, MTU2_TGI5V, MTU2_TGI5W), | ||
131 | INTC_GROUP(POE2_12, POE2_OEI1, POE2_OEI2), | ||
132 | INTC_GROUP(MTU3S_ABCD, MTU2S_TGI3A, MTU2S_TGI3B, | ||
133 | MTU2S_TGI3C, MTU2S_TGI3D), | ||
134 | INTC_GROUP(MTU4S_ABCD, MTU2S_TGI4A, MTU2S_TGI4B, | ||
135 | MTU2S_TGI4C, MTU2S_TGI4D), | ||
136 | INTC_GROUP(MTU5S, MTU2S_TGI5U, MTU2S_TGI5V, MTU2S_TGI5W), | ||
137 | INTC_GROUP(IIC3, IIC3_STPI, IIC3_NAKI, IIC3_RXI, IIC3_TXI, IIC3_TEI), | ||
138 | INTC_GROUP(SCIF0, SCIF0_BRI, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI), | ||
139 | INTC_GROUP(SCIF1, SCIF1_BRI, SCIF1_ERI, SCIF1_RXI, SCIF1_TXI), | ||
140 | INTC_GROUP(SCIF2, SCIF2_BRI, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI), | ||
141 | INTC_GROUP(SCIF3, SCIF3_BRI, SCIF3_ERI, SCIF3_RXI, SCIF3_TXI), | ||
142 | }; | 104 | }; |
143 | 105 | ||
144 | static struct intc_prio_reg prio_registers[] __initdata = { | 106 | static struct intc_prio_reg prio_registers[] __initdata = { |
@@ -174,22 +136,22 @@ static struct plat_sci_port sci_platform_data[] = { | |||
174 | .mapbase = 0xfffe8000, | 136 | .mapbase = 0xfffe8000, |
175 | .flags = UPF_BOOT_AUTOCONF, | 137 | .flags = UPF_BOOT_AUTOCONF, |
176 | .type = PORT_SCIF, | 138 | .type = PORT_SCIF, |
177 | .irqs = { 241, 242, 243, 240 }, | 139 | .irqs = { 240, 240, 240, 240 }, |
178 | }, { | 140 | }, { |
179 | .mapbase = 0xfffe8800, | 141 | .mapbase = 0xfffe8800, |
180 | .flags = UPF_BOOT_AUTOCONF, | 142 | .flags = UPF_BOOT_AUTOCONF, |
181 | .type = PORT_SCIF, | 143 | .type = PORT_SCIF, |
182 | .irqs = { 245, 246, 247, 244 }, | 144 | .irqs = { 244, 244, 244, 244 }, |
183 | }, { | 145 | }, { |
184 | .mapbase = 0xfffe9000, | 146 | .mapbase = 0xfffe9000, |
185 | .flags = UPF_BOOT_AUTOCONF, | 147 | .flags = UPF_BOOT_AUTOCONF, |
186 | .type = PORT_SCIF, | 148 | .type = PORT_SCIF, |
187 | .irqs = { 249, 250, 251, 248 }, | 149 | .irqs = { 248, 248, 248, 248 }, |
188 | }, { | 150 | }, { |
189 | .mapbase = 0xfffe9800, | 151 | .mapbase = 0xfffe9800, |
190 | .flags = UPF_BOOT_AUTOCONF, | 152 | .flags = UPF_BOOT_AUTOCONF, |
191 | .type = PORT_SCIF, | 153 | .type = PORT_SCIF, |
192 | .irqs = { 253, 254, 255, 252 }, | 154 | .irqs = { 252, 252, 252, 252 }, |
193 | }, { | 155 | }, { |
194 | .flags = 0, | 156 | .flags = 0, |
195 | } | 157 | } |
diff --git a/arch/sh/kernel/cpu/sh3/Makefile b/arch/sh/kernel/cpu/sh3/Makefile index e07c69e16d9b..ecab274141a8 100644 --- a/arch/sh/kernel/cpu/sh3/Makefile +++ b/arch/sh/kernel/cpu/sh3/Makefile | |||
@@ -4,6 +4,8 @@ | |||
4 | 4 | ||
5 | obj-y := ex.o probe.o entry.o setup-sh3.o | 5 | obj-y := ex.o probe.o entry.o setup-sh3.o |
6 | 6 | ||
7 | obj-$(CONFIG_HIBERNATION) += swsusp.o | ||
8 | |||
7 | # CPU subtype setup | 9 | # CPU subtype setup |
8 | obj-$(CONFIG_CPU_SUBTYPE_SH7705) += setup-sh7705.o | 10 | obj-$(CONFIG_CPU_SUBTYPE_SH7705) += setup-sh7705.o |
9 | obj-$(CONFIG_CPU_SUBTYPE_SH7706) += setup-sh770x.o | 11 | obj-$(CONFIG_CPU_SUBTYPE_SH7706) += setup-sh770x.o |
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index b4106d0c68ec..55da0ff9848d 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <asm/unistd.h> | 16 | #include <asm/unistd.h> |
17 | #include <cpu/mmu_context.h> | 17 | #include <cpu/mmu_context.h> |
18 | #include <asm/page.h> | 18 | #include <asm/page.h> |
19 | #include <asm/cache.h> | ||
19 | 20 | ||
20 | ! NOTE: | 21 | ! NOTE: |
21 | ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address | 22 | ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address |
@@ -187,44 +188,35 @@ call_dae: | |||
187 | #if defined(CONFIG_SH_STANDARD_BIOS) | 188 | #if defined(CONFIG_SH_STANDARD_BIOS) |
188 | /* Unwind the stack and jmp to the debug entry */ | 189 | /* Unwind the stack and jmp to the debug entry */ |
189 | ENTRY(sh_bios_handler) | 190 | ENTRY(sh_bios_handler) |
190 | mov.l @r15+, r0 | 191 | mov.l 1f, r8 |
191 | mov.l @r15+, r1 | 192 | bsr restore_regs |
192 | mov.l @r15+, r2 | 193 | nop |
193 | mov.l @r15+, r3 | 194 | |
194 | mov.l @r15+, r4 | 195 | lds k2, pr ! restore pr |
195 | mov.l @r15+, r5 | 196 | mov k4, r15 |
196 | mov.l @r15+, r6 | ||
197 | mov.l @r15+, r7 | ||
198 | stc sr, r8 | ||
199 | mov.l 1f, r9 ! BL =1, RB=1, IMASK=0x0F | ||
200 | or r9, r8 | ||
201 | ldc r8, sr ! here, change the register bank | ||
202 | mov.l @r15+, r8 | ||
203 | mov.l @r15+, r9 | ||
204 | mov.l @r15+, r10 | ||
205 | mov.l @r15+, r11 | ||
206 | mov.l @r15+, r12 | ||
207 | mov.l @r15+, r13 | ||
208 | mov.l @r15+, r14 | ||
209 | mov.l @r15+, k0 | ||
210 | ldc.l @r15+, spc | ||
211 | lds.l @r15+, pr | ||
212 | mov.l @r15+, k1 | ||
213 | ldc.l @r15+, gbr | ||
214 | lds.l @r15+, mach | ||
215 | lds.l @r15+, macl | ||
216 | mov k0, r15 | ||
217 | ! | 197 | ! |
218 | mov.l 2f, k0 | 198 | mov.l 2f, k0 |
219 | mov.l @k0, k0 | 199 | mov.l @k0, k0 |
220 | jmp @k0 | 200 | jmp @k0 |
221 | ldc k1, ssr | 201 | ldc k3, ssr |
222 | .align 2 | 202 | .align 2 |
223 | 1: .long 0x300000f0 | 203 | 1: .long 0x300000f0 |
224 | 2: .long gdb_vbr_vector | 204 | 2: .long gdb_vbr_vector |
225 | #endif /* CONFIG_SH_STANDARD_BIOS */ | 205 | #endif /* CONFIG_SH_STANDARD_BIOS */ |
226 | 206 | ||
227 | restore_all: | 207 | ! restore_regs() |
208 | ! - restore r0, r1, r2, r3, r4, r5, r6, r7 from the stack | ||
209 | ! - switch bank | ||
210 | ! - restore r8, r9, r10, r11, r12, r13, r14, r15 from the stack | ||
211 | ! - restore spc, pr*, ssr, gbr, mach, macl, skip default tra | ||
212 | ! k2 returns original pr | ||
213 | ! k3 returns original sr | ||
214 | ! k4 returns original stack pointer | ||
215 | ! r8 passes SR bitmask, overwritten with restored data on return | ||
216 | ! r9 trashed | ||
217 | ! BL=0 on entry, on exit BL=1 (depending on r8). | ||
218 | |||
219 | ENTRY(restore_regs) | ||
228 | mov.l @r15+, r0 | 220 | mov.l @r15+, r0 |
229 | mov.l @r15+, r1 | 221 | mov.l @r15+, r1 |
230 | mov.l @r15+, r2 | 222 | mov.l @r15+, r2 |
@@ -234,10 +226,9 @@ restore_all: | |||
234 | mov.l @r15+, r6 | 226 | mov.l @r15+, r6 |
235 | mov.l @r15+, r7 | 227 | mov.l @r15+, r7 |
236 | ! | 228 | ! |
237 | stc sr, r8 | 229 | stc sr, r9 |
238 | mov.l 7f, r9 | 230 | or r8, r9 |
239 | or r9, r8 ! BL =1, RB=1 | 231 | ldc r9, sr |
240 | ldc r8, sr ! here, change the register bank | ||
241 | ! | 232 | ! |
242 | mov.l @r15+, r8 | 233 | mov.l @r15+, r8 |
243 | mov.l @r15+, r9 | 234 | mov.l @r15+, r9 |
@@ -248,12 +239,20 @@ restore_all: | |||
248 | mov.l @r15+, r14 | 239 | mov.l @r15+, r14 |
249 | mov.l @r15+, k4 ! original stack pointer | 240 | mov.l @r15+, k4 ! original stack pointer |
250 | ldc.l @r15+, spc | 241 | ldc.l @r15+, spc |
251 | lds.l @r15+, pr | 242 | mov.l @r15+, k2 ! original PR |
252 | mov.l @r15+, k3 ! original SR | 243 | mov.l @r15+, k3 ! original SR |
253 | ldc.l @r15+, gbr | 244 | ldc.l @r15+, gbr |
254 | lds.l @r15+, mach | 245 | lds.l @r15+, mach |
255 | lds.l @r15+, macl | 246 | lds.l @r15+, macl |
256 | add #4, r15 ! Skip syscall number | 247 | rts |
248 | add #4, r15 ! Skip syscall number | ||
249 | |||
250 | restore_all: | ||
251 | mov.l 7f, r8 | ||
252 | bsr restore_regs | ||
253 | nop | ||
254 | |||
255 | lds k2, pr ! restore pr | ||
257 | ! | 256 | ! |
258 | #ifdef CONFIG_SH_DSP | 257 | #ifdef CONFIG_SH_DSP |
259 | mov.l @r15+, k0 ! DSP mode marker | 258 | mov.l @r15+, k0 ! DSP mode marker |
@@ -294,7 +293,7 @@ skip_restore: | |||
294 | mov #0xf0, k1 | 293 | mov #0xf0, k1 |
295 | extu.b k1, k1 | 294 | extu.b k1, k1 |
296 | not k1, k1 | 295 | not k1, k1 |
297 | and k1, k2 ! Mask orignal SR value | 296 | and k1, k2 ! Mask original SR value |
298 | ! | 297 | ! |
299 | mov k3, k0 ! Calculate IMASK-bits | 298 | mov k3, k0 ! Calculate IMASK-bits |
300 | shlr2 k0 | 299 | shlr2 k0 |
@@ -313,7 +312,6 @@ skip_restore: | |||
313 | mov #0, k1 | 312 | mov #0, k1 |
314 | mov.b k1, @k0 | 313 | mov.b k1, @k0 |
315 | #endif | 314 | #endif |
316 | mov.l @r15+, k2 ! restore EXPEVT | ||
317 | mov k4, r15 | 315 | mov k4, r15 |
318 | rte | 316 | rte |
319 | nop | 317 | nop |
@@ -336,81 +334,55 @@ skip_restore: | |||
336 | ENTRY(vbr_base) | 334 | ENTRY(vbr_base) |
337 | .long 0 | 335 | .long 0 |
338 | ! | 336 | ! |
337 | ! 0x100: General exception vector | ||
338 | ! | ||
339 | .balign 256,0,256 | 339 | .balign 256,0,256 |
340 | general_exception: | 340 | general_exception: |
341 | mov.l 1f, k2 | 341 | #ifndef CONFIG_CPU_SUBTYPE_SHX3 |
342 | mov.l 2f, k3 | 342 | bra handle_exception |
343 | #ifdef CONFIG_CPU_SUBTYPE_SHX3 | 343 | sts pr, k3 ! save original pr value in k3 |
344 | mov.l @k2, k2 | 344 | #else |
345 | mov.l 1f, k4 | ||
346 | mov.l @k4, k4 | ||
345 | 347 | ||
346 | ! Is EXPEVT larger than 0x800? | 348 | ! Is EXPEVT larger than 0x800? |
347 | mov #0x8, k0 | 349 | mov #0x8, k0 |
348 | shll8 k0 | 350 | shll8 k0 |
349 | cmp/hs k0, k2 | 351 | cmp/hs k0, k4 |
350 | bf 0f | 352 | bf 0f |
351 | 353 | ||
352 | ! then add 0x580 (k2 is 0xd80 or 0xda0) | 354 | ! then add 0x580 (k2 is 0xd80 or 0xda0) |
353 | mov #0x58, k0 | 355 | mov #0x58, k0 |
354 | shll2 k0 | 356 | shll2 k0 |
355 | shll2 k0 | 357 | shll2 k0 |
356 | add k0, k2 | 358 | add k0, k4 |
357 | 0: | 359 | 0: |
358 | bra handle_exception | 360 | ! Setup stack and save DSP context (k0 contains original r15 on return) |
361 | bsr prepare_stack_save_dsp | ||
359 | nop | 362 | nop |
360 | #else | ||
361 | bra handle_exception | ||
362 | mov.l @k2, k2 | ||
363 | #endif | ||
364 | .align 2 | ||
365 | 1: .long EXPEVT | ||
366 | 2: .long ret_from_exception | ||
367 | ! | ||
368 | ! | ||
369 | 363 | ||
370 | .balign 1024,0,1024 | 364 | ! Save registers / Switch to bank 0 |
371 | tlb_miss: | 365 | mov k4, k2 ! keep vector in k2 |
372 | mov.l 1f, k2 | 366 | mov.l 1f, k4 ! SR bits to clear in k4 |
373 | mov.l 4f, k3 | 367 | bsr save_regs ! needs original pr value in k3 |
374 | bra handle_exception | 368 | nop |
375 | mov.l @k2, k2 | 369 | |
376 | ! | 370 | bra handle_exception_special |
377 | .balign 512,0,512 | ||
378 | interrupt: | ||
379 | mov.l 3f, k3 | ||
380 | #if defined(CONFIG_KGDB) | ||
381 | mov.l 2f, k2 | ||
382 | ! Debounce (filter nested NMI) | ||
383 | mov.l @k2, k0 | ||
384 | mov.l 5f, k1 | ||
385 | cmp/eq k1, k0 | ||
386 | bf 0f | ||
387 | mov.l 6f, k1 | ||
388 | tas.b @k1 | ||
389 | bt 0f | ||
390 | rte | ||
391 | nop | 371 | nop |
392 | .align 2 | ||
393 | 2: .long INTEVT | ||
394 | 5: .long NMI_VEC | ||
395 | 6: .long in_nmi | ||
396 | 0: | ||
397 | #endif /* defined(CONFIG_KGDB) */ | ||
398 | bra handle_exception | ||
399 | mov #-1, k2 ! interrupt exception marker | ||
400 | 372 | ||
401 | .align 2 | 373 | .align 2 |
402 | 1: .long EXPEVT | 374 | 1: .long EXPEVT |
403 | 3: .long ret_from_irq | 375 | #endif |
404 | 4: .long ret_from_exception | ||
405 | 376 | ||
406 | ! | 377 | ! prepare_stack_save_dsp() |
407 | ! | 378 | ! - roll back gRB |
408 | .align 2 | 379 | ! - switch to kernel stack |
409 | ENTRY(handle_exception) | 380 | ! - save DSP |
410 | ! Using k0, k1 for scratch registers (r0_bank1, r1_bank), | 381 | ! k0 returns original sp (after roll back) |
411 | ! save all registers onto stack. | 382 | ! k1 trashed |
412 | ! | 383 | ! k2 trashed |
413 | 384 | ||
385 | prepare_stack_save_dsp: | ||
414 | #ifdef CONFIG_GUSA | 386 | #ifdef CONFIG_GUSA |
415 | ! Check for roll back gRB (User and Kernel) | 387 | ! Check for roll back gRB (User and Kernel) |
416 | mov r15, k0 | 388 | mov r15, k0 |
@@ -430,7 +402,7 @@ ENTRY(handle_exception) | |||
430 | 2: mov k1, r15 ! SP = r1 | 402 | 2: mov k1, r15 ! SP = r1 |
431 | 1: | 403 | 1: |
432 | #endif | 404 | #endif |
433 | 405 | ! Switch to kernel stack if needed | |
434 | stc ssr, k0 ! Is it from kernel space? | 406 | stc ssr, k0 ! Is it from kernel space? |
435 | shll k0 ! Check MD bit (bit30) by shifting it into... | 407 | shll k0 ! Check MD bit (bit30) by shifting it into... |
436 | shll k0 ! ...the T bit | 408 | shll k0 ! ...the T bit |
@@ -443,18 +415,17 @@ ENTRY(handle_exception) | |||
443 | add current, k1 | 415 | add current, k1 |
444 | mov k1, r15 ! change to kernel stack | 416 | mov k1, r15 ! change to kernel stack |
445 | ! | 417 | ! |
446 | 1: mov.l 2f, k1 | 418 | 1: |
447 | ! | ||
448 | #ifdef CONFIG_SH_DSP | 419 | #ifdef CONFIG_SH_DSP |
449 | mov.l r2, @-r15 ! Save r2, we need another reg | 420 | ! Save DSP context if needed |
450 | stc sr, k4 | 421 | stc sr, k1 |
451 | mov.l 1f, r2 | 422 | mov #0x10, k2 |
452 | tst r2, k4 ! Check if in DSP mode | 423 | shll8 k2 ! DSP=1 (0x00001000) |
453 | mov.l @r15+, r2 ! Restore r2 now | 424 | tst k2, k1 ! Check if in DSP mode (passed in k2) |
454 | bt/s skip_save | 425 | bt/s skip_save |
455 | mov #0, k4 ! Set marker for no stack frame | 426 | mov #0, k1 ! Set marker for no stack frame |
456 | 427 | ||
457 | mov r2, k4 ! Backup r2 (in k4) for later | 428 | mov k2, k1 ! Save has-frame marker |
458 | 429 | ||
459 | ! Save DSP registers on stack | 430 | ! Save DSP registers on stack |
460 | stc.l mod, @-r15 | 431 | stc.l mod, @-r15 |
@@ -473,35 +444,74 @@ ENTRY(handle_exception) | |||
473 | ! as we're not at all interested in supporting ancient toolchains at | 444 | ! as we're not at all interested in supporting ancient toolchains at |
474 | ! this point. -- PFM. | 445 | ! this point. -- PFM. |
475 | 446 | ||
476 | mov r15, r2 | 447 | mov r15, k2 |
477 | .word 0xf653 ! movs.l a1, @-r2 | 448 | .word 0xf653 ! movs.l a1, @-r2 |
478 | .word 0xf6f3 ! movs.l a0g, @-r2 | 449 | .word 0xf6f3 ! movs.l a0g, @-r2 |
479 | .word 0xf6d3 ! movs.l a1g, @-r2 | 450 | .word 0xf6d3 ! movs.l a1g, @-r2 |
480 | .word 0xf6c3 ! movs.l m0, @-r2 | 451 | .word 0xf6c3 ! movs.l m0, @-r2 |
481 | .word 0xf6e3 ! movs.l m1, @-r2 | 452 | .word 0xf6e3 ! movs.l m1, @-r2 |
482 | mov r2, r15 | 453 | mov k2, r15 |
483 | 454 | ||
484 | mov k4, r2 ! Restore r2 | ||
485 | mov.l 1f, k4 ! Force DSP stack frame | ||
486 | skip_save: | 455 | skip_save: |
487 | mov.l k4, @-r15 ! Push DSP mode marker onto stack | 456 | mov.l k1, @-r15 ! Push DSP mode marker onto stack |
488 | #endif | 457 | #endif |
489 | ! Save the user registers on the stack. | 458 | rts |
490 | mov.l k2, @-r15 ! EXPEVT | 459 | nop |
491 | 460 | ! | |
492 | mov #-1, k4 | 461 | ! 0x400: Instruction and Data TLB miss exception vector |
493 | mov.l k4, @-r15 ! set TRA (default: -1) | 462 | ! |
494 | ! | 463 | .balign 1024,0,1024 |
464 | tlb_miss: | ||
465 | sts pr, k3 ! save original pr value in k3 | ||
466 | |||
467 | handle_exception: | ||
468 | mova exception_data, k0 | ||
469 | |||
470 | ! Setup stack and save DSP context (k0 contains original r15 on return) | ||
471 | bsr prepare_stack_save_dsp | ||
472 | PREF(k0) | ||
473 | |||
474 | ! Save registers / Switch to bank 0 | ||
475 | mov.l 5f, k2 ! vector register address | ||
476 | mov.l 1f, k4 ! SR bits to clear in k4 | ||
477 | bsr save_regs ! needs original pr value in k3 | ||
478 | mov.l @k2, k2 ! read out vector and keep in k2 | ||
479 | |||
480 | handle_exception_special: | ||
481 | ! Setup return address and jump to exception handler | ||
482 | mov.l 7f, r9 ! fetch return address | ||
483 | stc r2_bank, r0 ! k2 (vector) | ||
484 | mov.l 6f, r10 | ||
485 | shlr2 r0 | ||
486 | shlr r0 | ||
487 | mov.l @(r0, r10), r10 | ||
488 | jmp @r10 | ||
489 | lds r9, pr ! put return address in pr | ||
490 | |||
491 | .align L1_CACHE_SHIFT | ||
492 | |||
493 | ! save_regs() | ||
494 | ! - save default tra, macl, mach, gbr, ssr, pr* and spc on the stack | ||
495 | ! - save r15*, r14, r13, r12, r11, r10, r9, r8 on the stack | ||
496 | ! - switch bank | ||
497 | ! - save r7, r6, r5, r4, r3, r2, r1, r0 on the stack | ||
498 | ! k0 contains original stack pointer* | ||
499 | ! k1 trashed | ||
500 | ! k3 passes original pr* | ||
501 | ! k4 passes SR bitmask | ||
502 | ! BL=1 on entry, on exit BL=0. | ||
503 | |||
504 | ENTRY(save_regs) | ||
505 | mov #-1, r1 | ||
506 | mov.l k1, @-r15 ! set TRA (default: -1) | ||
495 | sts.l macl, @-r15 | 507 | sts.l macl, @-r15 |
496 | sts.l mach, @-r15 | 508 | sts.l mach, @-r15 |
497 | stc.l gbr, @-r15 | 509 | stc.l gbr, @-r15 |
498 | stc.l ssr, @-r15 | 510 | stc.l ssr, @-r15 |
499 | sts.l pr, @-r15 | 511 | mov.l k3, @-r15 ! original pr in k3 |
500 | stc.l spc, @-r15 | 512 | stc.l spc, @-r15 |
501 | ! | 513 | |
502 | lds k3, pr ! Set the return address to pr | 514 | mov.l k0, @-r15 ! original stack pointer in k0 |
503 | ! | ||
504 | mov.l k0, @-r15 ! save orignal stack | ||
505 | mov.l r14, @-r15 | 515 | mov.l r14, @-r15 |
506 | mov.l r13, @-r15 | 516 | mov.l r13, @-r15 |
507 | mov.l r12, @-r15 | 517 | mov.l r12, @-r15 |
@@ -509,13 +519,23 @@ skip_save: | |||
509 | mov.l r10, @-r15 | 519 | mov.l r10, @-r15 |
510 | mov.l r9, @-r15 | 520 | mov.l r9, @-r15 |
511 | mov.l r8, @-r15 | 521 | mov.l r8, @-r15 |
512 | ! | 522 | |
513 | stc sr, r8 ! Back to normal register bank, and | 523 | mov.l 0f, k3 ! SR bits to set in k3 |
514 | or k1, r8 ! Block all interrupts | 524 | |
515 | mov.l 3f, k1 | 525 | ! fall-through |
516 | and k1, r8 ! ... | 526 | |
517 | ldc r8, sr ! ...changed here. | 527 | ! save_low_regs() |
518 | ! | 528 | ! - modify SR for bank switch |
529 | ! - save r7, r6, r5, r4, r3, r2, r1, r0 on the stack | ||
530 | ! k3 passes bits to set in SR | ||
531 | ! k4 passes bits to clear in SR | ||
532 | |||
533 | ENTRY(save_low_regs) | ||
534 | stc sr, r8 | ||
535 | or k3, r8 | ||
536 | and k4, r8 | ||
537 | ldc r8, sr | ||
538 | |||
519 | mov.l r7, @-r15 | 539 | mov.l r7, @-r15 |
520 | mov.l r6, @-r15 | 540 | mov.l r6, @-r15 |
521 | mov.l r5, @-r15 | 541 | mov.l r5, @-r15 |
@@ -523,52 +543,63 @@ skip_save: | |||
523 | mov.l r3, @-r15 | 543 | mov.l r3, @-r15 |
524 | mov.l r2, @-r15 | 544 | mov.l r2, @-r15 |
525 | mov.l r1, @-r15 | 545 | mov.l r1, @-r15 |
526 | mov.l r0, @-r15 | ||
527 | |||
528 | /* | ||
529 | * This gets a bit tricky.. in the INTEVT case we don't want to use | ||
530 | * the VBR offset as a destination in the jump call table, since all | ||
531 | * of the destinations are the same. In this case, (interrupt) sets | ||
532 | * a marker in r2 (now r2_bank since SR.RB changed), which we check | ||
533 | * to determine the exception type. For all other exceptions, we | ||
534 | * forcibly read EXPEVT from memory and fix up the jump address, in | ||
535 | * the interrupt exception case we jump to do_IRQ() and defer the | ||
536 | * INTEVT read until there. As a bonus, we can also clean up the SR.RB | ||
537 | * checks that do_IRQ() was doing.. | ||
538 | */ | ||
539 | stc r2_bank, r8 | ||
540 | cmp/pz r8 | ||
541 | bf interrupt_exception | ||
542 | shlr2 r8 | ||
543 | shlr r8 | ||
544 | mov.l 4f, r9 | ||
545 | add r8, r9 | ||
546 | mov.l @r9, r9 | ||
547 | jmp @r9 | ||
548 | nop | ||
549 | rts | 546 | rts |
550 | nop | 547 | mov.l r0, @-r15 |
551 | 548 | ||
549 | ! | ||
550 | ! 0x600: Interrupt / NMI vector | ||
551 | ! | ||
552 | .balign 512,0,512 | ||
553 | ENTRY(handle_interrupt) | ||
554 | #if defined(CONFIG_KGDB) | ||
555 | mov.l 2f, k2 | ||
556 | ! Debounce (filter nested NMI) | ||
557 | mov.l @k2, k0 | ||
558 | mov.l 9f, k1 | ||
559 | cmp/eq k1, k0 | ||
560 | bf 11f | ||
561 | mov.l 10f, k1 | ||
562 | tas.b @k1 | ||
563 | bt 11f | ||
564 | rte | ||
565 | nop | ||
552 | .align 2 | 566 | .align 2 |
553 | 1: .long 0x00001000 ! DSP=1 | 567 | 9: .long NMI_VEC |
554 | 2: .long 0x000080f0 ! FD=1, IMASK=15 | 568 | 10: .long in_nmi |
555 | 3: .long 0xcfffffff ! RB=0, BL=0 | 569 | 11: |
556 | 4: .long exception_handling_table | 570 | #endif /* defined(CONFIG_KGDB) */ |
571 | sts pr, k3 ! save original pr value in k3 | ||
572 | mova exception_data, k0 | ||
557 | 573 | ||
558 | interrupt_exception: | 574 | ! Setup stack and save DSP context (k0 contains original r15 on return) |
559 | mov.l 1f, r9 | 575 | bsr prepare_stack_save_dsp |
576 | PREF(k0) | ||
577 | |||
578 | ! Save registers / Switch to bank 0 | ||
579 | mov.l 1f, k4 ! SR bits to clear in k4 | ||
580 | bsr save_regs ! needs original pr value in k3 | ||
581 | mov #-1, k2 ! default vector kept in k2 | ||
582 | |||
583 | ! Setup return address and jump to do_IRQ | ||
584 | mov.l 4f, r9 ! fetch return address | ||
585 | lds r9, pr ! put return address in pr | ||
560 | mov.l 2f, r4 | 586 | mov.l 2f, r4 |
561 | mov.l @r4, r4 | 587 | mov.l 3f, r9 |
588 | mov.l @r4, r4 ! pass INTEVT vector as arg0 | ||
562 | jmp @r9 | 589 | jmp @r9 |
563 | mov r15, r5 | 590 | mov r15, r5 ! pass saved registers as arg1 |
564 | rts | ||
565 | nop | ||
566 | |||
567 | .align 2 | ||
568 | 1: .long do_IRQ | ||
569 | 2: .long INTEVT | ||
570 | 591 | ||
571 | .align 2 | ||
572 | ENTRY(exception_none) | 592 | ENTRY(exception_none) |
573 | rts | 593 | rts |
574 | nop | 594 | nop |
595 | |||
596 | .align L1_CACHE_SHIFT | ||
597 | exception_data: | ||
598 | 0: .long 0x000080f0 ! FD=1, IMASK=15 | ||
599 | 1: .long 0xcfffffff ! RB=0, BL=0 | ||
600 | 2: .long INTEVT | ||
601 | 3: .long do_IRQ | ||
602 | 4: .long ret_from_irq | ||
603 | 5: .long EXPEVT | ||
604 | 6: .long exception_handling_table | ||
605 | 7: .long ret_from_exception | ||
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7705.c b/arch/sh/kernel/cpu/sh3/setup-sh7705.c index 6468ae86b944..63b67badd67e 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7705.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7705.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SH7705 Setup | 2 | * SH7705 Setup |
3 | * | 3 | * |
4 | * Copyright (C) 2006, 2007 Paul Mundt | 4 | * Copyright (C) 2006 - 2009 Paul Mundt |
5 | * Copyright (C) 2007 Nobuhiro Iwamatsu | 5 | * Copyright (C) 2007 Nobuhiro Iwamatsu |
6 | * | 6 | * |
7 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
@@ -21,51 +21,36 @@ enum { | |||
21 | /* interrupt sources */ | 21 | /* interrupt sources */ |
22 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, | 22 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, |
23 | PINT07, PINT815, | 23 | PINT07, PINT815, |
24 | DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3, | 24 | |
25 | SCIF0_ERI, SCIF0_RXI, SCIF0_TXI, | 25 | DMAC, SCIF0, SCIF2, ADC_ADI, USB, |
26 | SCIF2_ERI, SCIF2_RXI, SCIF2_TXI, | 26 | |
27 | ADC_ADI, | ||
28 | USB_USI0, USB_USI1, | ||
29 | TPU0, TPU1, TPU2, TPU3, | 27 | TPU0, TPU1, TPU2, TPU3, |
30 | TMU0, TMU1, TMU2_TUNI, TMU2_TICPI, | 28 | TMU0, TMU1, TMU2, |
31 | RTC_ATI, RTC_PRI, RTC_CUI, | ||
32 | WDT, | ||
33 | REF_RCMI, | ||
34 | 29 | ||
35 | /* interrupt groups */ | 30 | RTC, WDT, REF_RCMI, |
36 | RTC, TMU2, DMAC, USB, SCIF2, SCIF0, | ||
37 | }; | 31 | }; |
38 | 32 | ||
39 | static struct intc_vect vectors[] __initdata = { | 33 | static struct intc_vect vectors[] __initdata = { |
40 | /* IRQ0->5 are handled in setup-sh3.c */ | 34 | /* IRQ0->5 are handled in setup-sh3.c */ |
41 | INTC_VECT(PINT07, 0x700), INTC_VECT(PINT815, 0x720), | 35 | INTC_VECT(PINT07, 0x700), INTC_VECT(PINT815, 0x720), |
42 | INTC_VECT(DMAC_DEI0, 0x800), INTC_VECT(DMAC_DEI1, 0x820), | 36 | INTC_VECT(DMAC, 0x800), INTC_VECT(DMAC, 0x820), |
43 | INTC_VECT(DMAC_DEI2, 0x840), INTC_VECT(DMAC_DEI3, 0x860), | 37 | INTC_VECT(DMAC, 0x840), INTC_VECT(DMAC, 0x860), |
44 | INTC_VECT(SCIF0_ERI, 0x880), INTC_VECT(SCIF0_RXI, 0x8a0), | 38 | INTC_VECT(SCIF0, 0x880), INTC_VECT(SCIF0, 0x8a0), |
45 | INTC_VECT(SCIF0_TXI, 0x8e0), | 39 | INTC_VECT(SCIF0, 0x8e0), |
46 | INTC_VECT(SCIF2_ERI, 0x900), INTC_VECT(SCIF2_RXI, 0x920), | 40 | INTC_VECT(SCIF2, 0x900), INTC_VECT(SCIF2, 0x920), |
47 | INTC_VECT(SCIF2_TXI, 0x960), | 41 | INTC_VECT(SCIF2, 0x960), |
48 | INTC_VECT(ADC_ADI, 0x980), | 42 | INTC_VECT(ADC_ADI, 0x980), |
49 | INTC_VECT(USB_USI0, 0xa20), INTC_VECT(USB_USI1, 0xa40), | 43 | INTC_VECT(USB, 0xa20), INTC_VECT(USB, 0xa40), |
50 | INTC_VECT(TPU0, 0xc00), INTC_VECT(TPU1, 0xc20), | 44 | INTC_VECT(TPU0, 0xc00), INTC_VECT(TPU1, 0xc20), |
51 | INTC_VECT(TPU2, 0xc80), INTC_VECT(TPU3, 0xca0), | 45 | INTC_VECT(TPU2, 0xc80), INTC_VECT(TPU3, 0xca0), |
52 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | 46 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
53 | INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460), | 47 | INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2, 0x460), |
54 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | 48 | INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), |
55 | INTC_VECT(RTC_CUI, 0x4c0), | 49 | INTC_VECT(RTC, 0x4c0), |
56 | INTC_VECT(WDT, 0x560), | 50 | INTC_VECT(WDT, 0x560), |
57 | INTC_VECT(REF_RCMI, 0x580), | 51 | INTC_VECT(REF_RCMI, 0x580), |
58 | }; | 52 | }; |
59 | 53 | ||
60 | static struct intc_group groups[] __initdata = { | ||
61 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
62 | INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI), | ||
63 | INTC_GROUP(DMAC, DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3), | ||
64 | INTC_GROUP(USB, USB_USI0, USB_USI1), | ||
65 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_TXI), | ||
66 | INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_TXI), | ||
67 | }; | ||
68 | |||
69 | static struct intc_prio_reg prio_registers[] __initdata = { | 54 | static struct intc_prio_reg prio_registers[] __initdata = { |
70 | { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, | 55 | { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, |
71 | { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF_RCMI, 0, 0 } }, | 56 | { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF_RCMI, 0, 0 } }, |
@@ -78,7 +63,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
78 | 63 | ||
79 | }; | 64 | }; |
80 | 65 | ||
81 | static DECLARE_INTC_DESC(intc_desc, "sh7705", vectors, groups, | 66 | static DECLARE_INTC_DESC(intc_desc, "sh7705", vectors, NULL, |
82 | NULL, prio_registers, NULL); | 67 | NULL, prio_registers, NULL); |
83 | 68 | ||
84 | static struct plat_sci_port sci_platform_data[] = { | 69 | static struct plat_sci_port sci_platform_data[] = { |
@@ -86,12 +71,12 @@ static struct plat_sci_port sci_platform_data[] = { | |||
86 | .mapbase = 0xa4410000, | 71 | .mapbase = 0xa4410000, |
87 | .flags = UPF_BOOT_AUTOCONF, | 72 | .flags = UPF_BOOT_AUTOCONF, |
88 | .type = PORT_SCIF, | 73 | .type = PORT_SCIF, |
89 | .irqs = { 56, 57, 59 }, | 74 | .irqs = { 56, 56, 56 }, |
90 | }, { | 75 | }, { |
91 | .mapbase = 0xa4400000, | 76 | .mapbase = 0xa4400000, |
92 | .flags = UPF_BOOT_AUTOCONF, | 77 | .flags = UPF_BOOT_AUTOCONF, |
93 | .type = PORT_SCIF, | 78 | .type = PORT_SCIF, |
94 | .irqs = { 52, 53, 55 }, | 79 | .irqs = { 52, 52, 52 }, |
95 | }, { | 80 | }, { |
96 | .flags = 0, | 81 | .flags = 0, |
97 | } | 82 | } |
@@ -115,14 +100,6 @@ static struct resource rtc_resources[] = { | |||
115 | .start = 20, | 100 | .start = 20, |
116 | .flags = IORESOURCE_IRQ, | 101 | .flags = IORESOURCE_IRQ, |
117 | }, | 102 | }, |
118 | [2] = { | ||
119 | .start = 21, | ||
120 | .flags = IORESOURCE_IRQ, | ||
121 | }, | ||
122 | [3] = { | ||
123 | .start = 22, | ||
124 | .flags = IORESOURCE_IRQ, | ||
125 | }, | ||
126 | }; | 103 | }; |
127 | 104 | ||
128 | static struct sh_rtc_platform_info rtc_info = { | 105 | static struct sh_rtc_platform_info rtc_info = { |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh770x.c b/arch/sh/kernel/cpu/sh3/setup-sh770x.c index 93c55e2ed952..a74f960b5e79 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh770x.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh770x.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * SH3 Setup code for SH7706, SH7707, SH7708, SH7709 | 2 | * SH3 Setup code for SH7706, SH7707, SH7708, SH7709 |
3 | * | 3 | * |
4 | * Copyright (C) 2007 Magnus Damm | 4 | * Copyright (C) 2007 Magnus Damm |
5 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | 6 | * |
6 | * Based on setup-sh7709.c | 7 | * Based on setup-sh7709.c |
7 | * | 8 | * |
@@ -24,46 +25,37 @@ enum { | |||
24 | /* interrupt sources */ | 25 | /* interrupt sources */ |
25 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, | 26 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, |
26 | PINT07, PINT815, | 27 | PINT07, PINT815, |
27 | DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3, | 28 | DMAC, SCIF0, SCIF2, SCI, ADC_ADI, |
28 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | ||
29 | SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI, | ||
30 | SCI_ERI, SCI_RXI, SCI_TXI, SCI_TEI, | ||
31 | ADC_ADI, | ||
32 | LCDC, PCC0, PCC1, | 29 | LCDC, PCC0, PCC1, |
33 | TMU0, TMU1, TMU2_TUNI, TMU2_TICPI, | 30 | TMU0, TMU1, TMU2, |
34 | RTC_ATI, RTC_PRI, RTC_CUI, | 31 | RTC, WDT, REF, |
35 | WDT, | ||
36 | REF_RCMI, REF_ROVI, | ||
37 | |||
38 | /* interrupt groups */ | ||
39 | RTC, REF, TMU2, DMAC, SCI, SCIF2, SCIF0, | ||
40 | }; | 32 | }; |
41 | 33 | ||
42 | static struct intc_vect vectors[] __initdata = { | 34 | static struct intc_vect vectors[] __initdata = { |
43 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | 35 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
44 | INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460), | 36 | INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2, 0x460), |
45 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | 37 | INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), |
46 | INTC_VECT(RTC_CUI, 0x4c0), | 38 | INTC_VECT(RTC, 0x4c0), |
47 | INTC_VECT(SCI_ERI, 0x4e0), INTC_VECT(SCI_RXI, 0x500), | 39 | INTC_VECT(SCI, 0x4e0), INTC_VECT(SCI, 0x500), |
48 | INTC_VECT(SCI_TXI, 0x520), INTC_VECT(SCI_TEI, 0x540), | 40 | INTC_VECT(SCI, 0x520), INTC_VECT(SCI, 0x540), |
49 | INTC_VECT(WDT, 0x560), | 41 | INTC_VECT(WDT, 0x560), |
50 | INTC_VECT(REF_RCMI, 0x580), | 42 | INTC_VECT(REF, 0x580), |
51 | INTC_VECT(REF_ROVI, 0x5a0), | 43 | INTC_VECT(REF, 0x5a0), |
52 | #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \ | 44 | #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \ |
53 | defined(CONFIG_CPU_SUBTYPE_SH7707) || \ | 45 | defined(CONFIG_CPU_SUBTYPE_SH7707) || \ |
54 | defined(CONFIG_CPU_SUBTYPE_SH7709) | 46 | defined(CONFIG_CPU_SUBTYPE_SH7709) |
55 | /* IRQ0->5 are handled in setup-sh3.c */ | 47 | /* IRQ0->5 are handled in setup-sh3.c */ |
56 | INTC_VECT(DMAC_DEI0, 0x800), INTC_VECT(DMAC_DEI1, 0x820), | 48 | INTC_VECT(DMAC, 0x800), INTC_VECT(DMAC, 0x820), |
57 | INTC_VECT(DMAC_DEI2, 0x840), INTC_VECT(DMAC_DEI3, 0x860), | 49 | INTC_VECT(DMAC, 0x840), INTC_VECT(DMAC, 0x860), |
58 | INTC_VECT(ADC_ADI, 0x980), | 50 | INTC_VECT(ADC_ADI, 0x980), |
59 | INTC_VECT(SCIF2_ERI, 0x900), INTC_VECT(SCIF2_RXI, 0x920), | 51 | INTC_VECT(SCIF2, 0x900), INTC_VECT(SCIF2, 0x920), |
60 | INTC_VECT(SCIF2_BRI, 0x940), INTC_VECT(SCIF2_TXI, 0x960), | 52 | INTC_VECT(SCIF2, 0x940), INTC_VECT(SCIF2, 0x960), |
61 | #endif | 53 | #endif |
62 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \ | 54 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \ |
63 | defined(CONFIG_CPU_SUBTYPE_SH7709) | 55 | defined(CONFIG_CPU_SUBTYPE_SH7709) |
64 | INTC_VECT(PINT07, 0x700), INTC_VECT(PINT815, 0x720), | 56 | INTC_VECT(PINT07, 0x700), INTC_VECT(PINT815, 0x720), |
65 | INTC_VECT(SCIF0_ERI, 0x880), INTC_VECT(SCIF0_RXI, 0x8a0), | 57 | INTC_VECT(SCIF0, 0x880), INTC_VECT(SCIF0, 0x8a0), |
66 | INTC_VECT(SCIF0_BRI, 0x8c0), INTC_VECT(SCIF0_TXI, 0x8e0), | 58 | INTC_VECT(SCIF0, 0x8c0), INTC_VECT(SCIF0, 0x8e0), |
67 | #endif | 59 | #endif |
68 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) | 60 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) |
69 | INTC_VECT(LCDC, 0x9a0), | 61 | INTC_VECT(LCDC, 0x9a0), |
@@ -71,16 +63,6 @@ static struct intc_vect vectors[] __initdata = { | |||
71 | #endif | 63 | #endif |
72 | }; | 64 | }; |
73 | 65 | ||
74 | static struct intc_group groups[] __initdata = { | ||
75 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
76 | INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI), | ||
77 | INTC_GROUP(REF, REF_RCMI, REF_ROVI), | ||
78 | INTC_GROUP(DMAC, DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3), | ||
79 | INTC_GROUP(SCI, SCI_ERI, SCI_RXI, SCI_TXI, SCI_TEI), | ||
80 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
81 | INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI), | ||
82 | }; | ||
83 | |||
84 | static struct intc_prio_reg prio_registers[] __initdata = { | 66 | static struct intc_prio_reg prio_registers[] __initdata = { |
85 | { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, | 67 | { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, |
86 | { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, SCI, 0 } }, | 68 | { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, SCI, 0 } }, |
@@ -101,7 +83,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
101 | #endif | 83 | #endif |
102 | }; | 84 | }; |
103 | 85 | ||
104 | static DECLARE_INTC_DESC(intc_desc, "sh770x", vectors, groups, | 86 | static DECLARE_INTC_DESC(intc_desc, "sh770x", vectors, NULL, |
105 | NULL, prio_registers, NULL); | 87 | NULL, prio_registers, NULL); |
106 | 88 | ||
107 | static struct resource rtc_resources[] = { | 89 | static struct resource rtc_resources[] = { |
@@ -111,14 +93,6 @@ static struct resource rtc_resources[] = { | |||
111 | .flags = IORESOURCE_IO, | 93 | .flags = IORESOURCE_IO, |
112 | }, | 94 | }, |
113 | [1] = { | 95 | [1] = { |
114 | .start = 21, | ||
115 | .flags = IORESOURCE_IRQ, | ||
116 | }, | ||
117 | [2] = { | ||
118 | .start = 22, | ||
119 | .flags = IORESOURCE_IRQ, | ||
120 | }, | ||
121 | [3] = { | ||
122 | .start = 20, | 96 | .start = 20, |
123 | .flags = IORESOURCE_IRQ, | 97 | .flags = IORESOURCE_IRQ, |
124 | }, | 98 | }, |
@@ -136,7 +110,7 @@ static struct plat_sci_port sci_platform_data[] = { | |||
136 | .mapbase = 0xfffffe80, | 110 | .mapbase = 0xfffffe80, |
137 | .flags = UPF_BOOT_AUTOCONF, | 111 | .flags = UPF_BOOT_AUTOCONF, |
138 | .type = PORT_SCI, | 112 | .type = PORT_SCI, |
139 | .irqs = { 23, 24, 25, 0 }, | 113 | .irqs = { 23, 23, 23, 0 }, |
140 | }, | 114 | }, |
141 | #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \ | 115 | #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \ |
142 | defined(CONFIG_CPU_SUBTYPE_SH7707) || \ | 116 | defined(CONFIG_CPU_SUBTYPE_SH7707) || \ |
@@ -145,7 +119,7 @@ static struct plat_sci_port sci_platform_data[] = { | |||
145 | .mapbase = 0xa4000150, | 119 | .mapbase = 0xa4000150, |
146 | .flags = UPF_BOOT_AUTOCONF, | 120 | .flags = UPF_BOOT_AUTOCONF, |
147 | .type = PORT_SCIF, | 121 | .type = PORT_SCIF, |
148 | .irqs = { 56, 57, 59, 58 }, | 122 | .irqs = { 56, 56, 56, 56 }, |
149 | }, | 123 | }, |
150 | #endif | 124 | #endif |
151 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \ | 125 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \ |
@@ -154,7 +128,7 @@ static struct plat_sci_port sci_platform_data[] = { | |||
154 | .mapbase = 0xa4000140, | 128 | .mapbase = 0xa4000140, |
155 | .flags = UPF_BOOT_AUTOCONF, | 129 | .flags = UPF_BOOT_AUTOCONF, |
156 | .type = PORT_IRDA, | 130 | .type = PORT_IRDA, |
157 | .irqs = { 52, 53, 55, 54 }, | 131 | .irqs = { 52, 52, 52, 52 }, |
158 | }, | 132 | }, |
159 | #endif | 133 | #endif |
160 | { | 134 | { |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7710.c b/arch/sh/kernel/cpu/sh3/setup-sh7710.c index 77eee481de47..335098b66e2f 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7710.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7710.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SH3 Setup code for SH7710, SH7712 | 2 | * SH3 Setup code for SH7710, SH7712 |
3 | * | 3 | * |
4 | * Copyright (C) 2006, 2007 Paul Mundt | 4 | * Copyright (C) 2006 - 2009 Paul Mundt |
5 | * Copyright (C) 2007 Nobuhiro Iwamatsu | 5 | * Copyright (C) 2007 Nobuhiro Iwamatsu |
6 | * | 6 | * |
7 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
@@ -20,59 +20,40 @@ enum { | |||
20 | 20 | ||
21 | /* interrupt sources */ | 21 | /* interrupt sources */ |
22 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, | 22 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, |
23 | DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3, | 23 | DMAC1, SCIF0, SCIF1, DMAC2, IPSEC, |
24 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | ||
25 | SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, | ||
26 | DMAC_DEI4, DMAC_DEI5, | ||
27 | IPSEC, | ||
28 | EDMAC0, EDMAC1, EDMAC2, | 24 | EDMAC0, EDMAC1, EDMAC2, |
29 | SIOF0_ERI, SIOF0_TXI, SIOF0_RXI, SIOF0_CCI, | 25 | SIOF0, SIOF1, |
30 | SIOF1_ERI, SIOF1_TXI, SIOF1_RXI, SIOF1_CCI, | ||
31 | TMU0, TMU1, TMU2, | ||
32 | RTC_ATI, RTC_PRI, RTC_CUI, | ||
33 | WDT, | ||
34 | REF, | ||
35 | 26 | ||
36 | /* interrupt groups */ | 27 | TMU0, TMU1, TMU2, |
37 | RTC, DMAC1, SCIF0, SCIF1, DMAC2, SIOF0, SIOF1, | 28 | RTC, WDT, REF, |
38 | }; | 29 | }; |
39 | 30 | ||
40 | static struct intc_vect vectors[] __initdata = { | 31 | static struct intc_vect vectors[] __initdata = { |
41 | /* IRQ0->5 are handled in setup-sh3.c */ | 32 | /* IRQ0->5 are handled in setup-sh3.c */ |
42 | INTC_VECT(DMAC_DEI0, 0x800), INTC_VECT(DMAC_DEI1, 0x820), | 33 | INTC_VECT(DMAC1, 0x800), INTC_VECT(DMAC1, 0x820), |
43 | INTC_VECT(DMAC_DEI2, 0x840), INTC_VECT(DMAC_DEI3, 0x860), | 34 | INTC_VECT(DMAC1, 0x840), INTC_VECT(DMAC1, 0x860), |
44 | INTC_VECT(SCIF0_ERI, 0x880), INTC_VECT(SCIF0_RXI, 0x8a0), | 35 | INTC_VECT(SCIF0, 0x880), INTC_VECT(SCIF0, 0x8a0), |
45 | INTC_VECT(SCIF0_BRI, 0x8c0), INTC_VECT(SCIF0_TXI, 0x8e0), | 36 | INTC_VECT(SCIF0, 0x8c0), INTC_VECT(SCIF0, 0x8e0), |
46 | INTC_VECT(SCIF1_ERI, 0x900), INTC_VECT(SCIF1_RXI, 0x920), | 37 | INTC_VECT(SCIF1, 0x900), INTC_VECT(SCIF1, 0x920), |
47 | INTC_VECT(SCIF1_BRI, 0x940), INTC_VECT(SCIF1_TXI, 0x960), | 38 | INTC_VECT(SCIF1, 0x940), INTC_VECT(SCIF1, 0x960), |
48 | INTC_VECT(DMAC_DEI4, 0xb80), INTC_VECT(DMAC_DEI5, 0xba0), | 39 | INTC_VECT(DMAC2, 0xb80), INTC_VECT(DMAC2, 0xba0), |
49 | #ifdef CONFIG_CPU_SUBTYPE_SH7710 | 40 | #ifdef CONFIG_CPU_SUBTYPE_SH7710 |
50 | INTC_VECT(IPSEC, 0xbe0), | 41 | INTC_VECT(IPSEC, 0xbe0), |
51 | #endif | 42 | #endif |
52 | INTC_VECT(EDMAC0, 0xc00), INTC_VECT(EDMAC1, 0xc20), | 43 | INTC_VECT(EDMAC0, 0xc00), INTC_VECT(EDMAC1, 0xc20), |
53 | INTC_VECT(EDMAC2, 0xc40), | 44 | INTC_VECT(EDMAC2, 0xc40), |
54 | INTC_VECT(SIOF0_ERI, 0xe00), INTC_VECT(SIOF0_TXI, 0xe20), | 45 | INTC_VECT(SIOF0, 0xe00), INTC_VECT(SIOF0, 0xe20), |
55 | INTC_VECT(SIOF0_RXI, 0xe40), INTC_VECT(SIOF0_CCI, 0xe60), | 46 | INTC_VECT(SIOF0, 0xe40), INTC_VECT(SIOF0, 0xe60), |
56 | INTC_VECT(SIOF1_ERI, 0xe80), INTC_VECT(SIOF1_TXI, 0xea0), | 47 | INTC_VECT(SIOF1, 0xe80), INTC_VECT(SIOF1, 0xea0), |
57 | INTC_VECT(SIOF1_RXI, 0xec0), INTC_VECT(SIOF1_CCI, 0xee0), | 48 | INTC_VECT(SIOF1, 0xec0), INTC_VECT(SIOF1, 0xee0), |
58 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | 49 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
59 | INTC_VECT(TMU2, 0x440), | 50 | INTC_VECT(TMU2, 0x440), |
60 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | 51 | INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), |
61 | INTC_VECT(RTC_CUI, 0x4c0), | 52 | INTC_VECT(RTC, 0x4c0), |
62 | INTC_VECT(WDT, 0x560), | 53 | INTC_VECT(WDT, 0x560), |
63 | INTC_VECT(REF, 0x580), | 54 | INTC_VECT(REF, 0x580), |
64 | }; | 55 | }; |
65 | 56 | ||
66 | static struct intc_group groups[] __initdata = { | ||
67 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
68 | INTC_GROUP(DMAC1, DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3), | ||
69 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
70 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | ||
71 | INTC_GROUP(DMAC2, DMAC_DEI4, DMAC_DEI5), | ||
72 | INTC_GROUP(SIOF0, SIOF0_ERI, SIOF0_TXI, SIOF0_RXI, SIOF0_CCI), | ||
73 | INTC_GROUP(SIOF1, SIOF1_ERI, SIOF1_TXI, SIOF1_RXI, SIOF1_CCI), | ||
74 | }; | ||
75 | |||
76 | static struct intc_prio_reg prio_registers[] __initdata = { | 57 | static struct intc_prio_reg prio_registers[] __initdata = { |
77 | { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, | 58 | { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, |
78 | { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, 0, 0 } }, | 59 | { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, 0, 0 } }, |
@@ -85,7 +66,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
85 | { 0xa4080006, 0, 16, 4, /* IPRI */ { 0, 0, SIOF1 } }, | 66 | { 0xa4080006, 0, 16, 4, /* IPRI */ { 0, 0, SIOF1 } }, |
86 | }; | 67 | }; |
87 | 68 | ||
88 | static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, groups, | 69 | static DECLARE_INTC_DESC(intc_desc, "sh7710", vectors, NULL, |
89 | NULL, prio_registers, NULL); | 70 | NULL, prio_registers, NULL); |
90 | 71 | ||
91 | static struct resource rtc_resources[] = { | 72 | static struct resource rtc_resources[] = { |
@@ -98,14 +79,6 @@ static struct resource rtc_resources[] = { | |||
98 | .start = 20, | 79 | .start = 20, |
99 | .flags = IORESOURCE_IRQ, | 80 | .flags = IORESOURCE_IRQ, |
100 | }, | 81 | }, |
101 | [2] = { | ||
102 | .start = 21, | ||
103 | .flags = IORESOURCE_IRQ, | ||
104 | }, | ||
105 | [3] = { | ||
106 | .start = 22, | ||
107 | .flags = IORESOURCE_IRQ, | ||
108 | }, | ||
109 | }; | 82 | }; |
110 | 83 | ||
111 | static struct sh_rtc_platform_info rtc_info = { | 84 | static struct sh_rtc_platform_info rtc_info = { |
@@ -127,12 +100,12 @@ static struct plat_sci_port sci_platform_data[] = { | |||
127 | .mapbase = 0xa4400000, | 100 | .mapbase = 0xa4400000, |
128 | .flags = UPF_BOOT_AUTOCONF, | 101 | .flags = UPF_BOOT_AUTOCONF, |
129 | .type = PORT_SCIF, | 102 | .type = PORT_SCIF, |
130 | .irqs = { 52, 53, 55, 54 }, | 103 | .irqs = { 52, 52, 52, 52 }, |
131 | }, { | 104 | }, { |
132 | .mapbase = 0xa4410000, | 105 | .mapbase = 0xa4410000, |
133 | .flags = UPF_BOOT_AUTOCONF, | 106 | .flags = UPF_BOOT_AUTOCONF, |
134 | .type = PORT_SCIF, | 107 | .type = PORT_SCIF, |
135 | .irqs = { 56, 57, 59, 58 }, | 108 | .irqs = { 56, 56, 56, 56 }, |
136 | }, { | 109 | }, { |
137 | 110 | ||
138 | .flags = 0, | 111 | .flags = 0, |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7720.c b/arch/sh/kernel/cpu/sh3/setup-sh7720.c index f807a21b066c..003874a2fd2a 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7720.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7720.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * SH7720 Setup | 2 | * SH7720 Setup |
3 | * | 3 | * |
4 | * Copyright (C) 2007 Markus Brunner, Mark Jonas | 4 | * Copyright (C) 2007 Markus Brunner, Mark Jonas |
5 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | 6 | * |
6 | * Based on arch/sh/kernel/cpu/sh4/setup-sh7750.c: | 7 | * Based on arch/sh/kernel/cpu/sh4/setup-sh7750.c: |
7 | * | 8 | * |
@@ -26,17 +27,7 @@ static struct resource rtc_resources[] = { | |||
26 | .flags = IORESOURCE_IO, | 27 | .flags = IORESOURCE_IO, |
27 | }, | 28 | }, |
28 | [1] = { | 29 | [1] = { |
29 | /* Period IRQ */ | 30 | /* Shared Period/Carry/Alarm IRQ */ |
30 | .start = 21, | ||
31 | .flags = IORESOURCE_IRQ, | ||
32 | }, | ||
33 | [2] = { | ||
34 | /* Carry IRQ */ | ||
35 | .start = 22, | ||
36 | .flags = IORESOURCE_IRQ, | ||
37 | }, | ||
38 | [3] = { | ||
39 | /* Alarm IRQ */ | ||
40 | .start = 20, | 31 | .start = 20, |
41 | .flags = IORESOURCE_IRQ, | 32 | .flags = IORESOURCE_IRQ, |
42 | }, | 33 | }, |
@@ -150,62 +141,49 @@ enum { | |||
150 | UNUSED = 0, | 141 | UNUSED = 0, |
151 | 142 | ||
152 | /* interrupt sources */ | 143 | /* interrupt sources */ |
153 | TMU0, TMU1, TMU2, RTC_ATI, RTC_PRI, RTC_CUI, | 144 | TMU0, TMU1, TMU2, RTC, |
154 | WDT, REF_RCMI, SIM_ERI, SIM_RXI, SIM_TXI, SIM_TEND, | 145 | WDT, REF_RCMI, SIM, |
155 | IRQ0, IRQ1, IRQ2, IRQ3, | 146 | IRQ0, IRQ1, IRQ2, IRQ3, |
156 | USBF_SPD, TMU_SUNI, IRQ5, IRQ4, | 147 | USBF_SPD, TMU_SUNI, IRQ5, IRQ4, |
157 | DMAC1_DEI0, DMAC1_DEI1, DMAC1_DEI2, DMAC1_DEI3, LCDC, SSL, | 148 | DMAC1, LCDC, SSL, |
158 | ADC, DMAC2_DEI4, DMAC2_DEI5, USBFI0, USBFI1, CMT, | 149 | ADC, DMAC2, USBFI, CMT, |
159 | SCIF0, SCIF1, | 150 | SCIF0, SCIF1, |
160 | PINT07, PINT815, TPU0, TPU1, TPU2, TPU3, IIC, | 151 | PINT07, PINT815, TPU, IIC, |
161 | SIOF0, SIOF1, MMCI0, MMCI1, MMCI2, MMCI3, PCC, | 152 | SIOF0, SIOF1, MMC, PCC, |
162 | USBHI, AFEIF, | 153 | USBHI, AFEIF, |
163 | H_UDI, | 154 | H_UDI, |
164 | /* interrupt groups */ | ||
165 | TMU, RTC, SIM, DMAC1, USBFI, DMAC2, USB, TPU, MMC, | ||
166 | }; | 155 | }; |
167 | 156 | ||
168 | static struct intc_vect vectors[] __initdata = { | 157 | static struct intc_vect vectors[] __initdata = { |
169 | /* IRQ0->5 are handled in setup-sh3.c */ | 158 | /* IRQ0->5 are handled in setup-sh3.c */ |
170 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | 159 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
171 | INTC_VECT(TMU2, 0x440), INTC_VECT(RTC_ATI, 0x480), | 160 | INTC_VECT(TMU2, 0x440), INTC_VECT(RTC, 0x480), |
172 | INTC_VECT(RTC_PRI, 0x4a0), INTC_VECT(RTC_CUI, 0x4c0), | 161 | INTC_VECT(RTC, 0x4a0), INTC_VECT(RTC, 0x4c0), |
173 | INTC_VECT(SIM_ERI, 0x4e0), INTC_VECT(SIM_RXI, 0x500), | 162 | INTC_VECT(SIM, 0x4e0), INTC_VECT(SIM, 0x500), |
174 | INTC_VECT(SIM_TXI, 0x520), INTC_VECT(SIM_TEND, 0x540), | 163 | INTC_VECT(SIM, 0x520), INTC_VECT(SIM, 0x540), |
175 | INTC_VECT(WDT, 0x560), INTC_VECT(REF_RCMI, 0x580), | 164 | INTC_VECT(WDT, 0x560), INTC_VECT(REF_RCMI, 0x580), |
176 | /* H_UDI cannot be masked */ INTC_VECT(TMU_SUNI, 0x6c0), | 165 | /* H_UDI cannot be masked */ INTC_VECT(TMU_SUNI, 0x6c0), |
177 | INTC_VECT(USBF_SPD, 0x6e0), INTC_VECT(DMAC1_DEI0, 0x800), | 166 | INTC_VECT(USBF_SPD, 0x6e0), INTC_VECT(DMAC1, 0x800), |
178 | INTC_VECT(DMAC1_DEI1, 0x820), INTC_VECT(DMAC1_DEI2, 0x840), | 167 | INTC_VECT(DMAC1, 0x820), INTC_VECT(DMAC1, 0x840), |
179 | INTC_VECT(DMAC1_DEI3, 0x860), INTC_VECT(LCDC, 0x900), | 168 | INTC_VECT(DMAC1, 0x860), INTC_VECT(LCDC, 0x900), |
180 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) | 169 | #if defined(CONFIG_CPU_SUBTYPE_SH7720) |
181 | INTC_VECT(SSL, 0x980), | 170 | INTC_VECT(SSL, 0x980), |
182 | #endif | 171 | #endif |
183 | INTC_VECT(USBFI0, 0xa20), INTC_VECT(USBFI1, 0xa40), | 172 | INTC_VECT(USBFI, 0xa20), INTC_VECT(USBFI, 0xa40), |
184 | INTC_VECT(USBHI, 0xa60), | 173 | INTC_VECT(USBHI, 0xa60), |
185 | INTC_VECT(DMAC2_DEI4, 0xb80), INTC_VECT(DMAC2_DEI5, 0xba0), | 174 | INTC_VECT(DMAC2, 0xb80), INTC_VECT(DMAC2, 0xba0), |
186 | INTC_VECT(ADC, 0xbe0), INTC_VECT(SCIF0, 0xc00), | 175 | INTC_VECT(ADC, 0xbe0), INTC_VECT(SCIF0, 0xc00), |
187 | INTC_VECT(SCIF1, 0xc20), INTC_VECT(PINT07, 0xc80), | 176 | INTC_VECT(SCIF1, 0xc20), INTC_VECT(PINT07, 0xc80), |
188 | INTC_VECT(PINT815, 0xca0), INTC_VECT(SIOF0, 0xd00), | 177 | INTC_VECT(PINT815, 0xca0), INTC_VECT(SIOF0, 0xd00), |
189 | INTC_VECT(SIOF1, 0xd20), INTC_VECT(TPU0, 0xd80), | 178 | INTC_VECT(SIOF1, 0xd20), INTC_VECT(TPU, 0xd80), |
190 | INTC_VECT(TPU1, 0xda0), INTC_VECT(TPU2, 0xdc0), | 179 | INTC_VECT(TPU, 0xda0), INTC_VECT(TPU, 0xdc0), |
191 | INTC_VECT(TPU3, 0xde0), INTC_VECT(IIC, 0xe00), | 180 | INTC_VECT(TPU, 0xde0), INTC_VECT(IIC, 0xe00), |
192 | INTC_VECT(MMCI0, 0xe80), INTC_VECT(MMCI1, 0xea0), | 181 | INTC_VECT(MMC, 0xe80), INTC_VECT(MMC, 0xea0), |
193 | INTC_VECT(MMCI2, 0xec0), INTC_VECT(MMCI3, 0xee0), | 182 | INTC_VECT(MMC, 0xec0), INTC_VECT(MMC, 0xee0), |
194 | INTC_VECT(CMT, 0xf00), INTC_VECT(PCC, 0xf60), | 183 | INTC_VECT(CMT, 0xf00), INTC_VECT(PCC, 0xf60), |
195 | INTC_VECT(AFEIF, 0xfe0), | 184 | INTC_VECT(AFEIF, 0xfe0), |
196 | }; | 185 | }; |
197 | 186 | ||
198 | static struct intc_group groups[] __initdata = { | ||
199 | INTC_GROUP(TMU, TMU0, TMU1, TMU2), | ||
200 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
201 | INTC_GROUP(SIM, SIM_ERI, SIM_RXI, SIM_TXI, SIM_TEND), | ||
202 | INTC_GROUP(DMAC1, DMAC1_DEI0, DMAC1_DEI1, DMAC1_DEI2, DMAC1_DEI3), | ||
203 | INTC_GROUP(USBFI, USBFI0, USBFI1), | ||
204 | INTC_GROUP(DMAC2, DMAC2_DEI4, DMAC2_DEI5), | ||
205 | INTC_GROUP(TPU, TPU0, TPU1, TPU2, TPU3), | ||
206 | INTC_GROUP(MMC, MMCI0, MMCI1, MMCI2, MMCI3), | ||
207 | }; | ||
208 | |||
209 | static struct intc_prio_reg prio_registers[] __initdata = { | 187 | static struct intc_prio_reg prio_registers[] __initdata = { |
210 | { 0xA414FEE2UL, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, | 188 | { 0xA414FEE2UL, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } }, |
211 | { 0xA414FEE4UL, 0, 16, 4, /* IPRB */ { WDT, REF_RCMI, SIM, 0 } }, | 189 | { 0xA414FEE4UL, 0, 16, 4, /* IPRB */ { WDT, REF_RCMI, SIM, 0 } }, |
@@ -219,7 +197,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
219 | { 0xA4080008UL, 0, 16, 4, /* IPRJ */ { 0, USBHI, 0, AFEIF } }, | 197 | { 0xA4080008UL, 0, 16, 4, /* IPRJ */ { 0, USBHI, 0, AFEIF } }, |
220 | }; | 198 | }; |
221 | 199 | ||
222 | static DECLARE_INTC_DESC(intc_desc, "sh7720", vectors, groups, | 200 | static DECLARE_INTC_DESC(intc_desc, "sh7720", vectors, NULL, |
223 | NULL, prio_registers, NULL); | 201 | NULL, prio_registers, NULL); |
224 | 202 | ||
225 | void __init plat_irq_setup(void) | 203 | void __init plat_irq_setup(void) |
diff --git a/arch/sh/kernel/cpu/sh3/swsusp.S b/arch/sh/kernel/cpu/sh3/swsusp.S new file mode 100644 index 000000000000..01145426a2b8 --- /dev/null +++ b/arch/sh/kernel/cpu/sh3/swsusp.S | |||
@@ -0,0 +1,147 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/cpu/sh3/swsusp.S | ||
3 | * | ||
4 | * Copyright (C) 2009 Magnus Damm | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/sys.h> | ||
11 | #include <linux/errno.h> | ||
12 | #include <linux/linkage.h> | ||
13 | #include <asm/asm-offsets.h> | ||
14 | #include <asm/page.h> | ||
15 | |||
16 | #define k0 r0 | ||
17 | #define k1 r1 | ||
18 | #define k2 r2 | ||
19 | #define k3 r3 | ||
20 | #define k4 r4 | ||
21 | |||
22 | ! swsusp_arch_resume() | ||
23 | ! - copy restore_pblist pages | ||
24 | ! - restore registers from swsusp_arch_regs_cpu0 | ||
25 | |||
26 | ENTRY(swsusp_arch_resume) | ||
27 | mov.l 1f, r15 | ||
28 | mov.l 2f, r4 | ||
29 | mov.l @r4, r4 | ||
30 | |||
31 | swsusp_copy_loop: | ||
32 | mov r4, r0 | ||
33 | cmp/eq #0, r0 | ||
34 | bt swsusp_restore_regs | ||
35 | |||
36 | mov.l @(PBE_ADDRESS, r4), r2 | ||
37 | mov.l @(PBE_ORIG_ADDRESS, r4), r5 | ||
38 | |||
39 | mov #(PAGE_SIZE >> 10), r3 | ||
40 | shll8 r3 | ||
41 | shlr2 r3 /* PAGE_SIZE / 16 */ | ||
42 | swsusp_copy_page: | ||
43 | dt r3 | ||
44 | mov.l @r2+,r1 /* 16n+0 */ | ||
45 | mov.l r1,@r5 | ||
46 | add #4,r5 | ||
47 | mov.l @r2+,r1 /* 16n+4 */ | ||
48 | mov.l r1,@r5 | ||
49 | add #4,r5 | ||
50 | mov.l @r2+,r1 /* 16n+8 */ | ||
51 | mov.l r1,@r5 | ||
52 | add #4,r5 | ||
53 | mov.l @r2+,r1 /* 16n+12 */ | ||
54 | mov.l r1,@r5 | ||
55 | bf/s swsusp_copy_page | ||
56 | add #4,r5 | ||
57 | |||
58 | bra swsusp_copy_loop | ||
59 | mov.l @(PBE_NEXT, r4), r4 | ||
60 | |||
61 | swsusp_restore_regs: | ||
62 | ! BL=0: R7->R0 is bank0 | ||
63 | mov.l 3f, r8 | ||
64 | mov.l 4f, r5 | ||
65 | jsr @r5 | ||
66 | nop | ||
67 | |||
68 | ! BL=1: R7->R0 is bank1 | ||
69 | lds k2, pr | ||
70 | ldc k3, ssr | ||
71 | |||
72 | mov.l @r15+, r0 | ||
73 | mov.l @r15+, r1 | ||
74 | mov.l @r15+, r2 | ||
75 | mov.l @r15+, r3 | ||
76 | mov.l @r15+, r4 | ||
77 | mov.l @r15+, r5 | ||
78 | mov.l @r15+, r6 | ||
79 | mov.l @r15+, r7 | ||
80 | |||
81 | rte | ||
82 | nop | ||
83 | ! BL=0: R7->R0 is bank0 | ||
84 | |||
85 | .align 2 | ||
86 | 1: .long swsusp_arch_regs_cpu0 | ||
87 | 2: .long restore_pblist | ||
88 | 3: .long 0x20000000 ! RB=1 | ||
89 | 4: .long restore_regs | ||
90 | |||
91 | ! swsusp_arch_suspend() | ||
92 | ! - prepare pc for resume, return from function without swsusp_save on resume | ||
93 | ! - save registers in swsusp_arch_regs_cpu0 | ||
94 | ! - call swsusp_save write suspend image | ||
95 | |||
96 | ENTRY(swsusp_arch_suspend) | ||
97 | sts pr, r0 ! save pr in r0 | ||
98 | mov r15, r2 ! save sp in r2 | ||
99 | mov r8, r5 ! save r8 in r5 | ||
100 | stc sr, r1 | ||
101 | ldc r1, ssr ! save sr in ssr | ||
102 | mov.l 1f, r1 | ||
103 | ldc r1, spc ! setup pc value for resuming | ||
104 | mov.l 5f, r15 ! use swsusp_arch_regs_cpu0 as stack | ||
105 | mov.l 6f, r3 | ||
106 | add r3, r15 ! save from top of structure | ||
107 | |||
108 | ! BL=0: R7->R0 is bank0 | ||
109 | mov.l 2f, r3 ! get new SR value for bank1 | ||
110 | mov #0, r4 | ||
111 | mov.l 7f, r1 | ||
112 | jsr @r1 ! switch to bank1 and save bank1 r7->r0 | ||
113 | not r4, r4 | ||
114 | |||
115 | ! BL=1: R7->R0 is bank1 | ||
116 | stc r2_bank, k0 ! fetch old sp from r2_bank0 | ||
117 | mov.l 3f, k4 ! SR bits to clear in k4 | ||
118 | mov.l 8f, k1 | ||
119 | jsr @k1 ! switch to bank0 and save all regs | ||
120 | stc r0_bank, k3 ! fetch old pr from r0_bank0 | ||
121 | |||
122 | ! BL=0: R7->R0 is bank0 | ||
123 | mov r2, r15 ! restore old sp | ||
124 | mov r5, r8 ! restore old r8 | ||
125 | stc ssr, r1 | ||
126 | ldc r1, sr ! restore old sr | ||
127 | lds r0, pr ! restore old pr | ||
128 | mov.l 4f, r0 | ||
129 | jmp @r0 | ||
130 | nop | ||
131 | |||
132 | swsusp_call_save: | ||
133 | mov r2, r15 ! restore old sp | ||
134 | mov r5, r8 ! restore old r8 | ||
135 | lds r0, pr ! restore old pr | ||
136 | rts | ||
137 | mov #0, r0 | ||
138 | |||
139 | .align 2 | ||
140 | 1: .long swsusp_call_save | ||
141 | 2: .long 0x20000000 ! RB=1 | ||
142 | 3: .long 0xdfffffff ! RB=0 | ||
143 | 4: .long swsusp_save | ||
144 | 5: .long swsusp_arch_regs_cpu0 | ||
145 | 6: .long SWSUSP_ARCH_REGS_SIZE | ||
146 | 7: .long save_low_regs | ||
147 | 8: .long save_regs | ||
diff --git a/arch/sh/kernel/cpu/sh4/Makefile b/arch/sh/kernel/cpu/sh4/Makefile index d608557c7a3f..203b18347b83 100644 --- a/arch/sh/kernel/cpu/sh4/Makefile +++ b/arch/sh/kernel/cpu/sh4/Makefile | |||
@@ -5,6 +5,7 @@ | |||
5 | obj-y := probe.o common.o | 5 | obj-y := probe.o common.o |
6 | common-y += $(addprefix ../sh3/, entry.o ex.o) | 6 | common-y += $(addprefix ../sh3/, entry.o ex.o) |
7 | 7 | ||
8 | obj-$(CONFIG_HIBERNATION) += $(addprefix ../sh3/, swsusp.o) | ||
8 | obj-$(CONFIG_SH_FPU) += fpu.o softfloat.o | 9 | obj-$(CONFIG_SH_FPU) += fpu.o softfloat.o |
9 | obj-$(CONFIG_SH_STORE_QUEUES) += sq.o | 10 | obj-$(CONFIG_SH_STORE_QUEUES) += sq.o |
10 | 11 | ||
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index 2e42572b1b11..3d3a3c4425a9 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -129,6 +129,13 @@ int __init detect_cpu_and_cache_system(void) | |||
129 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER | | 129 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER | |
130 | CPU_HAS_LLSC; | 130 | CPU_HAS_LLSC; |
131 | break; | 131 | break; |
132 | case 0x4004: | ||
133 | boot_cpu_data.type = CPU_SH7786; | ||
134 | boot_cpu_data.icache.ways = 4; | ||
135 | boot_cpu_data.dcache.ways = 4; | ||
136 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER | | ||
137 | CPU_HAS_LLSC | CPU_HAS_PTEAEX; | ||
138 | break; | ||
132 | case 0x3008: | 139 | case 0x3008: |
133 | boot_cpu_data.icache.ways = 4; | 140 | boot_cpu_data.icache.ways = 4; |
134 | boot_cpu_data.dcache.ways = 4; | 141 | boot_cpu_data.dcache.ways = 4; |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index ec884039b914..a1c80d909cd6 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
@@ -21,17 +21,7 @@ static struct resource rtc_resources[] = { | |||
21 | .flags = IORESOURCE_IO, | 21 | .flags = IORESOURCE_IO, |
22 | }, | 22 | }, |
23 | [1] = { | 23 | [1] = { |
24 | /* Period IRQ */ | 24 | /* Shared Period/Carry/Alarm IRQ */ |
25 | .start = 21, | ||
26 | .flags = IORESOURCE_IRQ, | ||
27 | }, | ||
28 | [2] = { | ||
29 | /* Carry IRQ */ | ||
30 | .start = 22, | ||
31 | .flags = IORESOURCE_IRQ, | ||
32 | }, | ||
33 | [3] = { | ||
34 | /* Alarm IRQ */ | ||
35 | .start = 20, | 25 | .start = 20, |
36 | .flags = IORESOURCE_IRQ, | 26 | .flags = IORESOURCE_IRQ, |
37 | }, | 27 | }, |
@@ -50,13 +40,13 @@ static struct plat_sci_port sci_platform_data[] = { | |||
50 | .mapbase = 0xffe00000, | 40 | .mapbase = 0xffe00000, |
51 | .flags = UPF_BOOT_AUTOCONF, | 41 | .flags = UPF_BOOT_AUTOCONF, |
52 | .type = PORT_SCI, | 42 | .type = PORT_SCI, |
53 | .irqs = { 23, 24, 25, 0 }, | 43 | .irqs = { 23, 23, 23, 0 }, |
54 | }, { | 44 | }, { |
55 | #endif | 45 | #endif |
56 | .mapbase = 0xffe80000, | 46 | .mapbase = 0xffe80000, |
57 | .flags = UPF_BOOT_AUTOCONF, | 47 | .flags = UPF_BOOT_AUTOCONF, |
58 | .type = PORT_SCIF, | 48 | .type = PORT_SCIF, |
59 | .irqs = { 40, 41, 43, 42 }, | 49 | .irqs = { 40, 40, 40, 40 }, |
60 | }, { | 50 | }, { |
61 | .flags = 0, | 51 | .flags = 0, |
62 | } | 52 | } |
@@ -87,43 +77,27 @@ enum { | |||
87 | 77 | ||
88 | /* interrupt sources */ | 78 | /* interrupt sources */ |
89 | IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */ | 79 | IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */ |
90 | HUDI, GPIOI, | 80 | HUDI, GPIOI, DMAC, |
91 | DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, DMAC_DMTE3, | ||
92 | DMAC_DMTE4, DMAC_DMTE5, DMAC_DMTE6, DMAC_DMTE7, | ||
93 | DMAC_DMAE, | ||
94 | PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON, | 81 | PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON, |
95 | PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3, | 82 | PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3, |
96 | TMU3, TMU4, TMU0, TMU1, TMU2_TUNI, TMU2_TICPI, | 83 | TMU3, TMU4, TMU0, TMU1, TMU2, RTC, SCI1, SCIF, WDT, REF, |
97 | RTC_ATI, RTC_PRI, RTC_CUI, | ||
98 | SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI, | ||
99 | SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI, | ||
100 | WDT, | ||
101 | REF_RCMI, REF_ROVI, | ||
102 | 84 | ||
103 | /* interrupt groups */ | 85 | /* interrupt groups */ |
104 | DMAC, PCIC1, TMU2, RTC, SCI1, SCIF, REF, | 86 | PCIC1, |
105 | }; | 87 | }; |
106 | 88 | ||
107 | static struct intc_vect vectors[] __initdata = { | 89 | static struct intc_vect vectors[] __initdata = { |
108 | INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620), | 90 | INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620), |
109 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), | 91 | INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420), |
110 | INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460), | 92 | INTC_VECT(TMU2, 0x440), INTC_VECT(TMU2, 0x460), |
111 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | 93 | INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), |
112 | INTC_VECT(RTC_CUI, 0x4c0), | 94 | INTC_VECT(RTC, 0x4c0), |
113 | INTC_VECT(SCI1_ERI, 0x4e0), INTC_VECT(SCI1_RXI, 0x500), | 95 | INTC_VECT(SCI1, 0x4e0), INTC_VECT(SCI1, 0x500), |
114 | INTC_VECT(SCI1_TXI, 0x520), INTC_VECT(SCI1_TEI, 0x540), | 96 | INTC_VECT(SCI1, 0x520), INTC_VECT(SCI1, 0x540), |
115 | INTC_VECT(SCIF_ERI, 0x700), INTC_VECT(SCIF_RXI, 0x720), | 97 | INTC_VECT(SCIF, 0x700), INTC_VECT(SCIF, 0x720), |
116 | INTC_VECT(SCIF_BRI, 0x740), INTC_VECT(SCIF_TXI, 0x760), | 98 | INTC_VECT(SCIF, 0x740), INTC_VECT(SCIF, 0x760), |
117 | INTC_VECT(WDT, 0x560), | 99 | INTC_VECT(WDT, 0x560), |
118 | INTC_VECT(REF_RCMI, 0x580), INTC_VECT(REF_ROVI, 0x5a0), | 100 | INTC_VECT(REF, 0x580), INTC_VECT(REF, 0x5a0), |
119 | }; | ||
120 | |||
121 | static struct intc_group groups[] __initdata = { | ||
122 | INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI), | ||
123 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
124 | INTC_GROUP(SCI1, SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI), | ||
125 | INTC_GROUP(SCIF, SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI), | ||
126 | INTC_GROUP(REF, REF_RCMI, REF_ROVI), | ||
127 | }; | 101 | }; |
128 | 102 | ||
129 | static struct intc_prio_reg prio_registers[] __initdata = { | 103 | static struct intc_prio_reg prio_registers[] __initdata = { |
@@ -136,7 +110,7 @@ static struct intc_prio_reg prio_registers[] __initdata = { | |||
136 | PCIC1, PCIC0_PCISERR } }, | 110 | PCIC1, PCIC0_PCISERR } }, |
137 | }; | 111 | }; |
138 | 112 | ||
139 | static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, groups, | 113 | static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, NULL, |
140 | NULL, prio_registers, NULL); | 114 | NULL, prio_registers, NULL); |
141 | 115 | ||
142 | /* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */ | 116 | /* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */ |
@@ -145,39 +119,28 @@ static DECLARE_INTC_DESC(intc_desc, "sh7750", vectors, groups, | |||
145 | defined(CONFIG_CPU_SUBTYPE_SH7751) || \ | 119 | defined(CONFIG_CPU_SUBTYPE_SH7751) || \ |
146 | defined(CONFIG_CPU_SUBTYPE_SH7091) | 120 | defined(CONFIG_CPU_SUBTYPE_SH7091) |
147 | static struct intc_vect vectors_dma4[] __initdata = { | 121 | static struct intc_vect vectors_dma4[] __initdata = { |
148 | INTC_VECT(DMAC_DMTE0, 0x640), INTC_VECT(DMAC_DMTE1, 0x660), | 122 | INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660), |
149 | INTC_VECT(DMAC_DMTE2, 0x680), INTC_VECT(DMAC_DMTE3, 0x6a0), | 123 | INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0), |
150 | INTC_VECT(DMAC_DMAE, 0x6c0), | 124 | INTC_VECT(DMAC, 0x6c0), |
151 | }; | ||
152 | |||
153 | static struct intc_group groups_dma4[] __initdata = { | ||
154 | INTC_GROUP(DMAC, DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, | ||
155 | DMAC_DMTE3, DMAC_DMAE), | ||
156 | }; | 125 | }; |
157 | 126 | ||
158 | static DECLARE_INTC_DESC(intc_desc_dma4, "sh7750_dma4", | 127 | static DECLARE_INTC_DESC(intc_desc_dma4, "sh7750_dma4", |
159 | vectors_dma4, groups_dma4, | 128 | vectors_dma4, NULL, |
160 | NULL, prio_registers, NULL); | 129 | NULL, prio_registers, NULL); |
161 | #endif | 130 | #endif |
162 | 131 | ||
163 | /* SH7750R and SH7751R both have 8-channel DMA controllers */ | 132 | /* SH7750R and SH7751R both have 8-channel DMA controllers */ |
164 | #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || defined(CONFIG_CPU_SUBTYPE_SH7751R) | 133 | #if defined(CONFIG_CPU_SUBTYPE_SH7750R) || defined(CONFIG_CPU_SUBTYPE_SH7751R) |
165 | static struct intc_vect vectors_dma8[] __initdata = { | 134 | static struct intc_vect vectors_dma8[] __initdata = { |
166 | INTC_VECT(DMAC_DMTE0, 0x640), INTC_VECT(DMAC_DMTE1, 0x660), | 135 | INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660), |
167 | INTC_VECT(DMAC_DMTE2, 0x680), INTC_VECT(DMAC_DMTE3, 0x6a0), | 136 | INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0), |
168 | INTC_VECT(DMAC_DMTE4, 0x780), INTC_VECT(DMAC_DMTE5, 0x7a0), | 137 | INTC_VECT(DMAC, 0x780), INTC_VECT(DMAC, 0x7a0), |
169 | INTC_VECT(DMAC_DMTE6, 0x7c0), INTC_VECT(DMAC_DMTE7, 0x7e0), | 138 | INTC_VECT(DMAC, 0x7c0), INTC_VECT(DMAC, 0x7e0), |
170 | INTC_VECT(DMAC_DMAE, 0x6c0), | 139 | INTC_VECT(DMAC, 0x6c0), |
171 | }; | ||
172 | |||
173 | static struct intc_group groups_dma8[] __initdata = { | ||
174 | INTC_GROUP(DMAC, DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, | ||
175 | DMAC_DMTE3, DMAC_DMTE4, DMAC_DMTE5, | ||
176 | DMAC_DMTE6, DMAC_DMTE7, DMAC_DMAE), | ||
177 | }; | 140 | }; |
178 | 141 | ||
179 | static DECLARE_INTC_DESC(intc_desc_dma8, "sh7750_dma8", | 142 | static DECLARE_INTC_DESC(intc_desc_dma8, "sh7750_dma8", |
180 | vectors_dma8, groups_dma8, | 143 | vectors_dma8, NULL, |
181 | NULL, prio_registers, NULL); | 144 | NULL, prio_registers, NULL); |
182 | #endif | 145 | #endif |
183 | 146 | ||
diff --git a/arch/sh/kernel/cpu/sh4a/Makefile b/arch/sh/kernel/cpu/sh4a/Makefile index 8e344ec5847e..1a92361feeb9 100644 --- a/arch/sh/kernel/cpu/sh4a/Makefile +++ b/arch/sh/kernel/cpu/sh4a/Makefile | |||
@@ -7,6 +7,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7763) += setup-sh7763.o | |||
7 | obj-$(CONFIG_CPU_SUBTYPE_SH7770) += setup-sh7770.o | 7 | obj-$(CONFIG_CPU_SUBTYPE_SH7770) += setup-sh7770.o |
8 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += setup-sh7780.o | 8 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += setup-sh7780.o |
9 | obj-$(CONFIG_CPU_SUBTYPE_SH7785) += setup-sh7785.o | 9 | obj-$(CONFIG_CPU_SUBTYPE_SH7785) += setup-sh7785.o |
10 | obj-$(CONFIG_CPU_SUBTYPE_SH7786) += setup-sh7786.o | ||
10 | obj-$(CONFIG_CPU_SUBTYPE_SH7343) += setup-sh7343.o | 11 | obj-$(CONFIG_CPU_SUBTYPE_SH7343) += setup-sh7343.o |
11 | obj-$(CONFIG_CPU_SUBTYPE_SH7722) += setup-sh7722.o | 12 | obj-$(CONFIG_CPU_SUBTYPE_SH7722) += setup-sh7722.o |
12 | obj-$(CONFIG_CPU_SUBTYPE_SH7723) += setup-sh7723.o | 13 | obj-$(CONFIG_CPU_SUBTYPE_SH7723) += setup-sh7723.o |
@@ -21,6 +22,7 @@ clock-$(CONFIG_CPU_SUBTYPE_SH7763) := clock-sh7763.o | |||
21 | clock-$(CONFIG_CPU_SUBTYPE_SH7770) := clock-sh7770.o | 22 | clock-$(CONFIG_CPU_SUBTYPE_SH7770) := clock-sh7770.o |
22 | clock-$(CONFIG_CPU_SUBTYPE_SH7780) := clock-sh7780.o | 23 | clock-$(CONFIG_CPU_SUBTYPE_SH7780) := clock-sh7780.o |
23 | clock-$(CONFIG_CPU_SUBTYPE_SH7785) := clock-sh7785.o | 24 | clock-$(CONFIG_CPU_SUBTYPE_SH7785) := clock-sh7785.o |
25 | clock-$(CONFIG_CPU_SUBTYPE_SH7786) := clock-sh7786.o | ||
24 | clock-$(CONFIG_CPU_SUBTYPE_SH7343) := clock-sh7722.o | 26 | clock-$(CONFIG_CPU_SUBTYPE_SH7343) := clock-sh7722.o |
25 | clock-$(CONFIG_CPU_SUBTYPE_SH7722) := clock-sh7722.o | 27 | clock-$(CONFIG_CPU_SUBTYPE_SH7722) := clock-sh7722.o |
26 | clock-$(CONFIG_CPU_SUBTYPE_SH7723) := clock-sh7722.o | 28 | clock-$(CONFIG_CPU_SUBTYPE_SH7723) := clock-sh7722.o |
@@ -31,6 +33,7 @@ clock-$(CONFIG_CPU_SUBTYPE_SHX3) := clock-shx3.o | |||
31 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7722) := pinmux-sh7722.o | 33 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7722) := pinmux-sh7722.o |
32 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7723) := pinmux-sh7723.o | 34 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7723) := pinmux-sh7723.o |
33 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o | 35 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7785) := pinmux-sh7785.o |
36 | pinmux-$(CONFIG_CPU_SUBTYPE_SH7786) := pinmux-sh7786.o | ||
34 | 37 | ||
35 | obj-y += $(clock-y) | 38 | obj-y += $(clock-y) |
36 | obj-$(CONFIG_SMP) += $(smp-y) | 39 | obj-$(CONFIG_SMP) += $(smp-y) |
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c new file mode 100644 index 000000000000..f84a9c134471 --- /dev/null +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c | |||
@@ -0,0 +1,148 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/cpu/sh4a/clock-sh7786.c | ||
3 | * | ||
4 | * SH7786 support for the clock framework | ||
5 | * | ||
6 | * Copyright (C) 2008, 2009 Renesas Solutions Corp. | ||
7 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
8 | * | ||
9 | * Based on SH7785 | ||
10 | * Copyright (C) 2007 Paul Mundt | ||
11 | * | ||
12 | * This file is subject to the terms and conditions of the GNU General Public | ||
13 | * License. See the file "COPYING" in the main directory of this archive | ||
14 | * for more details. | ||
15 | */ | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <asm/clock.h> | ||
19 | #include <asm/freq.h> | ||
20 | #include <asm/io.h> | ||
21 | |||
22 | static int ifc_divisors[] = { 1, 2, 4, 1 }; | ||
23 | static int sfc_divisors[] = { 1, 1, 4, 1 }; | ||
24 | static int bfc_divisors[] = { 1, 1, 1, 1, 1, 12, 16, 1, | ||
25 | 24, 32, 1, 1, 1, 1, 1, 1 }; | ||
26 | static int mfc_divisors[] = { 1, 1, 4, 1 }; | ||
27 | static int pfc_divisors[] = { 1, 1, 1, 1, 1, 1, 16, 1, | ||
28 | 24, 32, 1, 48, 1, 1, 1, 1 }; | ||
29 | |||
30 | static void master_clk_init(struct clk *clk) | ||
31 | { | ||
32 | clk->rate *= pfc_divisors[ctrl_inl(FRQMR1) & 0x000f]; | ||
33 | } | ||
34 | |||
35 | static struct clk_ops sh7786_master_clk_ops = { | ||
36 | .init = master_clk_init, | ||
37 | }; | ||
38 | |||
39 | static void module_clk_recalc(struct clk *clk) | ||
40 | { | ||
41 | int idx = (ctrl_inl(FRQMR1) & 0x000f); | ||
42 | clk->rate = clk->parent->rate / pfc_divisors[idx]; | ||
43 | } | ||
44 | |||
45 | static struct clk_ops sh7786_module_clk_ops = { | ||
46 | .recalc = module_clk_recalc, | ||
47 | }; | ||
48 | |||
49 | static void bus_clk_recalc(struct clk *clk) | ||
50 | { | ||
51 | int idx = ((ctrl_inl(FRQMR1) >> 16) & 0x000f); | ||
52 | clk->rate = clk->parent->rate / bfc_divisors[idx]; | ||
53 | } | ||
54 | |||
55 | static struct clk_ops sh7786_bus_clk_ops = { | ||
56 | .recalc = bus_clk_recalc, | ||
57 | }; | ||
58 | |||
59 | static void cpu_clk_recalc(struct clk *clk) | ||
60 | { | ||
61 | int idx = ((ctrl_inl(FRQMR1) >> 28) & 0x0003); | ||
62 | clk->rate = clk->parent->rate / ifc_divisors[idx]; | ||
63 | } | ||
64 | |||
65 | static struct clk_ops sh7786_cpu_clk_ops = { | ||
66 | .recalc = cpu_clk_recalc, | ||
67 | }; | ||
68 | |||
69 | static struct clk_ops *sh7786_clk_ops[] = { | ||
70 | &sh7786_master_clk_ops, | ||
71 | &sh7786_module_clk_ops, | ||
72 | &sh7786_bus_clk_ops, | ||
73 | &sh7786_cpu_clk_ops, | ||
74 | }; | ||
75 | |||
76 | void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | ||
77 | { | ||
78 | if (idx < ARRAY_SIZE(sh7786_clk_ops)) | ||
79 | *ops = sh7786_clk_ops[idx]; | ||
80 | } | ||
81 | |||
82 | static void shyway_clk_recalc(struct clk *clk) | ||
83 | { | ||
84 | int idx = ((ctrl_inl(FRQMR1) >> 20) & 0x0003); | ||
85 | clk->rate = clk->parent->rate / sfc_divisors[idx]; | ||
86 | } | ||
87 | |||
88 | static struct clk_ops sh7786_shyway_clk_ops = { | ||
89 | .recalc = shyway_clk_recalc, | ||
90 | }; | ||
91 | |||
92 | static struct clk sh7786_shyway_clk = { | ||
93 | .name = "shyway_clk", | ||
94 | .flags = CLK_ALWAYS_ENABLED, | ||
95 | .ops = &sh7786_shyway_clk_ops, | ||
96 | }; | ||
97 | |||
98 | static void ddr_clk_recalc(struct clk *clk) | ||
99 | { | ||
100 | int idx = ((ctrl_inl(FRQMR1) >> 12) & 0x0003); | ||
101 | clk->rate = clk->parent->rate / mfc_divisors[idx]; | ||
102 | } | ||
103 | |||
104 | static struct clk_ops sh7786_ddr_clk_ops = { | ||
105 | .recalc = ddr_clk_recalc, | ||
106 | }; | ||
107 | |||
108 | static struct clk sh7786_ddr_clk = { | ||
109 | .name = "ddr_clk", | ||
110 | .flags = CLK_ALWAYS_ENABLED, | ||
111 | .ops = &sh7786_ddr_clk_ops, | ||
112 | }; | ||
113 | |||
114 | /* | ||
115 | * Additional SH7786-specific on-chip clocks that aren't already part of the | ||
116 | * clock framework | ||
117 | */ | ||
118 | static struct clk *sh7786_onchip_clocks[] = { | ||
119 | &sh7786_shyway_clk, | ||
120 | &sh7786_ddr_clk, | ||
121 | }; | ||
122 | |||
123 | static int __init sh7786_clk_init(void) | ||
124 | { | ||
125 | struct clk *clk = clk_get(NULL, "master_clk"); | ||
126 | int i; | ||
127 | |||
128 | for (i = 0; i < ARRAY_SIZE(sh7786_onchip_clocks); i++) { | ||
129 | struct clk *clkp = sh7786_onchip_clocks[i]; | ||
130 | |||
131 | clkp->parent = clk; | ||
132 | clk_register(clkp); | ||
133 | clk_enable(clkp); | ||
134 | } | ||
135 | |||
136 | /* | ||
137 | * Now that we have the rest of the clocks registered, we need to | ||
138 | * force the parent clock to propagate so that these clocks will | ||
139 | * automatically figure out their rate. We cheat by handing the | ||
140 | * parent clock its current rate and forcing child propagation. | ||
141 | */ | ||
142 | clk_set_rate(clk, clk_get_rate(clk)); | ||
143 | |||
144 | clk_put(clk); | ||
145 | |||
146 | return 0; | ||
147 | } | ||
148 | arch_initcall(sh7786_clk_init); | ||
diff --git a/arch/sh/kernel/cpu/sh4a/pinmux-sh7786.c b/arch/sh/kernel/cpu/sh4a/pinmux-sh7786.c new file mode 100644 index 000000000000..373b3447bfdf --- /dev/null +++ b/arch/sh/kernel/cpu/sh4a/pinmux-sh7786.c | |||
@@ -0,0 +1,950 @@ | |||
1 | /* | ||
2 | * SH7786 Pinmux | ||
3 | * | ||
4 | * Copyright (C) 2008, 2009 Renesas Solutions Corp. | ||
5 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
6 | * | ||
7 | * Based on SH7785 pinmux | ||
8 | * | ||
9 | * Copyright (C) 2008 Magnus Damm | ||
10 | * | ||
11 | * This file is subject to the terms and conditions of the GNU General Public | ||
12 | * License. See the file "COPYING" in the main directory of this archive | ||
13 | * for more details. | ||
14 | */ | ||
15 | |||
16 | #include <linux/init.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/gpio.h> | ||
19 | #include <cpu/sh7786.h> | ||
20 | |||
21 | enum { | ||
22 | PINMUX_RESERVED = 0, | ||
23 | |||
24 | PINMUX_DATA_BEGIN, | ||
25 | PA7_DATA, PA6_DATA, PA5_DATA, PA4_DATA, | ||
26 | PA3_DATA, PA2_DATA, PA1_DATA, PA0_DATA, | ||
27 | PB7_DATA, PB6_DATA, PB5_DATA, PB4_DATA, | ||
28 | PB3_DATA, PB2_DATA, PB1_DATA, PB0_DATA, | ||
29 | PC7_DATA, PC6_DATA, PC5_DATA, PC4_DATA, | ||
30 | PC3_DATA, PC2_DATA, PC1_DATA, PC0_DATA, | ||
31 | PD7_DATA, PD6_DATA, PD5_DATA, PD4_DATA, | ||
32 | PD3_DATA, PD2_DATA, PD1_DATA, PD0_DATA, | ||
33 | PE7_DATA, PE6_DATA, | ||
34 | PF7_DATA, PF6_DATA, PF5_DATA, PF4_DATA, | ||
35 | PF3_DATA, PF2_DATA, PF1_DATA, PF0_DATA, | ||
36 | PG7_DATA, PG6_DATA, PG5_DATA, | ||
37 | PH7_DATA, PH6_DATA, PH5_DATA, PH4_DATA, | ||
38 | PH3_DATA, PH2_DATA, PH1_DATA, PH0_DATA, | ||
39 | PJ7_DATA, PJ6_DATA, PJ5_DATA, PJ4_DATA, | ||
40 | PJ3_DATA, PJ2_DATA, PJ1_DATA, | ||
41 | PINMUX_DATA_END, | ||
42 | |||
43 | PINMUX_INPUT_BEGIN, | ||
44 | PA7_IN, PA6_IN, PA5_IN, PA4_IN, | ||
45 | PA3_IN, PA2_IN, PA1_IN, PA0_IN, | ||
46 | PB7_IN, PB6_IN, PB5_IN, PB4_IN, | ||
47 | PB3_IN, PB2_IN, PB1_IN, PB0_IN, | ||
48 | PC7_IN, PC6_IN, PC5_IN, PC4_IN, | ||
49 | PC3_IN, PC2_IN, PC1_IN, PC0_IN, | ||
50 | PD7_IN, PD6_IN, PD5_IN, PD4_IN, | ||
51 | PD3_IN, PD2_IN, PD1_IN, PD0_IN, | ||
52 | PE7_IN, PE6_IN, | ||
53 | PF7_IN, PF6_IN, PF5_IN, PF4_IN, | ||
54 | PF3_IN, PF2_IN, PF1_IN, PF0_IN, | ||
55 | PG7_IN, PG6_IN, PG5_IN, | ||
56 | PH7_IN, PH6_IN, PH5_IN, PH4_IN, | ||
57 | PH3_IN, PH2_IN, PH1_IN, PH0_IN, | ||
58 | PJ7_IN, PJ6_IN, PJ5_IN, PJ4_IN, | ||
59 | PJ3_IN, PJ2_IN, PJ1_IN, | ||
60 | PINMUX_INPUT_END, | ||
61 | |||
62 | PINMUX_INPUT_PULLUP_BEGIN, | ||
63 | PA7_IN_PU, PA6_IN_PU, PA5_IN_PU, PA4_IN_PU, | ||
64 | PA3_IN_PU, PA2_IN_PU, PA1_IN_PU, PA0_IN_PU, | ||
65 | PB7_IN_PU, PB6_IN_PU, PB5_IN_PU, PB4_IN_PU, | ||
66 | PB3_IN_PU, PB2_IN_PU, PB1_IN_PU, PB0_IN_PU, | ||
67 | PC7_IN_PU, PC6_IN_PU, PC5_IN_PU, PC4_IN_PU, | ||
68 | PC3_IN_PU, PC2_IN_PU, PC1_IN_PU, PC0_IN_PU, | ||
69 | PD7_IN_PU, PD6_IN_PU, PD5_IN_PU, PD4_IN_PU, | ||
70 | PD3_IN_PU, PD2_IN_PU, PD1_IN_PU, PD0_IN_PU, | ||
71 | PE7_IN_PU, PE6_IN_PU, | ||
72 | PF7_IN_PU, PF6_IN_PU, PF5_IN_PU, PF4_IN_PU, | ||
73 | PF3_IN_PU, PF2_IN_PU, PF1_IN_PU, PF0_IN_PU, | ||
74 | PG7_IN_PU, PG6_IN_PU, PG5_IN_PU, | ||
75 | PH7_IN_PU, PH6_IN_PU, PH5_IN_PU, PH4_IN_PU, | ||
76 | PH3_IN_PU, PH2_IN_PU, PH1_IN_PU, PH0_IN_PU, | ||
77 | PJ7_IN_PU, PJ6_IN_PU, PJ5_IN_PU, PJ4_IN_PU, | ||
78 | PJ3_IN_PU, PJ2_IN_PU, PJ1_IN_PU, | ||
79 | PINMUX_INPUT_PULLUP_END, | ||
80 | |||
81 | PINMUX_OUTPUT_BEGIN, | ||
82 | PA7_OUT, PA6_OUT, PA5_OUT, PA4_OUT, | ||
83 | PA3_OUT, PA2_OUT, PA1_OUT, PA0_OUT, | ||
84 | PB7_OUT, PB6_OUT, PB5_OUT, PB4_OUT, | ||
85 | PB3_OUT, PB2_OUT, PB1_OUT, PB0_OUT, | ||
86 | PC7_OUT, PC6_OUT, PC5_OUT, PC4_OUT, | ||
87 | PC3_OUT, PC2_OUT, PC1_OUT, PC0_OUT, | ||
88 | PD7_OUT, PD6_OUT, PD5_OUT, PD4_OUT, | ||
89 | PD3_OUT, PD2_OUT, PD1_OUT, PD0_OUT, | ||
90 | PE7_OUT, PE6_OUT, | ||
91 | PF7_OUT, PF6_OUT, PF5_OUT, PF4_OUT, | ||
92 | PF3_OUT, PF2_OUT, PF1_OUT, PF0_OUT, | ||
93 | PG7_OUT, PG6_OUT, PG5_OUT, | ||
94 | PH7_OUT, PH6_OUT, PH5_OUT, PH4_OUT, | ||
95 | PH3_OUT, PH2_OUT, PH1_OUT, PH0_OUT, | ||
96 | PJ7_OUT, PJ6_OUT, PJ5_OUT, PJ4_OUT, | ||
97 | PJ3_OUT, PJ2_OUT, PJ1_OUT, | ||
98 | PINMUX_OUTPUT_END, | ||
99 | |||
100 | PINMUX_FUNCTION_BEGIN, | ||
101 | PA7_FN, PA6_FN, PA5_FN, PA4_FN, | ||
102 | PA3_FN, PA2_FN, PA1_FN, PA0_FN, | ||
103 | PB7_FN, PB6_FN, PB5_FN, PB4_FN, | ||
104 | PB3_FN, PB2_FN, PB1_FN, PB0_FN, | ||
105 | PC7_FN, PC6_FN, PC5_FN, PC4_FN, | ||
106 | PC3_FN, PC2_FN, PC1_FN, PC0_FN, | ||
107 | PD7_FN, PD6_FN, PD5_FN, PD4_FN, | ||
108 | PD3_FN, PD2_FN, PD1_FN, PD0_FN, | ||
109 | PE7_FN, PE6_FN, | ||
110 | PF7_FN, PF6_FN, PF5_FN, PF4_FN, | ||
111 | PF3_FN, PF2_FN, PF1_FN, PF0_FN, | ||
112 | PG7_FN, PG6_FN, PG5_FN, | ||
113 | PH7_FN, PH6_FN, PH5_FN, PH4_FN, | ||
114 | PH3_FN, PH2_FN, PH1_FN, PH0_FN, | ||
115 | PJ7_FN, PJ6_FN, PJ5_FN, PJ4_FN, | ||
116 | PJ3_FN, PJ2_FN, PJ1_FN, | ||
117 | P1MSEL14_0, P1MSEL14_1, | ||
118 | P1MSEL13_0, P1MSEL13_1, | ||
119 | P1MSEL12_0, P1MSEL12_1, | ||
120 | P1MSEL11_0, P1MSEL11_1, | ||
121 | P1MSEL10_0, P1MSEL10_1, | ||
122 | P1MSEL9_0, P1MSEL9_1, | ||
123 | P1MSEL8_0, P1MSEL8_1, | ||
124 | P1MSEL7_0, P1MSEL7_1, | ||
125 | P1MSEL6_0, P1MSEL6_1, | ||
126 | P1MSEL5_0, P1MSEL5_1, | ||
127 | P1MSEL4_0, P1MSEL4_1, | ||
128 | P1MSEL3_0, P1MSEL3_1, | ||
129 | P1MSEL2_0, P1MSEL2_1, | ||
130 | P1MSEL1_0, P1MSEL1_1, | ||
131 | P1MSEL0_0, P1MSEL0_1, | ||
132 | |||
133 | P2MSEL15_0, P2MSEL15_1, | ||
134 | P2MSEL14_0, P2MSEL14_1, | ||
135 | P2MSEL13_0, P2MSEL13_1, | ||
136 | P2MSEL12_0, P2MSEL12_1, | ||
137 | P2MSEL11_0, P2MSEL11_1, | ||
138 | P2MSEL10_0, P2MSEL10_1, | ||
139 | P2MSEL9_0, P2MSEL9_1, | ||
140 | P2MSEL8_0, P2MSEL8_1, | ||
141 | P2MSEL7_0, P2MSEL7_1, | ||
142 | P2MSEL6_0, P2MSEL6_1, | ||
143 | P2MSEL5_0, P2MSEL5_1, | ||
144 | P2MSEL4_0, P2MSEL4_1, | ||
145 | P2MSEL3_0, P2MSEL3_1, | ||
146 | P2MSEL2_0, P2MSEL2_1, | ||
147 | P2MSEL1_0, P2MSEL1_1, | ||
148 | P2MSEL0_0, P2MSEL0_1, | ||
149 | PINMUX_FUNCTION_END, | ||
150 | |||
151 | PINMUX_MARK_BEGIN, | ||
152 | CDE_MARK, | ||
153 | ETH_MAGIC_MARK, | ||
154 | DISP_MARK, | ||
155 | ETH_LINK_MARK, | ||
156 | DR5_MARK, | ||
157 | ETH_TX_ER_MARK, | ||
158 | DR4_MARK, | ||
159 | ETH_TX_EN_MARK, | ||
160 | DR3_MARK, | ||
161 | ETH_TXD3_MARK, | ||
162 | DR2_MARK, | ||
163 | ETH_TXD2_MARK, | ||
164 | DR1_MARK, | ||
165 | ETH_TXD1_MARK, | ||
166 | DR0_MARK, | ||
167 | ETH_TXD0_MARK, | ||
168 | |||
169 | VSYNC_MARK, | ||
170 | HSPI_CLK_MARK, | ||
171 | ODDF_MARK, | ||
172 | HSPI_CS_MARK, | ||
173 | DG5_MARK, | ||
174 | ETH_MDIO_MARK, | ||
175 | DG4_MARK, | ||
176 | ETH_RX_CLK_MARK, | ||
177 | DG3_MARK, | ||
178 | ETH_MDC_MARK, | ||
179 | DG2_MARK, | ||
180 | ETH_COL_MARK, | ||
181 | DG1_MARK, | ||
182 | ETH_TX_CLK_MARK, | ||
183 | DG0_MARK, | ||
184 | ETH_CRS_MARK, | ||
185 | |||
186 | DCLKIN_MARK, | ||
187 | HSPI_RX_MARK, | ||
188 | HSYNC_MARK, | ||
189 | HSPI_TX_MARK, | ||
190 | DB5_MARK, | ||
191 | ETH_RXD3_MARK, | ||
192 | DB4_MARK, | ||
193 | ETH_RXD2_MARK, | ||
194 | DB3_MARK, | ||
195 | ETH_RXD1_MARK, | ||
196 | DB2_MARK, | ||
197 | ETH_RXD0_MARK, | ||
198 | DB1_MARK, | ||
199 | ETH_RX_DV_MARK, | ||
200 | DB0_MARK, | ||
201 | ETH_RX_ER_MARK, | ||
202 | |||
203 | DCLKOUT_MARK, | ||
204 | SCIF1_SLK_MARK, | ||
205 | SCIF1_RXD_MARK, | ||
206 | SCIF1_TXD_MARK, | ||
207 | DACK1_MARK, | ||
208 | BACK_MARK, | ||
209 | FALE_MARK, | ||
210 | DACK0_MARK, | ||
211 | FCLE_MARK, | ||
212 | DREQ1_MARK, | ||
213 | BREQ_MARK, | ||
214 | USB_OVC1_MARK, | ||
215 | DREQ0_MARK, | ||
216 | USB_OVC0_MARK, | ||
217 | |||
218 | USB_PENC1_MARK, | ||
219 | USB_PENC0_MARK, | ||
220 | |||
221 | HAC1_SDOUT_MARK, | ||
222 | SSI1_SDATA_MARK, | ||
223 | SDIF1CMD_MARK, | ||
224 | HAC1_SDIN_MARK, | ||
225 | SSI1_SCK_MARK, | ||
226 | SDIF1CD_MARK, | ||
227 | HAC1_SYNC_MARK, | ||
228 | SSI1_WS_MARK, | ||
229 | SDIF1WP_MARK, | ||
230 | HAC1_BITCLK_MARK, | ||
231 | SSI1_CLK_MARK, | ||
232 | SDIF1CLK_MARK, | ||
233 | HAC0_SDOUT_MARK, | ||
234 | SSI0_SDATA_MARK, | ||
235 | SDIF1D3_MARK, | ||
236 | HAC0_SDIN_MARK, | ||
237 | SSI0_SCK_MARK, | ||
238 | SDIF1D2_MARK, | ||
239 | HAC0_SYNC_MARK, | ||
240 | SSI0_WS_MARK, | ||
241 | SDIF1D1_MARK, | ||
242 | HAC0_BITCLK_MARK, | ||
243 | SSI0_CLK_MARK, | ||
244 | SDIF1D0_MARK, | ||
245 | |||
246 | SCIF3_SCK_MARK, | ||
247 | SSI2_SDATA_MARK, | ||
248 | SCIF3_RXD_MARK, | ||
249 | TCLK_MARK, | ||
250 | SSI2_SCK_MARK, | ||
251 | SCIF3_TXD_MARK, | ||
252 | HAC_RES_MARK, | ||
253 | SSI2_WS_MARK, | ||
254 | |||
255 | DACK3_MARK, | ||
256 | SDIF0CMD_MARK, | ||
257 | DACK2_MARK, | ||
258 | SDIF0CD_MARK, | ||
259 | DREQ3_MARK, | ||
260 | SDIF0WP_MARK, | ||
261 | SCIF0_CTS_MARK, | ||
262 | DREQ2_MARK, | ||
263 | SDIF0CLK_MARK, | ||
264 | SCIF0_RTS_MARK, | ||
265 | IRL7_MARK, | ||
266 | SDIF0D3_MARK, | ||
267 | SCIF0_SCK_MARK, | ||
268 | IRL6_MARK, | ||
269 | SDIF0D2_MARK, | ||
270 | SCIF0_RXD_MARK, | ||
271 | IRL5_MARK, | ||
272 | SDIF0D1_MARK, | ||
273 | SCIF0_TXD_MARK, | ||
274 | IRL4_MARK, | ||
275 | SDIF0D0_MARK, | ||
276 | |||
277 | SCIF5_SCK_MARK, | ||
278 | FRB_MARK, | ||
279 | SCIF5_RXD_MARK, | ||
280 | IOIS16_MARK, | ||
281 | SCIF5_TXD_MARK, | ||
282 | CE2B_MARK, | ||
283 | DRAK3_MARK, | ||
284 | CE2A_MARK, | ||
285 | SCIF4_SCK_MARK, | ||
286 | DRAK2_MARK, | ||
287 | SSI3_WS_MARK, | ||
288 | SCIF4_RXD_MARK, | ||
289 | DRAK1_MARK, | ||
290 | SSI3_SDATA_MARK, | ||
291 | FSTATUS_MARK, | ||
292 | SCIF4_TXD_MARK, | ||
293 | DRAK0_MARK, | ||
294 | SSI3_SCK_MARK, | ||
295 | FSE_MARK, | ||
296 | PINMUX_MARK_END, | ||
297 | }; | ||
298 | |||
299 | static pinmux_enum_t pinmux_data[] = { | ||
300 | |||
301 | /* PA GPIO */ | ||
302 | PINMUX_DATA(PA7_DATA, PA7_IN, PA7_OUT, PA7_IN_PU), | ||
303 | PINMUX_DATA(PA6_DATA, PA6_IN, PA6_OUT, PA6_IN_PU), | ||
304 | PINMUX_DATA(PA5_DATA, PA5_IN, PA5_OUT, PA5_IN_PU), | ||
305 | PINMUX_DATA(PA4_DATA, PA4_IN, PA4_OUT, PA4_IN_PU), | ||
306 | PINMUX_DATA(PA3_DATA, PA3_IN, PA3_OUT, PA3_IN_PU), | ||
307 | PINMUX_DATA(PA2_DATA, PA2_IN, PA2_OUT, PA2_IN_PU), | ||
308 | PINMUX_DATA(PA1_DATA, PA1_IN, PA1_OUT, PA1_IN_PU), | ||
309 | PINMUX_DATA(PA0_DATA, PA0_IN, PA0_OUT, PA0_IN_PU), | ||
310 | |||
311 | /* PB GPIO */ | ||
312 | PINMUX_DATA(PB7_DATA, PB7_IN, PB7_OUT, PB7_IN_PU), | ||
313 | PINMUX_DATA(PB6_DATA, PB6_IN, PB6_OUT, PB6_IN_PU), | ||
314 | PINMUX_DATA(PB5_DATA, PB5_IN, PB5_OUT, PB5_IN_PU), | ||
315 | PINMUX_DATA(PB4_DATA, PB4_IN, PB4_OUT, PB4_IN_PU), | ||
316 | PINMUX_DATA(PB3_DATA, PB3_IN, PB3_OUT, PB3_IN_PU), | ||
317 | PINMUX_DATA(PB2_DATA, PB2_IN, PB2_OUT, PB2_IN_PU), | ||
318 | PINMUX_DATA(PB1_DATA, PB1_IN, PB1_OUT, PB1_IN_PU), | ||
319 | PINMUX_DATA(PB0_DATA, PB0_IN, PB0_OUT, PB0_IN_PU), | ||
320 | |||
321 | /* PC GPIO */ | ||
322 | PINMUX_DATA(PC7_DATA, PC7_IN, PC7_OUT, PC7_IN_PU), | ||
323 | PINMUX_DATA(PC6_DATA, PC6_IN, PC6_OUT, PC6_IN_PU), | ||
324 | PINMUX_DATA(PC5_DATA, PC5_IN, PC5_OUT, PC5_IN_PU), | ||
325 | PINMUX_DATA(PC4_DATA, PC4_IN, PC4_OUT, PC4_IN_PU), | ||
326 | PINMUX_DATA(PC3_DATA, PC3_IN, PC3_OUT, PC3_IN_PU), | ||
327 | PINMUX_DATA(PC2_DATA, PC2_IN, PC2_OUT, PC2_IN_PU), | ||
328 | PINMUX_DATA(PC1_DATA, PC1_IN, PC1_OUT, PC1_IN_PU), | ||
329 | PINMUX_DATA(PC0_DATA, PC0_IN, PC0_OUT, PC0_IN_PU), | ||
330 | |||
331 | /* PD GPIO */ | ||
332 | PINMUX_DATA(PD7_DATA, PD7_IN, PD7_OUT, PD7_IN_PU), | ||
333 | PINMUX_DATA(PD6_DATA, PD6_IN, PD6_OUT, PD6_IN_PU), | ||
334 | PINMUX_DATA(PD5_DATA, PD5_IN, PD5_OUT, PD5_IN_PU), | ||
335 | PINMUX_DATA(PD4_DATA, PD4_IN, PD4_OUT, PD4_IN_PU), | ||
336 | PINMUX_DATA(PD3_DATA, PD3_IN, PD3_OUT, PD3_IN_PU), | ||
337 | PINMUX_DATA(PD2_DATA, PD2_IN, PD2_OUT, PD2_IN_PU), | ||
338 | PINMUX_DATA(PD1_DATA, PD1_IN, PD1_OUT, PD1_IN_PU), | ||
339 | PINMUX_DATA(PD0_DATA, PD0_IN, PD0_OUT, PD0_IN_PU), | ||
340 | |||
341 | /* PE GPIO */ | ||
342 | PINMUX_DATA(PE7_DATA, PE7_IN, PE7_OUT, PE7_IN_PU), | ||
343 | PINMUX_DATA(PE6_DATA, PE6_IN, PE6_OUT, PE6_IN_PU), | ||
344 | |||
345 | /* PF GPIO */ | ||
346 | PINMUX_DATA(PF7_DATA, PF7_IN, PF7_OUT, PF7_IN_PU), | ||
347 | PINMUX_DATA(PF6_DATA, PF6_IN, PF6_OUT, PF6_IN_PU), | ||
348 | PINMUX_DATA(PF5_DATA, PF5_IN, PF5_OUT, PF5_IN_PU), | ||
349 | PINMUX_DATA(PF4_DATA, PF4_IN, PF4_OUT, PF4_IN_PU), | ||
350 | PINMUX_DATA(PF3_DATA, PF3_IN, PF3_OUT, PF3_IN_PU), | ||
351 | PINMUX_DATA(PF2_DATA, PF2_IN, PF2_OUT, PF2_IN_PU), | ||
352 | PINMUX_DATA(PF1_DATA, PF1_IN, PF1_OUT, PF1_IN_PU), | ||
353 | PINMUX_DATA(PF0_DATA, PF0_IN, PF0_OUT, PF0_IN_PU), | ||
354 | |||
355 | /* PG GPIO */ | ||
356 | PINMUX_DATA(PG7_DATA, PG7_IN, PG7_OUT, PG7_IN_PU), | ||
357 | PINMUX_DATA(PG6_DATA, PG6_IN, PG6_OUT, PG6_IN_PU), | ||
358 | PINMUX_DATA(PG5_DATA, PG5_IN, PG5_OUT, PG5_IN_PU), | ||
359 | |||
360 | /* PH GPIO */ | ||
361 | PINMUX_DATA(PH7_DATA, PH7_IN, PH7_OUT, PH7_IN_PU), | ||
362 | PINMUX_DATA(PH6_DATA, PH6_IN, PH6_OUT, PH6_IN_PU), | ||
363 | PINMUX_DATA(PH5_DATA, PH5_IN, PH5_OUT, PH5_IN_PU), | ||
364 | PINMUX_DATA(PH4_DATA, PH4_IN, PH4_OUT, PH4_IN_PU), | ||
365 | PINMUX_DATA(PH3_DATA, PH3_IN, PH3_OUT, PH3_IN_PU), | ||
366 | PINMUX_DATA(PH2_DATA, PH2_IN, PH2_OUT, PH2_IN_PU), | ||
367 | PINMUX_DATA(PH1_DATA, PH1_IN, PH1_OUT, PH1_IN_PU), | ||
368 | PINMUX_DATA(PH0_DATA, PH0_IN, PH0_OUT, PH0_IN_PU), | ||
369 | |||
370 | /* PJ GPIO */ | ||
371 | PINMUX_DATA(PJ7_DATA, PJ7_IN, PJ7_OUT, PJ7_IN_PU), | ||
372 | PINMUX_DATA(PJ6_DATA, PJ6_IN, PJ6_OUT, PJ6_IN_PU), | ||
373 | PINMUX_DATA(PJ5_DATA, PJ5_IN, PJ5_OUT, PJ5_IN_PU), | ||
374 | PINMUX_DATA(PJ4_DATA, PJ4_IN, PJ4_OUT, PJ4_IN_PU), | ||
375 | PINMUX_DATA(PJ3_DATA, PJ3_IN, PJ3_OUT, PJ3_IN_PU), | ||
376 | PINMUX_DATA(PJ2_DATA, PJ2_IN, PJ2_OUT, PJ2_IN_PU), | ||
377 | PINMUX_DATA(PJ1_DATA, PJ1_IN, PJ1_OUT, PJ1_IN_PU), | ||
378 | |||
379 | /* PA FN */ | ||
380 | PINMUX_MARK_BEGIN, | ||
381 | PINMUX_DATA(CDE_MARK, P1MSEL2_0, PA7_FN), | ||
382 | PINMUX_DATA(DISP_MARK, P1MSEL2_0, PA6_FN), | ||
383 | PINMUX_DATA(DR5_MARK, P1MSEL2_0, PA5_FN), | ||
384 | PINMUX_DATA(DR4_MARK, P1MSEL2_0, PA4_FN), | ||
385 | PINMUX_DATA(DR3_MARK, P1MSEL2_0, PA3_FN), | ||
386 | PINMUX_DATA(DR2_MARK, P1MSEL2_0, PA2_FN), | ||
387 | PINMUX_DATA(DR1_MARK, P1MSEL2_0, PA1_FN), | ||
388 | PINMUX_DATA(DR0_MARK, P1MSEL2_0, PA0_FN), | ||
389 | PINMUX_DATA(ETH_MAGIC_MARK, P1MSEL2_1, PA7_FN), | ||
390 | PINMUX_DATA(ETH_LINK_MARK, P1MSEL2_1, PA6_FN), | ||
391 | PINMUX_DATA(ETH_TX_ER_MARK, P1MSEL2_1, PA5_FN), | ||
392 | PINMUX_DATA(ETH_TX_EN_MARK, P1MSEL2_1, PA4_FN), | ||
393 | PINMUX_DATA(ETH_TXD3_MARK, P1MSEL2_1, PA3_FN), | ||
394 | PINMUX_DATA(ETH_TXD2_MARK, P1MSEL2_1, PA2_FN), | ||
395 | PINMUX_DATA(ETH_TXD1_MARK, P1MSEL2_1, PA1_FN), | ||
396 | PINMUX_DATA(ETH_TXD0_MARK, P1MSEL2_1, PA0_FN), | ||
397 | |||
398 | /* PB FN */ | ||
399 | PINMUX_DATA(VSYNC_MARK, P1MSEL3_0, PB7_FN), | ||
400 | PINMUX_DATA(ODDF_MARK, P1MSEL3_0, PB6_FN), | ||
401 | PINMUX_DATA(DG5_MARK, P1MSEL2_0, PB5_FN), | ||
402 | PINMUX_DATA(DG4_MARK, P1MSEL2_0, PB4_FN), | ||
403 | PINMUX_DATA(DG3_MARK, P1MSEL2_0, PB3_FN), | ||
404 | PINMUX_DATA(DG2_MARK, P1MSEL2_0, PB2_FN), | ||
405 | PINMUX_DATA(DG1_MARK, P1MSEL2_0, PB1_FN), | ||
406 | PINMUX_DATA(DG0_MARK, P1MSEL2_0, PB0_FN), | ||
407 | PINMUX_DATA(HSPI_CLK_MARK, P1MSEL3_1, PB7_FN), | ||
408 | PINMUX_DATA(HSPI_CS_MARK, P1MSEL3_1, PB6_FN), | ||
409 | PINMUX_DATA(ETH_MDIO_MARK, P1MSEL2_1, PB5_FN), | ||
410 | PINMUX_DATA(ETH_RX_CLK_MARK, P1MSEL2_1, PB4_FN), | ||
411 | PINMUX_DATA(ETH_MDC_MARK, P1MSEL2_1, PB3_FN), | ||
412 | PINMUX_DATA(ETH_COL_MARK, P1MSEL2_1, PB2_FN), | ||
413 | PINMUX_DATA(ETH_TX_CLK_MARK, P1MSEL2_1, PB1_FN), | ||
414 | PINMUX_DATA(ETH_CRS_MARK, P1MSEL2_1, PB0_FN), | ||
415 | |||
416 | /* PC FN */ | ||
417 | PINMUX_DATA(DCLKIN_MARK, P1MSEL3_0, PC7_FN), | ||
418 | PINMUX_DATA(HSYNC_MARK, P1MSEL3_0, PC6_FN), | ||
419 | PINMUX_DATA(DB5_MARK, P1MSEL2_0, PC5_FN), | ||
420 | PINMUX_DATA(DB4_MARK, P1MSEL2_0, PC4_FN), | ||
421 | PINMUX_DATA(DB3_MARK, P1MSEL2_0, PC3_FN), | ||
422 | PINMUX_DATA(DB2_MARK, P1MSEL2_0, PC2_FN), | ||
423 | PINMUX_DATA(DB1_MARK, P1MSEL2_0, PC1_FN), | ||
424 | PINMUX_DATA(DB0_MARK, P1MSEL2_0, PC0_FN), | ||
425 | |||
426 | PINMUX_DATA(HSPI_RX_MARK, P1MSEL3_1, PC7_FN), | ||
427 | PINMUX_DATA(HSPI_TX_MARK, P1MSEL3_1, PC6_FN), | ||
428 | PINMUX_DATA(ETH_RXD3_MARK, P1MSEL2_1, PC5_FN), | ||
429 | PINMUX_DATA(ETH_RXD2_MARK, P1MSEL2_1, PC4_FN), | ||
430 | PINMUX_DATA(ETH_RXD1_MARK, P1MSEL2_1, PC3_FN), | ||
431 | PINMUX_DATA(ETH_RXD0_MARK, P1MSEL2_1, PC2_FN), | ||
432 | PINMUX_DATA(ETH_RX_DV_MARK, P1MSEL2_1, PC1_FN), | ||
433 | PINMUX_DATA(ETH_RX_ER_MARK, P1MSEL2_1, PC0_FN), | ||
434 | |||
435 | /* PD FN */ | ||
436 | PINMUX_DATA(DCLKOUT_MARK, PD7_FN), | ||
437 | PINMUX_DATA(SCIF1_SLK_MARK, PD6_FN), | ||
438 | PINMUX_DATA(SCIF1_RXD_MARK, PD5_FN), | ||
439 | PINMUX_DATA(SCIF1_TXD_MARK, PD4_FN), | ||
440 | PINMUX_DATA(DACK1_MARK, P1MSEL13_1, P1MSEL12_0, PD3_FN), | ||
441 | PINMUX_DATA(BACK_MARK, P1MSEL13_0, P1MSEL12_1, PD3_FN), | ||
442 | PINMUX_DATA(FALE_MARK, P1MSEL13_0, P1MSEL12_0, PD3_FN), | ||
443 | PINMUX_DATA(DACK0_MARK, P1MSEL14_1, PD2_FN), | ||
444 | PINMUX_DATA(FCLE_MARK, P1MSEL14_0, PD2_FN), | ||
445 | PINMUX_DATA(DREQ1_MARK, P1MSEL10_0, P1MSEL9_1, PD1_FN), | ||
446 | PINMUX_DATA(BREQ_MARK, P1MSEL10_1, P1MSEL9_0, PD1_FN), | ||
447 | PINMUX_DATA(USB_OVC1_MARK, P1MSEL10_0, P1MSEL9_0, PD1_FN), | ||
448 | PINMUX_DATA(DREQ0_MARK, P1MSEL11_1, PD0_FN), | ||
449 | PINMUX_DATA(USB_OVC0_MARK, P1MSEL11_0, PD0_FN), | ||
450 | |||
451 | /* PE FN */ | ||
452 | PINMUX_DATA(USB_PENC1_MARK, PE7_FN), | ||
453 | PINMUX_DATA(USB_PENC0_MARK, PE6_FN), | ||
454 | |||
455 | /* PF FN */ | ||
456 | PINMUX_DATA(HAC1_SDOUT_MARK, P2MSEL15_0, P2MSEL14_0, PF7_FN), | ||
457 | PINMUX_DATA(HAC1_SDIN_MARK, P2MSEL15_0, P2MSEL14_0, PF6_FN), | ||
458 | PINMUX_DATA(HAC1_SYNC_MARK, P2MSEL15_0, P2MSEL14_0, PF5_FN), | ||
459 | PINMUX_DATA(HAC1_BITCLK_MARK, P2MSEL15_0, P2MSEL14_0, PF4_FN), | ||
460 | PINMUX_DATA(HAC0_SDOUT_MARK, P2MSEL13_0, P2MSEL12_0, PF3_FN), | ||
461 | PINMUX_DATA(HAC0_SDIN_MARK, P2MSEL13_0, P2MSEL12_0, PF2_FN), | ||
462 | PINMUX_DATA(HAC0_SYNC_MARK, P2MSEL13_0, P2MSEL12_0, PF1_FN), | ||
463 | PINMUX_DATA(HAC0_BITCLK_MARK, P2MSEL13_0, P2MSEL12_0, PF0_FN), | ||
464 | PINMUX_DATA(SSI1_SDATA_MARK, P2MSEL15_0, P2MSEL14_1, PF7_FN), | ||
465 | PINMUX_DATA(SSI1_SCK_MARK, P2MSEL15_0, P2MSEL14_1, PF6_FN), | ||
466 | PINMUX_DATA(SSI1_WS_MARK, P2MSEL15_0, P2MSEL14_1, PF5_FN), | ||
467 | PINMUX_DATA(SSI1_CLK_MARK, P2MSEL15_0, P2MSEL14_1, PF4_FN), | ||
468 | PINMUX_DATA(SSI0_SDATA_MARK, P2MSEL13_0, P2MSEL12_1, PF3_FN), | ||
469 | PINMUX_DATA(SSI0_SCK_MARK, P2MSEL13_0, P2MSEL12_1, PF2_FN), | ||
470 | PINMUX_DATA(SSI0_WS_MARK, P2MSEL13_0, P2MSEL12_1, PF1_FN), | ||
471 | PINMUX_DATA(SSI0_CLK_MARK, P2MSEL13_0, P2MSEL12_1, PF0_FN), | ||
472 | PINMUX_DATA(SDIF1CMD_MARK, P2MSEL15_1, P2MSEL14_0, PF7_FN), | ||
473 | PINMUX_DATA(SDIF1CD_MARK, P2MSEL15_1, P2MSEL14_0, PF6_FN), | ||
474 | PINMUX_DATA(SDIF1WP_MARK, P2MSEL15_1, P2MSEL14_0, PF5_FN), | ||
475 | PINMUX_DATA(SDIF1CLK_MARK, P2MSEL15_1, P2MSEL14_0, PF4_FN), | ||
476 | PINMUX_DATA(SDIF1D3_MARK, P2MSEL13_1, P2MSEL12_0, PF3_FN), | ||
477 | PINMUX_DATA(SDIF1D2_MARK, P2MSEL13_1, P2MSEL12_0, PF2_FN), | ||
478 | PINMUX_DATA(SDIF1D1_MARK, P2MSEL13_1, P2MSEL12_0, PF1_FN), | ||
479 | PINMUX_DATA(SDIF1D0_MARK, P2MSEL13_1, P2MSEL12_0, PF0_FN), | ||
480 | |||
481 | /* PG FN */ | ||
482 | PINMUX_DATA(SCIF3_SCK_MARK, P1MSEL8_0, PG7_FN), | ||
483 | PINMUX_DATA(SSI2_SDATA_MARK, P1MSEL8_1, PG7_FN), | ||
484 | PINMUX_DATA(SCIF3_RXD_MARK, P1MSEL7_0, P1MSEL6_0, PG6_FN), | ||
485 | PINMUX_DATA(SSI2_SCK_MARK, P1MSEL7_1, P1MSEL6_0, PG6_FN), | ||
486 | PINMUX_DATA(TCLK_MARK, P1MSEL7_0, P1MSEL6_1, PG6_FN), | ||
487 | PINMUX_DATA(SCIF3_TXD_MARK, P1MSEL5_0, P1MSEL4_0, PG5_FN), | ||
488 | PINMUX_DATA(SSI2_WS_MARK, P1MSEL5_1, P1MSEL4_0, PG5_FN), | ||
489 | PINMUX_DATA(HAC_RES_MARK, P1MSEL5_0, P1MSEL4_1, PG5_FN), | ||
490 | |||
491 | /* PH FN */ | ||
492 | PINMUX_DATA(DACK3_MARK, P2MSEL4_0, PH7_FN), | ||
493 | PINMUX_DATA(SDIF0CMD_MARK, P2MSEL4_1, PH7_FN), | ||
494 | PINMUX_DATA(DACK2_MARK, P2MSEL4_0, PH6_FN), | ||
495 | PINMUX_DATA(SDIF0CD_MARK, P2MSEL4_1, PH6_FN), | ||
496 | PINMUX_DATA(DREQ3_MARK, P2MSEL4_0, PH5_FN), | ||
497 | PINMUX_DATA(SDIF0WP_MARK, P2MSEL4_1, PH5_FN), | ||
498 | PINMUX_DATA(DREQ2_MARK, P2MSEL3_0, P2MSEL2_1, PH4_FN), | ||
499 | PINMUX_DATA(SDIF0CLK_MARK, P2MSEL3_1, P2MSEL2_0, PH4_FN), | ||
500 | PINMUX_DATA(SCIF0_CTS_MARK, P2MSEL3_0, P2MSEL2_0, PH4_FN), | ||
501 | PINMUX_DATA(SDIF0D3_MARK, P2MSEL1_1, P2MSEL0_0, PH3_FN), | ||
502 | PINMUX_DATA(SCIF0_RTS_MARK, P2MSEL1_0, P2MSEL0_0, PH3_FN), | ||
503 | PINMUX_DATA(IRL7_MARK, P2MSEL1_0, P2MSEL0_1, PH3_FN), | ||
504 | PINMUX_DATA(SDIF0D2_MARK, P2MSEL1_1, P2MSEL0_0, PH2_FN), | ||
505 | PINMUX_DATA(SCIF0_SCK_MARK, P2MSEL1_0, P2MSEL0_0, PH2_FN), | ||
506 | PINMUX_DATA(IRL6_MARK, P2MSEL1_0, P2MSEL0_1, PH2_FN), | ||
507 | PINMUX_DATA(SDIF0D1_MARK, P2MSEL1_1, P2MSEL0_0, PH1_FN), | ||
508 | PINMUX_DATA(SCIF0_RXD_MARK, P2MSEL1_0, P2MSEL0_0, PH1_FN), | ||
509 | PINMUX_DATA(IRL5_MARK, P2MSEL1_0, P2MSEL0_1, PH1_FN), | ||
510 | PINMUX_DATA(SDIF0D0_MARK, P2MSEL1_1, P2MSEL0_0, PH0_FN), | ||
511 | PINMUX_DATA(SCIF0_TXD_MARK, P2MSEL1_0, P2MSEL0_0, PH0_FN), | ||
512 | PINMUX_DATA(IRL4_MARK, P2MSEL1_0, P2MSEL0_1, PH0_FN), | ||
513 | |||
514 | /* PJ FN */ | ||
515 | PINMUX_DATA(SCIF5_SCK_MARK, P2MSEL11_1, PJ7_FN), | ||
516 | PINMUX_DATA(FRB_MARK, P2MSEL11_0, PJ7_FN), | ||
517 | PINMUX_DATA(SCIF5_RXD_MARK, P2MSEL10_0, PJ6_FN), | ||
518 | PINMUX_DATA(IOIS16_MARK, P2MSEL10_1, PJ6_FN), | ||
519 | PINMUX_DATA(SCIF5_TXD_MARK, P2MSEL10_0, PJ5_FN), | ||
520 | PINMUX_DATA(CE2B_MARK, P2MSEL10_1, PJ5_FN), | ||
521 | PINMUX_DATA(DRAK3_MARK, P2MSEL7_0, PJ4_FN), | ||
522 | PINMUX_DATA(CE2A_MARK, P2MSEL7_1, PJ4_FN), | ||
523 | PINMUX_DATA(SCIF4_SCK_MARK, P2MSEL9_0, P2MSEL8_0, PJ3_FN), | ||
524 | PINMUX_DATA(DRAK2_MARK, P2MSEL9_0, P2MSEL8_1, PJ3_FN), | ||
525 | PINMUX_DATA(SSI3_WS_MARK, P2MSEL9_1, P2MSEL8_0, PJ3_FN), | ||
526 | PINMUX_DATA(SCIF4_RXD_MARK, P2MSEL6_1, P2MSEL5_0, PJ2_FN), | ||
527 | PINMUX_DATA(DRAK1_MARK, P2MSEL6_0, P2MSEL5_1, PJ2_FN), | ||
528 | PINMUX_DATA(FSTATUS_MARK, P2MSEL6_0, P2MSEL5_0, PJ2_FN), | ||
529 | PINMUX_DATA(SSI3_SDATA_MARK, P2MSEL6_1, P2MSEL5_1, PJ2_FN), | ||
530 | PINMUX_DATA(SCIF4_TXD_MARK, P2MSEL6_1, P2MSEL5_0, PJ1_FN), | ||
531 | PINMUX_DATA(DRAK0_MARK, P2MSEL6_0, P2MSEL5_1, PJ1_FN), | ||
532 | PINMUX_DATA(FSE_MARK, P2MSEL6_0, P2MSEL5_0, PJ1_FN), | ||
533 | PINMUX_DATA(SSI3_SCK_MARK, P2MSEL6_1, P2MSEL5_1, PJ1_FN), | ||
534 | }; | ||
535 | |||
536 | static struct pinmux_gpio pinmux_gpios[] = { | ||
537 | /* PA */ | ||
538 | PINMUX_GPIO(GPIO_PA7, PA7_DATA), | ||
539 | PINMUX_GPIO(GPIO_PA6, PA6_DATA), | ||
540 | PINMUX_GPIO(GPIO_PA5, PA5_DATA), | ||
541 | PINMUX_GPIO(GPIO_PA4, PA4_DATA), | ||
542 | PINMUX_GPIO(GPIO_PA3, PA3_DATA), | ||
543 | PINMUX_GPIO(GPIO_PA2, PA2_DATA), | ||
544 | PINMUX_GPIO(GPIO_PA1, PA1_DATA), | ||
545 | PINMUX_GPIO(GPIO_PA0, PA0_DATA), | ||
546 | |||
547 | /* PB */ | ||
548 | PINMUX_GPIO(GPIO_PB7, PB7_DATA), | ||
549 | PINMUX_GPIO(GPIO_PB6, PB6_DATA), | ||
550 | PINMUX_GPIO(GPIO_PB5, PB5_DATA), | ||
551 | PINMUX_GPIO(GPIO_PB4, PB4_DATA), | ||
552 | PINMUX_GPIO(GPIO_PB3, PB3_DATA), | ||
553 | PINMUX_GPIO(GPIO_PB2, PB2_DATA), | ||
554 | PINMUX_GPIO(GPIO_PB1, PB1_DATA), | ||
555 | PINMUX_GPIO(GPIO_PB0, PB0_DATA), | ||
556 | |||
557 | /* PC */ | ||
558 | PINMUX_GPIO(GPIO_PC7, PC7_DATA), | ||
559 | PINMUX_GPIO(GPIO_PC6, PC6_DATA), | ||
560 | PINMUX_GPIO(GPIO_PC5, PC5_DATA), | ||
561 | PINMUX_GPIO(GPIO_PC4, PC4_DATA), | ||
562 | PINMUX_GPIO(GPIO_PC3, PC3_DATA), | ||
563 | PINMUX_GPIO(GPIO_PC2, PC2_DATA), | ||
564 | PINMUX_GPIO(GPIO_PC1, PC1_DATA), | ||
565 | PINMUX_GPIO(GPIO_PC0, PC0_DATA), | ||
566 | |||
567 | /* PD */ | ||
568 | PINMUX_GPIO(GPIO_PD7, PD7_DATA), | ||
569 | PINMUX_GPIO(GPIO_PD6, PD6_DATA), | ||
570 | PINMUX_GPIO(GPIO_PD5, PD5_DATA), | ||
571 | PINMUX_GPIO(GPIO_PD4, PD4_DATA), | ||
572 | PINMUX_GPIO(GPIO_PD3, PD3_DATA), | ||
573 | PINMUX_GPIO(GPIO_PD2, PD2_DATA), | ||
574 | PINMUX_GPIO(GPIO_PD1, PD1_DATA), | ||
575 | PINMUX_GPIO(GPIO_PD0, PD0_DATA), | ||
576 | |||
577 | /* PE */ | ||
578 | PINMUX_GPIO(GPIO_PE5, PE7_DATA), | ||
579 | PINMUX_GPIO(GPIO_PE4, PE6_DATA), | ||
580 | |||
581 | /* PF */ | ||
582 | PINMUX_GPIO(GPIO_PF7, PF7_DATA), | ||
583 | PINMUX_GPIO(GPIO_PF6, PF6_DATA), | ||
584 | PINMUX_GPIO(GPIO_PF5, PF5_DATA), | ||
585 | PINMUX_GPIO(GPIO_PF4, PF4_DATA), | ||
586 | PINMUX_GPIO(GPIO_PF3, PF3_DATA), | ||
587 | PINMUX_GPIO(GPIO_PF2, PF2_DATA), | ||
588 | PINMUX_GPIO(GPIO_PF1, PF1_DATA), | ||
589 | PINMUX_GPIO(GPIO_PF0, PF0_DATA), | ||
590 | |||
591 | /* PG */ | ||
592 | PINMUX_GPIO(GPIO_PG7, PG7_DATA), | ||
593 | PINMUX_GPIO(GPIO_PG6, PG6_DATA), | ||
594 | PINMUX_GPIO(GPIO_PG5, PG5_DATA), | ||
595 | |||
596 | /* PH */ | ||
597 | PINMUX_GPIO(GPIO_PH7, PH7_DATA), | ||
598 | PINMUX_GPIO(GPIO_PH6, PH6_DATA), | ||
599 | PINMUX_GPIO(GPIO_PH5, PH5_DATA), | ||
600 | PINMUX_GPIO(GPIO_PH4, PH4_DATA), | ||
601 | PINMUX_GPIO(GPIO_PH3, PH3_DATA), | ||
602 | PINMUX_GPIO(GPIO_PH2, PH2_DATA), | ||
603 | PINMUX_GPIO(GPIO_PH1, PH1_DATA), | ||
604 | PINMUX_GPIO(GPIO_PH0, PH0_DATA), | ||
605 | |||
606 | /* PJ */ | ||
607 | PINMUX_GPIO(GPIO_PJ7, PJ7_DATA), | ||
608 | PINMUX_GPIO(GPIO_PJ6, PJ6_DATA), | ||
609 | PINMUX_GPIO(GPIO_PJ5, PJ5_DATA), | ||
610 | PINMUX_GPIO(GPIO_PJ4, PJ4_DATA), | ||
611 | PINMUX_GPIO(GPIO_PJ3, PJ3_DATA), | ||
612 | PINMUX_GPIO(GPIO_PJ2, PJ2_DATA), | ||
613 | PINMUX_GPIO(GPIO_PJ1, PJ1_DATA), | ||
614 | |||
615 | /* FN */ | ||
616 | PINMUX_GPIO(GPIO_FN_CDE, CDE_MARK), | ||
617 | PINMUX_GPIO(GPIO_FN_ETH_MAGIC, ETH_MAGIC_MARK), | ||
618 | PINMUX_GPIO(GPIO_FN_DISP, DISP_MARK), | ||
619 | PINMUX_GPIO(GPIO_FN_ETH_LINK, ETH_LINK_MARK), | ||
620 | PINMUX_GPIO(GPIO_FN_DR5, DR5_MARK), | ||
621 | PINMUX_GPIO(GPIO_FN_ETH_TX_ER, ETH_TX_ER_MARK), | ||
622 | PINMUX_GPIO(GPIO_FN_DR4, DR4_MARK), | ||
623 | PINMUX_GPIO(GPIO_FN_ETH_TX_EN, ETH_TX_EN_MARK), | ||
624 | PINMUX_GPIO(GPIO_FN_DR3, DR3_MARK), | ||
625 | PINMUX_GPIO(GPIO_FN_ETH_TXD3, ETH_TXD3_MARK), | ||
626 | PINMUX_GPIO(GPIO_FN_DR2, DR2_MARK), | ||
627 | PINMUX_GPIO(GPIO_FN_ETH_TXD2, ETH_TXD2_MARK), | ||
628 | PINMUX_GPIO(GPIO_FN_DR1, DR1_MARK), | ||
629 | PINMUX_GPIO(GPIO_FN_ETH_TXD1, ETH_TXD1_MARK), | ||
630 | PINMUX_GPIO(GPIO_FN_DR0, DR0_MARK), | ||
631 | PINMUX_GPIO(GPIO_FN_ETH_TXD0, ETH_TXD0_MARK), | ||
632 | PINMUX_GPIO(GPIO_FN_VSYNC, VSYNC_MARK), | ||
633 | PINMUX_GPIO(GPIO_FN_HSPI_CLK, HSPI_CLK_MARK), | ||
634 | PINMUX_GPIO(GPIO_FN_ODDF, ODDF_MARK), | ||
635 | PINMUX_GPIO(GPIO_FN_HSPI_CS, HSPI_CS_MARK), | ||
636 | PINMUX_GPIO(GPIO_FN_DG5, DG5_MARK), | ||
637 | PINMUX_GPIO(GPIO_FN_ETH_MDIO, ETH_MDIO_MARK), | ||
638 | PINMUX_GPIO(GPIO_FN_DG4, DG4_MARK), | ||
639 | PINMUX_GPIO(GPIO_FN_ETH_RX_CLK, ETH_RX_CLK_MARK), | ||
640 | PINMUX_GPIO(GPIO_FN_DG3, DG3_MARK), | ||
641 | PINMUX_GPIO(GPIO_FN_ETH_MDC, ETH_MDC_MARK), | ||
642 | PINMUX_GPIO(GPIO_FN_DG2, DG2_MARK), | ||
643 | PINMUX_GPIO(GPIO_FN_ETH_COL, ETH_COL_MARK), | ||
644 | PINMUX_GPIO(GPIO_FN_DG1, DG1_MARK), | ||
645 | PINMUX_GPIO(GPIO_FN_ETH_TX_CLK, ETH_TX_CLK_MARK), | ||
646 | PINMUX_GPIO(GPIO_FN_DG0, DG0_MARK), | ||
647 | PINMUX_GPIO(GPIO_FN_ETH_CRS, ETH_CRS_MARK), | ||
648 | PINMUX_GPIO(GPIO_FN_DCLKIN, DCLKIN_MARK), | ||
649 | PINMUX_GPIO(GPIO_FN_HSPI_RX, HSPI_RX_MARK), | ||
650 | PINMUX_GPIO(GPIO_FN_HSYNC, HSYNC_MARK), | ||
651 | PINMUX_GPIO(GPIO_FN_HSPI_TX, HSPI_TX_MARK), | ||
652 | PINMUX_GPIO(GPIO_FN_DB5, DB5_MARK), | ||
653 | PINMUX_GPIO(GPIO_FN_ETH_RXD3, ETH_RXD3_MARK), | ||
654 | PINMUX_GPIO(GPIO_FN_DB4, DB4_MARK), | ||
655 | PINMUX_GPIO(GPIO_FN_ETH_RXD2, ETH_RXD2_MARK), | ||
656 | PINMUX_GPIO(GPIO_FN_DB3, DB3_MARK), | ||
657 | PINMUX_GPIO(GPIO_FN_ETH_RXD1, ETH_RXD1_MARK), | ||
658 | PINMUX_GPIO(GPIO_FN_DB2, DB2_MARK), | ||
659 | PINMUX_GPIO(GPIO_FN_ETH_RXD0, ETH_RXD0_MARK), | ||
660 | PINMUX_GPIO(GPIO_FN_DB1, DB1_MARK), | ||
661 | PINMUX_GPIO(GPIO_FN_ETH_RX_DV, ETH_RX_DV_MARK), | ||
662 | PINMUX_GPIO(GPIO_FN_DB0, DB0_MARK), | ||
663 | PINMUX_GPIO(GPIO_FN_ETH_RX_ER, ETH_RX_ER_MARK), | ||
664 | PINMUX_GPIO(GPIO_FN_DCLKOUT, DCLKOUT_MARK), | ||
665 | PINMUX_GPIO(GPIO_FN_SCIF1_SLK, SCIF1_SLK_MARK), | ||
666 | PINMUX_GPIO(GPIO_FN_SCIF1_RXD, SCIF1_RXD_MARK), | ||
667 | PINMUX_GPIO(GPIO_FN_SCIF1_TXD, SCIF1_TXD_MARK), | ||
668 | PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK), | ||
669 | PINMUX_GPIO(GPIO_FN_BACK, BACK_MARK), | ||
670 | PINMUX_GPIO(GPIO_FN_FALE, FALE_MARK), | ||
671 | PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK), | ||
672 | PINMUX_GPIO(GPIO_FN_FCLE, FCLE_MARK), | ||
673 | PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK), | ||
674 | PINMUX_GPIO(GPIO_FN_BREQ, BREQ_MARK), | ||
675 | PINMUX_GPIO(GPIO_FN_USB_OVC1, USB_OVC1_MARK), | ||
676 | PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK), | ||
677 | PINMUX_GPIO(GPIO_FN_USB_OVC0, USB_OVC0_MARK), | ||
678 | PINMUX_GPIO(GPIO_FN_USB_PENC1, USB_PENC1_MARK), | ||
679 | PINMUX_GPIO(GPIO_FN_USB_PENC0, USB_PENC0_MARK), | ||
680 | PINMUX_GPIO(GPIO_FN_HAC1_SDOUT, HAC1_SDOUT_MARK), | ||
681 | PINMUX_GPIO(GPIO_FN_SSI1_SDATA, SSI1_SDATA_MARK), | ||
682 | PINMUX_GPIO(GPIO_FN_SDIF1CMD, SDIF1CMD_MARK), | ||
683 | PINMUX_GPIO(GPIO_FN_HAC1_SDIN, HAC1_SDIN_MARK), | ||
684 | PINMUX_GPIO(GPIO_FN_SSI1_SCK, SSI1_SCK_MARK), | ||
685 | PINMUX_GPIO(GPIO_FN_SDIF1CD, SDIF1CD_MARK), | ||
686 | PINMUX_GPIO(GPIO_FN_HAC1_SYNC, HAC1_SYNC_MARK), | ||
687 | PINMUX_GPIO(GPIO_FN_SSI1_WS, SSI1_WS_MARK), | ||
688 | PINMUX_GPIO(GPIO_FN_SDIF1WP, SDIF1WP_MARK), | ||
689 | PINMUX_GPIO(GPIO_FN_HAC1_BITCLK, HAC1_BITCLK_MARK), | ||
690 | PINMUX_GPIO(GPIO_FN_SSI1_CLK, SSI1_CLK_MARK), | ||
691 | PINMUX_GPIO(GPIO_FN_SDIF1CLK, SDIF1CLK_MARK), | ||
692 | PINMUX_GPIO(GPIO_FN_HAC0_SDOUT, HAC0_SDOUT_MARK), | ||
693 | PINMUX_GPIO(GPIO_FN_SSI0_SDATA, SSI0_SDATA_MARK), | ||
694 | PINMUX_GPIO(GPIO_FN_SDIF1D3, SDIF1D3_MARK), | ||
695 | PINMUX_GPIO(GPIO_FN_HAC0_SDIN, HAC0_SDIN_MARK), | ||
696 | PINMUX_GPIO(GPIO_FN_SSI0_SCK, SSI0_SCK_MARK), | ||
697 | PINMUX_GPIO(GPIO_FN_SDIF1D2, SDIF1D2_MARK), | ||
698 | PINMUX_GPIO(GPIO_FN_HAC0_SYNC, HAC0_SYNC_MARK), | ||
699 | PINMUX_GPIO(GPIO_FN_SSI0_WS, SSI0_WS_MARK), | ||
700 | PINMUX_GPIO(GPIO_FN_SDIF1D1, SDIF1D1_MARK), | ||
701 | PINMUX_GPIO(GPIO_FN_HAC0_BITCLK, HAC0_BITCLK_MARK), | ||
702 | PINMUX_GPIO(GPIO_FN_SSI0_CLK, SSI0_CLK_MARK), | ||
703 | PINMUX_GPIO(GPIO_FN_SDIF1D0, SDIF1D0_MARK), | ||
704 | PINMUX_GPIO(GPIO_FN_SCIF3_SCK, SCIF3_SCK_MARK), | ||
705 | PINMUX_GPIO(GPIO_FN_SSI2_SDATA, SSI2_SDATA_MARK), | ||
706 | PINMUX_GPIO(GPIO_FN_SCIF3_RXD, SCIF3_RXD_MARK), | ||
707 | PINMUX_GPIO(GPIO_FN_TCLK, TCLK_MARK), | ||
708 | PINMUX_GPIO(GPIO_FN_SSI2_SCK, SSI2_SCK_MARK), | ||
709 | PINMUX_GPIO(GPIO_FN_SCIF3_TXD, SCIF3_TXD_MARK), | ||
710 | PINMUX_GPIO(GPIO_FN_HAC_RES, HAC_RES_MARK), | ||
711 | PINMUX_GPIO(GPIO_FN_SSI2_WS, SSI2_WS_MARK), | ||
712 | PINMUX_GPIO(GPIO_FN_DACK3, DACK3_MARK), | ||
713 | PINMUX_GPIO(GPIO_FN_SDIF0CMD, SDIF0CMD_MARK), | ||
714 | PINMUX_GPIO(GPIO_FN_DACK2, DACK2_MARK), | ||
715 | PINMUX_GPIO(GPIO_FN_SDIF0CD, SDIF0CD_MARK), | ||
716 | PINMUX_GPIO(GPIO_FN_DREQ3, DREQ3_MARK), | ||
717 | PINMUX_GPIO(GPIO_FN_SDIF0WP, SDIF0WP_MARK), | ||
718 | PINMUX_GPIO(GPIO_FN_SCIF0_CTS, SCIF0_CTS_MARK), | ||
719 | PINMUX_GPIO(GPIO_FN_DREQ2, DREQ2_MARK), | ||
720 | PINMUX_GPIO(GPIO_FN_SDIF0CLK, SDIF0CLK_MARK), | ||
721 | PINMUX_GPIO(GPIO_FN_SCIF0_RTS, SCIF0_RTS_MARK), | ||
722 | PINMUX_GPIO(GPIO_FN_IRL7, IRL7_MARK), | ||
723 | PINMUX_GPIO(GPIO_FN_SDIF0D3, SDIF0D3_MARK), | ||
724 | PINMUX_GPIO(GPIO_FN_SCIF0_SCK, SCIF0_SCK_MARK), | ||
725 | PINMUX_GPIO(GPIO_FN_IRL6, IRL6_MARK), | ||
726 | PINMUX_GPIO(GPIO_FN_SDIF0D2, SDIF0D2_MARK), | ||
727 | PINMUX_GPIO(GPIO_FN_SCIF0_RXD, SCIF0_RXD_MARK), | ||
728 | PINMUX_GPIO(GPIO_FN_IRL5, IRL5_MARK), | ||
729 | PINMUX_GPIO(GPIO_FN_SDIF0D1, SDIF0D1_MARK), | ||
730 | PINMUX_GPIO(GPIO_FN_SCIF0_TXD, SCIF0_TXD_MARK), | ||
731 | PINMUX_GPIO(GPIO_FN_IRL4, IRL4_MARK), | ||
732 | PINMUX_GPIO(GPIO_FN_SDIF0D0, SDIF0D0_MARK), | ||
733 | PINMUX_GPIO(GPIO_FN_SCIF5_SCK, SCIF5_SCK_MARK), | ||
734 | PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK), | ||
735 | PINMUX_GPIO(GPIO_FN_SCIF5_RXD, SCIF5_RXD_MARK), | ||
736 | PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK), | ||
737 | PINMUX_GPIO(GPIO_FN_SCIF5_TXD, SCIF5_TXD_MARK), | ||
738 | PINMUX_GPIO(GPIO_FN_CE2B, CE2B_MARK), | ||
739 | PINMUX_GPIO(GPIO_FN_DRAK3, DRAK3_MARK), | ||
740 | PINMUX_GPIO(GPIO_FN_CE2A, CE2A_MARK), | ||
741 | PINMUX_GPIO(GPIO_FN_SCIF4_SCK, SCIF4_SCK_MARK), | ||
742 | PINMUX_GPIO(GPIO_FN_DRAK2, DRAK2_MARK), | ||
743 | PINMUX_GPIO(GPIO_FN_SSI3_WS, SSI3_WS_MARK), | ||
744 | PINMUX_GPIO(GPIO_FN_SCIF4_RXD, SCIF4_RXD_MARK), | ||
745 | PINMUX_GPIO(GPIO_FN_DRAK1, DRAK1_MARK), | ||
746 | PINMUX_GPIO(GPIO_FN_SSI3_SDATA, SSI3_SDATA_MARK), | ||
747 | PINMUX_GPIO(GPIO_FN_FSTATUS, FSTATUS_MARK), | ||
748 | PINMUX_GPIO(GPIO_FN_SCIF4_TXD, SCIF4_TXD_MARK), | ||
749 | PINMUX_GPIO(GPIO_FN_DRAK0, DRAK0_MARK), | ||
750 | PINMUX_GPIO(GPIO_FN_SSI3_SCK, SSI3_SCK_MARK), | ||
751 | PINMUX_GPIO(GPIO_FN_FSE, FSE_MARK), | ||
752 | }; | ||
753 | |||
754 | static struct pinmux_cfg_reg pinmux_config_regs[] = { | ||
755 | { PINMUX_CFG_REG("PACR", 0xffcc0000, 16, 2) { | ||
756 | PA7_FN, PA7_OUT, PA7_IN, PA7_IN_PU, | ||
757 | PA6_FN, PA6_OUT, PA6_IN, PA6_IN_PU, | ||
758 | PA5_FN, PA5_OUT, PA5_IN, PA5_IN_PU, | ||
759 | PA4_FN, PA4_OUT, PA4_IN, PA4_IN_PU, | ||
760 | PA3_FN, PA3_OUT, PA3_IN, PA3_IN_PU, | ||
761 | PA2_FN, PA2_OUT, PA2_IN, PA2_IN_PU, | ||
762 | PA1_FN, PA1_OUT, PA1_IN, PA1_IN_PU, | ||
763 | PA0_FN, PA0_OUT, PA0_IN, PA0_IN_PU } | ||
764 | }, | ||
765 | { PINMUX_CFG_REG("PBCR", 0xffcc0002, 16, 2) { | ||
766 | PB7_FN, PB7_OUT, PB7_IN, PB7_IN_PU, | ||
767 | PB6_FN, PB6_OUT, PB6_IN, PB6_IN_PU, | ||
768 | PB5_FN, PB5_OUT, PB5_IN, PB5_IN_PU, | ||
769 | PB4_FN, PB4_OUT, PB4_IN, PB4_IN_PU, | ||
770 | PB3_FN, PB3_OUT, PB3_IN, PB3_IN_PU, | ||
771 | PB2_FN, PB2_OUT, PB2_IN, PB2_IN_PU, | ||
772 | PB1_FN, PB1_OUT, PB1_IN, PB1_IN_PU, | ||
773 | PB0_FN, PB0_OUT, PB0_IN, PB0_IN_PU } | ||
774 | }, | ||
775 | { PINMUX_CFG_REG("PCCR", 0xffcc0004, 16, 2) { | ||
776 | PC7_FN, PC7_OUT, PC7_IN, PC7_IN_PU, | ||
777 | PC6_FN, PC6_OUT, PC6_IN, PC6_IN_PU, | ||
778 | PC5_FN, PC5_OUT, PC5_IN, PC5_IN_PU, | ||
779 | PC4_FN, PC4_OUT, PC4_IN, PC4_IN_PU, | ||
780 | PC3_FN, PC3_OUT, PC3_IN, PC3_IN_PU, | ||
781 | PC2_FN, PC2_OUT, PC2_IN, PC2_IN_PU, | ||
782 | PC1_FN, PC1_OUT, PC1_IN, PC1_IN_PU, | ||
783 | PC0_FN, PC0_OUT, PC0_IN, PC0_IN_PU } | ||
784 | }, | ||
785 | { PINMUX_CFG_REG("PDCR", 0xffcc0006, 16, 2) { | ||
786 | PD7_FN, PD7_OUT, PD7_IN, PD7_IN_PU, | ||
787 | PD6_FN, PD6_OUT, PD6_IN, PD6_IN_PU, | ||
788 | PD5_FN, PD5_OUT, PD5_IN, PD5_IN_PU, | ||
789 | PD4_FN, PD4_OUT, PD4_IN, PD4_IN_PU, | ||
790 | PD3_FN, PD3_OUT, PD3_IN, PD3_IN_PU, | ||
791 | PD2_FN, PD2_OUT, PD2_IN, PD2_IN_PU, | ||
792 | PD1_FN, PD1_OUT, PD1_IN, PD1_IN_PU, | ||
793 | PD0_FN, PD0_OUT, PD0_IN, PD0_IN_PU } | ||
794 | }, | ||
795 | { PINMUX_CFG_REG("PECR", 0xffcc0008, 16, 2) { | ||
796 | PE7_FN, PE7_OUT, PE7_IN, PE7_IN_PU, | ||
797 | PE6_FN, PE6_OUT, PE6_IN, PE6_IN_PU, | ||
798 | 0, 0, 0, 0, | ||
799 | 0, 0, 0, 0, | ||
800 | 0, 0, 0, 0, | ||
801 | 0, 0, 0, 0, | ||
802 | 0, 0, 0, 0, | ||
803 | 0, 0, 0, 0, } | ||
804 | }, | ||
805 | { PINMUX_CFG_REG("PFCR", 0xffcc000a, 16, 2) { | ||
806 | PF7_FN, PF7_OUT, PF7_IN, PF7_IN_PU, | ||
807 | PF6_FN, PF6_OUT, PF6_IN, PF6_IN_PU, | ||
808 | PF5_FN, PF5_OUT, PF5_IN, PF5_IN_PU, | ||
809 | PF4_FN, PF4_OUT, PF4_IN, PF4_IN_PU, | ||
810 | PF3_FN, PF3_OUT, PF3_IN, PF3_IN_PU, | ||
811 | PF2_FN, PF2_OUT, PF2_IN, PF2_IN_PU, | ||
812 | PF1_FN, PF1_OUT, PF1_IN, PF1_IN_PU, | ||
813 | PF0_FN, PF0_OUT, PF0_IN, PF0_IN_PU } | ||
814 | }, | ||
815 | { PINMUX_CFG_REG("PGCR", 0xffcc000c, 16, 2) { | ||
816 | PG7_FN, PG7_OUT, PG7_IN, PG7_IN_PU, | ||
817 | PG6_FN, PG6_OUT, PG6_IN, PG6_IN_PU, | ||
818 | PG5_FN, PG5_OUT, PG5_IN, PG5_IN_PU, | ||
819 | 0, 0, 0, 0, | ||
820 | 0, 0, 0, 0, | ||
821 | 0, 0, 0, 0, | ||
822 | 0, 0, 0, 0, | ||
823 | 0, 0, 0, 0, } | ||
824 | }, | ||
825 | { PINMUX_CFG_REG("PHCR", 0xffcc000e, 16, 2) { | ||
826 | PH7_FN, PH7_OUT, PH7_IN, PH7_IN_PU, | ||
827 | PH6_FN, PH6_OUT, PH6_IN, PH6_IN_PU, | ||
828 | PH5_FN, PH5_OUT, PH5_IN, PH5_IN_PU, | ||
829 | PH4_FN, PH4_OUT, PH4_IN, PH4_IN_PU, | ||
830 | PH3_FN, PH3_OUT, PH3_IN, PH3_IN_PU, | ||
831 | PH2_FN, PH2_OUT, PH2_IN, PH2_IN_PU, | ||
832 | PH1_FN, PH1_OUT, PH1_IN, PH1_IN_PU, | ||
833 | PH0_FN, PH0_OUT, PH0_IN, PH0_IN_PU } | ||
834 | }, | ||
835 | { PINMUX_CFG_REG("PJCR", 0xffcc0010, 16, 2) { | ||
836 | PJ7_FN, PJ7_OUT, PJ7_IN, PJ7_IN_PU, | ||
837 | PJ6_FN, PJ6_OUT, PJ6_IN, PJ6_IN_PU, | ||
838 | PJ5_FN, PJ5_OUT, PJ5_IN, PJ5_IN_PU, | ||
839 | PJ4_FN, PJ4_OUT, PJ4_IN, PJ4_IN_PU, | ||
840 | PJ3_FN, PJ3_OUT, PJ3_IN, PJ3_IN_PU, | ||
841 | PJ2_FN, PJ2_OUT, PJ2_IN, PJ2_IN_PU, | ||
842 | PJ1_FN, PJ1_OUT, PJ1_IN, PJ1_IN_PU, | ||
843 | 0, 0, 0, 0, } | ||
844 | }, | ||
845 | { PINMUX_CFG_REG("P1MSELR", 0xffcc0080, 16, 1) { | ||
846 | 0, 0, | ||
847 | P1MSEL14_0, P1MSEL14_1, | ||
848 | P1MSEL13_0, P1MSEL13_1, | ||
849 | P1MSEL12_0, P1MSEL12_1, | ||
850 | P1MSEL11_0, P1MSEL11_1, | ||
851 | P1MSEL10_0, P1MSEL10_1, | ||
852 | P1MSEL9_0, P1MSEL9_1, | ||
853 | P1MSEL8_0, P1MSEL8_1, | ||
854 | P1MSEL7_0, P1MSEL7_1, | ||
855 | P1MSEL6_0, P1MSEL6_1, | ||
856 | P1MSEL5_0, P1MSEL5_1, | ||
857 | P1MSEL4_0, P1MSEL4_1, | ||
858 | P1MSEL3_0, P1MSEL3_1, | ||
859 | P1MSEL2_0, P1MSEL2_1, | ||
860 | P1MSEL1_0, P1MSEL1_1, | ||
861 | P1MSEL0_0, P1MSEL0_1 } | ||
862 | }, | ||
863 | { PINMUX_CFG_REG("P2MSELR", 0xffcc0082, 16, 1) { | ||
864 | P2MSEL15_0, P2MSEL15_1, | ||
865 | P2MSEL14_0, P2MSEL14_1, | ||
866 | P2MSEL13_0, P2MSEL13_1, | ||
867 | P2MSEL12_0, P2MSEL12_1, | ||
868 | P2MSEL11_0, P2MSEL11_1, | ||
869 | P2MSEL10_0, P2MSEL10_1, | ||
870 | P2MSEL9_0, P2MSEL9_1, | ||
871 | P2MSEL8_0, P2MSEL8_1, | ||
872 | P2MSEL7_0, P2MSEL7_1, | ||
873 | P2MSEL6_0, P2MSEL6_1, | ||
874 | P2MSEL5_0, P2MSEL5_1, | ||
875 | P2MSEL4_0, P2MSEL4_1, | ||
876 | P2MSEL3_0, P2MSEL3_1, | ||
877 | P2MSEL2_0, P2MSEL2_1, | ||
878 | P2MSEL1_0, P2MSEL1_1, | ||
879 | P2MSEL0_0, P2MSEL0_1 } | ||
880 | }, | ||
881 | {} | ||
882 | }; | ||
883 | |||
884 | static struct pinmux_data_reg pinmux_data_regs[] = { | ||
885 | { PINMUX_DATA_REG("PADR", 0xffcc0020, 8) { | ||
886 | PA7_DATA, PA6_DATA, PA5_DATA, PA4_DATA, | ||
887 | PA3_DATA, PA2_DATA, PA1_DATA, PA0_DATA } | ||
888 | }, | ||
889 | { PINMUX_DATA_REG("PBDR", 0xffcc0022, 8) { | ||
890 | PB7_DATA, PB6_DATA, PB5_DATA, PB4_DATA, | ||
891 | PB3_DATA, PB2_DATA, PB1_DATA, PB0_DATA } | ||
892 | }, | ||
893 | { PINMUX_DATA_REG("PCDR", 0xffcc0024, 8) { | ||
894 | PC7_DATA, PC6_DATA, PC5_DATA, PC4_DATA, | ||
895 | PC3_DATA, PC2_DATA, PC1_DATA, PC0_DATA } | ||
896 | }, | ||
897 | { PINMUX_DATA_REG("PDDR", 0xffcc0026, 8) { | ||
898 | PD7_DATA, PD6_DATA, PD5_DATA, PD4_DATA, | ||
899 | PD3_DATA, PD2_DATA, PD1_DATA, PD0_DATA } | ||
900 | }, | ||
901 | { PINMUX_DATA_REG("PEDR", 0xffcc0028, 8) { | ||
902 | PE7_DATA, PE6_DATA, | ||
903 | 0, 0, 0, 0, 0, 0 } | ||
904 | }, | ||
905 | { PINMUX_DATA_REG("PFDR", 0xffcc002a, 8) { | ||
906 | PF7_DATA, PF6_DATA, PF5_DATA, PF4_DATA, | ||
907 | PF3_DATA, PF2_DATA, PF1_DATA, PF0_DATA } | ||
908 | }, | ||
909 | { PINMUX_DATA_REG("PGDR", 0xffcc002c, 8) { | ||
910 | PG7_DATA, PG6_DATA, PG5_DATA, 0, | ||
911 | 0, 0, 0, 0 } | ||
912 | }, | ||
913 | { PINMUX_DATA_REG("PHDR", 0xffcc002e, 8) { | ||
914 | PH7_DATA, PH6_DATA, PH5_DATA, PH4_DATA, | ||
915 | PH3_DATA, PH2_DATA, PH1_DATA, PH0_DATA } | ||
916 | }, | ||
917 | { PINMUX_DATA_REG("PJDR", 0xffcc0030, 8) { | ||
918 | PJ7_DATA, PJ6_DATA, PJ5_DATA, PJ4_DATA, | ||
919 | PJ3_DATA, PJ2_DATA, PJ1_DATA, 0 } | ||
920 | }, | ||
921 | { }, | ||
922 | }; | ||
923 | |||
924 | static struct pinmux_info sh7786_pinmux_info = { | ||
925 | .name = "sh7786_pfc", | ||
926 | .reserved_id = PINMUX_RESERVED, | ||
927 | .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END }, | ||
928 | .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END }, | ||
929 | .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END }, | ||
930 | .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END }, | ||
931 | .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END }, | ||
932 | .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END }, | ||
933 | |||
934 | .first_gpio = GPIO_PA7, | ||
935 | .last_gpio = GPIO_FN_FSE, | ||
936 | |||
937 | .gpios = pinmux_gpios, | ||
938 | .cfg_regs = pinmux_config_regs, | ||
939 | .data_regs = pinmux_data_regs, | ||
940 | |||
941 | .gpio_data = pinmux_data, | ||
942 | .gpio_data_size = ARRAY_SIZE(pinmux_data), | ||
943 | }; | ||
944 | |||
945 | static int __init plat_pinmux_setup(void) | ||
946 | { | ||
947 | return register_pinmux(&sh7786_pinmux_info); | ||
948 | } | ||
949 | |||
950 | arch_initcall(plat_pinmux_setup); | ||
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7343.c b/arch/sh/kernel/cpu/sh4a/setup-sh7343.c index 4ff4dc64520c..c1549382c87c 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7343.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7343.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <linux/serial_sci.h> | 13 | #include <linux/serial_sci.h> |
14 | #include <linux/uio_driver.h> | 14 | #include <linux/uio_driver.h> |
15 | #include <linux/sh_cmt.h> | ||
15 | #include <asm/clock.h> | 16 | #include <asm/clock.h> |
16 | 17 | ||
17 | static struct resource iic0_resources[] = { | 18 | static struct resource iic0_resources[] = { |
@@ -140,6 +141,38 @@ static struct platform_device jpu_device = { | |||
140 | .num_resources = ARRAY_SIZE(jpu_resources), | 141 | .num_resources = ARRAY_SIZE(jpu_resources), |
141 | }; | 142 | }; |
142 | 143 | ||
144 | static struct sh_cmt_config cmt_platform_data = { | ||
145 | .name = "CMT", | ||
146 | .channel_offset = 0x60, | ||
147 | .timer_bit = 5, | ||
148 | .clk = "cmt0", | ||
149 | .clockevent_rating = 125, | ||
150 | .clocksource_rating = 200, | ||
151 | }; | ||
152 | |||
153 | static struct resource cmt_resources[] = { | ||
154 | [0] = { | ||
155 | .name = "CMT", | ||
156 | .start = 0x044a0060, | ||
157 | .end = 0x044a006b, | ||
158 | .flags = IORESOURCE_MEM, | ||
159 | }, | ||
160 | [1] = { | ||
161 | .start = 104, | ||
162 | .flags = IORESOURCE_IRQ, | ||
163 | }, | ||
164 | }; | ||
165 | |||
166 | static struct platform_device cmt_device = { | ||
167 | .name = "sh_cmt", | ||
168 | .id = 0, | ||
169 | .dev = { | ||
170 | .platform_data = &cmt_platform_data, | ||
171 | }, | ||
172 | .resource = cmt_resources, | ||
173 | .num_resources = ARRAY_SIZE(cmt_resources), | ||
174 | }; | ||
175 | |||
143 | static struct plat_sci_port sci_platform_data[] = { | 176 | static struct plat_sci_port sci_platform_data[] = { |
144 | { | 177 | { |
145 | .mapbase = 0xffe00000, | 178 | .mapbase = 0xffe00000, |
@@ -175,6 +208,7 @@ static struct platform_device sci_device = { | |||
175 | }; | 208 | }; |
176 | 209 | ||
177 | static struct platform_device *sh7343_devices[] __initdata = { | 210 | static struct platform_device *sh7343_devices[] __initdata = { |
211 | &cmt_device, | ||
178 | &iic0_device, | 212 | &iic0_device, |
179 | &iic1_device, | 213 | &iic1_device, |
180 | &sci_device, | 214 | &sci_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c index 839ae97a7fd2..93ecf8ed5c6c 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/serial.h> | 14 | #include <linux/serial.h> |
15 | #include <linux/serial_sci.h> | 15 | #include <linux/serial_sci.h> |
16 | #include <linux/uio_driver.h> | 16 | #include <linux/uio_driver.h> |
17 | #include <linux/sh_cmt.h> | ||
17 | #include <asm/clock.h> | 18 | #include <asm/clock.h> |
18 | 19 | ||
19 | static struct resource iic_resources[] = { | 20 | static struct resource iic_resources[] = { |
@@ -147,6 +148,38 @@ static struct platform_device veu1_device = { | |||
147 | .num_resources = ARRAY_SIZE(veu1_resources), | 148 | .num_resources = ARRAY_SIZE(veu1_resources), |
148 | }; | 149 | }; |
149 | 150 | ||
151 | static struct sh_cmt_config cmt_platform_data = { | ||
152 | .name = "CMT", | ||
153 | .channel_offset = 0x60, | ||
154 | .timer_bit = 5, | ||
155 | .clk = "cmt0", | ||
156 | .clockevent_rating = 125, | ||
157 | .clocksource_rating = 200, | ||
158 | }; | ||
159 | |||
160 | static struct resource cmt_resources[] = { | ||
161 | [0] = { | ||
162 | .name = "CMT", | ||
163 | .start = 0x044a0060, | ||
164 | .end = 0x044a006b, | ||
165 | .flags = IORESOURCE_MEM, | ||
166 | }, | ||
167 | [1] = { | ||
168 | .start = 104, | ||
169 | .flags = IORESOURCE_IRQ, | ||
170 | }, | ||
171 | }; | ||
172 | |||
173 | static struct platform_device cmt_device = { | ||
174 | .name = "sh_cmt", | ||
175 | .id = 0, | ||
176 | .dev = { | ||
177 | .platform_data = &cmt_platform_data, | ||
178 | }, | ||
179 | .resource = cmt_resources, | ||
180 | .num_resources = ARRAY_SIZE(cmt_resources), | ||
181 | }; | ||
182 | |||
150 | static struct plat_sci_port sci_platform_data[] = { | 183 | static struct plat_sci_port sci_platform_data[] = { |
151 | { | 184 | { |
152 | .mapbase = 0xffe00000, | 185 | .mapbase = 0xffe00000, |
@@ -167,6 +200,7 @@ static struct platform_device sci_device = { | |||
167 | }; | 200 | }; |
168 | 201 | ||
169 | static struct platform_device *sh7366_devices[] __initdata = { | 202 | static struct platform_device *sh7366_devices[] __initdata = { |
203 | &cmt_device, | ||
170 | &iic_device, | 204 | &iic_device, |
171 | &sci_device, | 205 | &sci_device, |
172 | &usb_host_device, | 206 | &usb_host_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c index 5146afc156e0..0e5d204bc792 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/serial_sci.h> | 13 | #include <linux/serial_sci.h> |
14 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
15 | #include <linux/uio_driver.h> | 15 | #include <linux/uio_driver.h> |
16 | #include <linux/sh_cmt.h> | ||
16 | #include <asm/clock.h> | 17 | #include <asm/clock.h> |
17 | #include <asm/mmzone.h> | 18 | #include <asm/mmzone.h> |
18 | 19 | ||
@@ -176,6 +177,38 @@ static struct platform_device jpu_device = { | |||
176 | .num_resources = ARRAY_SIZE(jpu_resources), | 177 | .num_resources = ARRAY_SIZE(jpu_resources), |
177 | }; | 178 | }; |
178 | 179 | ||
180 | static struct sh_cmt_config cmt_platform_data = { | ||
181 | .name = "CMT", | ||
182 | .channel_offset = 0x60, | ||
183 | .timer_bit = 5, | ||
184 | .clk = "cmt0", | ||
185 | .clockevent_rating = 125, | ||
186 | .clocksource_rating = 200, | ||
187 | }; | ||
188 | |||
189 | static struct resource cmt_resources[] = { | ||
190 | [0] = { | ||
191 | .name = "CMT", | ||
192 | .start = 0x044a0060, | ||
193 | .end = 0x044a006b, | ||
194 | .flags = IORESOURCE_MEM, | ||
195 | }, | ||
196 | [1] = { | ||
197 | .start = 104, | ||
198 | .flags = IORESOURCE_IRQ, | ||
199 | }, | ||
200 | }; | ||
201 | |||
202 | static struct platform_device cmt_device = { | ||
203 | .name = "sh_cmt", | ||
204 | .id = 0, | ||
205 | .dev = { | ||
206 | .platform_data = &cmt_platform_data, | ||
207 | }, | ||
208 | .resource = cmt_resources, | ||
209 | .num_resources = ARRAY_SIZE(cmt_resources), | ||
210 | }; | ||
211 | |||
179 | static struct plat_sci_port sci_platform_data[] = { | 212 | static struct plat_sci_port sci_platform_data[] = { |
180 | { | 213 | { |
181 | .mapbase = 0xffe00000, | 214 | .mapbase = 0xffe00000, |
@@ -209,6 +242,7 @@ static struct platform_device sci_device = { | |||
209 | }; | 242 | }; |
210 | 243 | ||
211 | static struct platform_device *sh7722_devices[] __initdata = { | 244 | static struct platform_device *sh7722_devices[] __initdata = { |
245 | &cmt_device, | ||
212 | &rtc_device, | 246 | &rtc_device, |
213 | &usbf_device, | 247 | &usbf_device, |
214 | &iic_device, | 248 | &iic_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index 849770d780ae..5338dacbcfba 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/serial_sci.h> | 14 | #include <linux/serial_sci.h> |
15 | #include <linux/uio_driver.h> | 15 | #include <linux/uio_driver.h> |
16 | #include <linux/sh_cmt.h> | ||
16 | #include <asm/clock.h> | 17 | #include <asm/clock.h> |
17 | #include <asm/mmzone.h> | 18 | #include <asm/mmzone.h> |
18 | 19 | ||
@@ -100,6 +101,38 @@ static struct platform_device veu1_device = { | |||
100 | .num_resources = ARRAY_SIZE(veu1_resources), | 101 | .num_resources = ARRAY_SIZE(veu1_resources), |
101 | }; | 102 | }; |
102 | 103 | ||
104 | static struct sh_cmt_config cmt_platform_data = { | ||
105 | .name = "CMT", | ||
106 | .channel_offset = 0x60, | ||
107 | .timer_bit = 5, | ||
108 | .clk = "cmt0", | ||
109 | .clockevent_rating = 125, | ||
110 | .clocksource_rating = 200, | ||
111 | }; | ||
112 | |||
113 | static struct resource cmt_resources[] = { | ||
114 | [0] = { | ||
115 | .name = "CMT", | ||
116 | .start = 0x044a0060, | ||
117 | .end = 0x044a006b, | ||
118 | .flags = IORESOURCE_MEM, | ||
119 | }, | ||
120 | [1] = { | ||
121 | .start = 104, | ||
122 | .flags = IORESOURCE_IRQ, | ||
123 | }, | ||
124 | }; | ||
125 | |||
126 | static struct platform_device cmt_device = { | ||
127 | .name = "sh_cmt", | ||
128 | .id = 0, | ||
129 | .dev = { | ||
130 | .platform_data = &cmt_platform_data, | ||
131 | }, | ||
132 | .resource = cmt_resources, | ||
133 | .num_resources = ARRAY_SIZE(cmt_resources), | ||
134 | }; | ||
135 | |||
103 | static struct plat_sci_port sci_platform_data[] = { | 136 | static struct plat_sci_port sci_platform_data[] = { |
104 | { | 137 | { |
105 | .mapbase = 0xffe00000, | 138 | .mapbase = 0xffe00000, |
@@ -221,6 +254,7 @@ static struct platform_device iic_device = { | |||
221 | }; | 254 | }; |
222 | 255 | ||
223 | static struct platform_device *sh7723_devices[] __initdata = { | 256 | static struct platform_device *sh7723_devices[] __initdata = { |
257 | &cmt_device, | ||
224 | &sci_device, | 258 | &sci_device, |
225 | &rtc_device, | 259 | &rtc_device, |
226 | &iic_device, | 260 | &iic_device, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index 3c5b629887a8..bdf0f61ae1ed 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2006 Paul Mundt | 4 | * Copyright (C) 2006 Paul Mundt |
5 | * Copyright (C) 2007 Yoshihiro Shimoda | 5 | * Copyright (C) 2007 Yoshihiro Shimoda |
6 | * Copyright (C) 2008 Nobuhiro Iwamatsu | 6 | * Copyright (C) 2008, 2009 Nobuhiro Iwamatsu |
7 | * | 7 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
@@ -22,18 +22,8 @@ static struct resource rtc_resources[] = { | |||
22 | .flags = IORESOURCE_IO, | 22 | .flags = IORESOURCE_IO, |
23 | }, | 23 | }, |
24 | [1] = { | 24 | [1] = { |
25 | /* Period IRQ */ | 25 | /* Shared Period/Carry/Alarm IRQ */ |
26 | .start = 21, | 26 | .start = 20, |
27 | .flags = IORESOURCE_IRQ, | ||
28 | }, | ||
29 | [2] = { | ||
30 | /* Carry IRQ */ | ||
31 | .start = 22, | ||
32 | .flags = IORESOURCE_IRQ, | ||
33 | }, | ||
34 | [3] = { | ||
35 | /* Alarm IRQ */ | ||
36 | .start = 20, | ||
37 | .flags = IORESOURCE_IRQ, | 27 | .flags = IORESOURCE_IRQ, |
38 | }, | 28 | }, |
39 | }; | 29 | }; |
@@ -50,17 +40,17 @@ static struct plat_sci_port sci_platform_data[] = { | |||
50 | .mapbase = 0xffe00000, | 40 | .mapbase = 0xffe00000, |
51 | .flags = UPF_BOOT_AUTOCONF, | 41 | .flags = UPF_BOOT_AUTOCONF, |
52 | .type = PORT_SCIF, | 42 | .type = PORT_SCIF, |
53 | .irqs = { 40, 41, 43, 42 }, | 43 | .irqs = { 40, 40, 40, 40 }, |
54 | }, { | 44 | }, { |
55 | .mapbase = 0xffe08000, | 45 | .mapbase = 0xffe08000, |
56 | .flags = UPF_BOOT_AUTOCONF, | 46 | .flags = UPF_BOOT_AUTOCONF, |
57 | .type = PORT_SCIF, | 47 | .type = PORT_SCIF, |
58 | .irqs = { 76, 77, 79, 78 }, | 48 | .irqs = { 76, 76, 76, 76 }, |
59 | }, { | 49 | }, { |
60 | .mapbase = 0xffe10000, | 50 | .mapbase = 0xffe10000, |
61 | .flags = UPF_BOOT_AUTOCONF, | 51 | .flags = UPF_BOOT_AUTOCONF, |
62 | .type = PORT_SCIF, | 52 | .type = PORT_SCIF, |
63 | .irqs = { 104, 105, 107, 106 }, | 53 | .irqs = { 104, 104, 104, 104 }, |
64 | }, { | 54 | }, { |
65 | .flags = 0, | 55 | .flags = 0, |
66 | } | 56 | } |
@@ -148,93 +138,65 @@ enum { | |||
148 | IRL_HHLL, IRL_HHLH, IRL_HHHL, | 138 | IRL_HHLL, IRL_HHLH, IRL_HHHL, |
149 | 139 | ||
150 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 140 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
151 | RTC_ATI, RTC_PRI, RTC_CUI, | 141 | RTC, WDT, TMU0, TMU1, TMU2, TMU2_TICPI, |
152 | WDT, TMU0, TMU1, TMU2, TMU2_TICPI, | 142 | HUDI, LCDC, DMAC, SCIF0, IIC0, IIC1, CMT, GETHER, HAC, |
153 | HUDI, LCDC, | 143 | PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5, |
154 | DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, DMAC0_DMINT3, DMAC0_DMAE, | 144 | STIF0, STIF1, SCIF1, SIOF0, SIOF1, SIOF2, |
155 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | 145 | USBH, USBF, TPU, PCC, MMCIF, SIM, |
156 | DMAC0_DMINT4, DMAC0_DMINT5, | ||
157 | IIC0, IIC1, | ||
158 | CMT, | ||
159 | GEINT0, GEINT1, GEINT2, | ||
160 | HAC, | ||
161 | PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, | ||
162 | PCIERR, PCIPWD3, PCIPWD2, PCIPWD1, PCIPWD0, | ||
163 | STIF0, STIF1, | ||
164 | SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, | ||
165 | SIOF0, SIOF1, SIOF2, | ||
166 | USBH, USBFI0, USBFI1, | ||
167 | TPU, PCC, | ||
168 | MMCIF_FSTAT, MMCIF_TRAN, MMCIF_ERR, MMCIF_FRDY, | ||
169 | SIM_ERI, SIM_RXI, SIM_TXI, SIM_TEND, | ||
170 | TMU3, TMU4, TMU5, ADC, SSI0, SSI1, SSI2, SSI3, | 146 | TMU3, TMU4, TMU5, ADC, SSI0, SSI1, SSI2, SSI3, |
171 | SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI, | 147 | SCIF2, GPIO, |
172 | GPIO_CH0, GPIO_CH1, GPIO_CH2, GPIO_CH3, | ||
173 | 148 | ||
174 | /* interrupt groups */ | 149 | /* interrupt groups */ |
175 | 150 | ||
176 | TMU012, TMU345, RTC, DMAC, SCIF0, GETHER, PCIC5, | 151 | TMU012, TMU345, |
177 | SCIF1, USBF, MMCIF, SIM, SCIF2, GPIO, | ||
178 | }; | 152 | }; |
179 | 153 | ||
180 | static struct intc_vect vectors[] __initdata = { | 154 | static struct intc_vect vectors[] __initdata = { |
181 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | 155 | INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), |
182 | INTC_VECT(RTC_CUI, 0x4c0), | 156 | INTC_VECT(RTC, 0x4c0), |
183 | INTC_VECT(WDT, 0x560), INTC_VECT(TMU0, 0x580), | 157 | INTC_VECT(WDT, 0x560), INTC_VECT(TMU0, 0x580), |
184 | INTC_VECT(TMU1, 0x5a0), INTC_VECT(TMU2, 0x5c0), | 158 | INTC_VECT(TMU1, 0x5a0), INTC_VECT(TMU2, 0x5c0), |
185 | INTC_VECT(TMU2_TICPI, 0x5e0), INTC_VECT(HUDI, 0x600), | 159 | INTC_VECT(TMU2_TICPI, 0x5e0), INTC_VECT(HUDI, 0x600), |
186 | INTC_VECT(LCDC, 0x620), | 160 | INTC_VECT(LCDC, 0x620), |
187 | INTC_VECT(DMAC0_DMINT0, 0x640), INTC_VECT(DMAC0_DMINT1, 0x660), | 161 | INTC_VECT(DMAC, 0x640), INTC_VECT(DMAC, 0x660), |
188 | INTC_VECT(DMAC0_DMINT2, 0x680), INTC_VECT(DMAC0_DMINT3, 0x6a0), | 162 | INTC_VECT(DMAC, 0x680), INTC_VECT(DMAC, 0x6a0), |
189 | INTC_VECT(DMAC0_DMAE, 0x6c0), | 163 | INTC_VECT(DMAC, 0x6c0), |
190 | INTC_VECT(SCIF0_ERI, 0x700), INTC_VECT(SCIF0_RXI, 0x720), | 164 | INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720), |
191 | INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760), | 165 | INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760), |
192 | INTC_VECT(DMAC0_DMINT4, 0x780), INTC_VECT(DMAC0_DMINT5, 0x7a0), | 166 | INTC_VECT(DMAC, 0x780), INTC_VECT(DMAC, 0x7a0), |
193 | INTC_VECT(IIC0, 0x8A0), INTC_VECT(IIC1, 0x8C0), | 167 | INTC_VECT(IIC0, 0x8A0), INTC_VECT(IIC1, 0x8C0), |
194 | INTC_VECT(CMT, 0x900), INTC_VECT(GEINT0, 0x920), | 168 | INTC_VECT(CMT, 0x900), INTC_VECT(GETHER, 0x920), |
195 | INTC_VECT(GEINT1, 0x940), INTC_VECT(GEINT2, 0x960), | 169 | INTC_VECT(GETHER, 0x940), INTC_VECT(GETHER, 0x960), |
196 | INTC_VECT(HAC, 0x980), | 170 | INTC_VECT(HAC, 0x980), |
197 | INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), | 171 | INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), |
198 | INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), | 172 | INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), |
199 | INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIERR, 0xaa0), | 173 | INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0), |
200 | INTC_VECT(PCIPWD3, 0xac0), INTC_VECT(PCIPWD2, 0xae0), | 174 | INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0), |
201 | INTC_VECT(PCIPWD1, 0xb00), INTC_VECT(PCIPWD0, 0xb20), | 175 | INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20), |
202 | INTC_VECT(STIF0, 0xb40), INTC_VECT(STIF1, 0xb60), | 176 | INTC_VECT(STIF0, 0xb40), INTC_VECT(STIF1, 0xb60), |
203 | INTC_VECT(SCIF1_ERI, 0xb80), INTC_VECT(SCIF1_RXI, 0xba0), | 177 | INTC_VECT(SCIF1, 0xb80), INTC_VECT(SCIF1, 0xba0), |
204 | INTC_VECT(SCIF1_BRI, 0xbc0), INTC_VECT(SCIF1_TXI, 0xbe0), | 178 | INTC_VECT(SCIF1, 0xbc0), INTC_VECT(SCIF1, 0xbe0), |
205 | INTC_VECT(SIOF0, 0xc00), INTC_VECT(SIOF1, 0xc20), | 179 | INTC_VECT(SIOF0, 0xc00), INTC_VECT(SIOF1, 0xc20), |
206 | INTC_VECT(USBH, 0xc60), INTC_VECT(USBFI0, 0xc80), | 180 | INTC_VECT(USBH, 0xc60), INTC_VECT(USBF, 0xc80), |
207 | INTC_VECT(USBFI1, 0xca0), | 181 | INTC_VECT(USBF, 0xca0), |
208 | INTC_VECT(TPU, 0xcc0), INTC_VECT(PCC, 0xce0), | 182 | INTC_VECT(TPU, 0xcc0), INTC_VECT(PCC, 0xce0), |
209 | INTC_VECT(MMCIF_FSTAT, 0xd00), INTC_VECT(MMCIF_TRAN, 0xd20), | 183 | INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20), |
210 | INTC_VECT(MMCIF_ERR, 0xd40), INTC_VECT(MMCIF_FRDY, 0xd60), | 184 | INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60), |
211 | INTC_VECT(SIM_ERI, 0xd80), INTC_VECT(SIM_RXI, 0xda0), | 185 | INTC_VECT(SIM, 0xd80), INTC_VECT(SIM, 0xda0), |
212 | INTC_VECT(SIM_TXI, 0xdc0), INTC_VECT(SIM_TEND, 0xde0), | 186 | INTC_VECT(SIM, 0xdc0), INTC_VECT(SIM, 0xde0), |
213 | INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), | 187 | INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), |
214 | INTC_VECT(TMU5, 0xe40), INTC_VECT(ADC, 0xe60), | 188 | INTC_VECT(TMU5, 0xe40), INTC_VECT(ADC, 0xe60), |
215 | INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0), | 189 | INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0), |
216 | INTC_VECT(SSI2, 0xec0), INTC_VECT(SSI3, 0xee0), | 190 | INTC_VECT(SSI2, 0xec0), INTC_VECT(SSI3, 0xee0), |
217 | INTC_VECT(SCIF2_ERI, 0xf00), INTC_VECT(SCIF2_RXI, 0xf20), | 191 | INTC_VECT(SCIF2, 0xf00), INTC_VECT(SCIF2, 0xf20), |
218 | INTC_VECT(SCIF2_BRI, 0xf40), INTC_VECT(SCIF2_TXI, 0xf60), | 192 | INTC_VECT(SCIF2, 0xf40), INTC_VECT(SCIF2, 0xf60), |
219 | INTC_VECT(GPIO_CH0, 0xf80), INTC_VECT(GPIO_CH1, 0xfa0), | 193 | INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0), |
220 | INTC_VECT(GPIO_CH2, 0xfc0), INTC_VECT(GPIO_CH3, 0xfe0), | 194 | INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0), |
221 | }; | 195 | }; |
222 | 196 | ||
223 | static struct intc_group groups[] __initdata = { | 197 | static struct intc_group groups[] __initdata = { |
224 | INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), | 198 | INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), |
225 | INTC_GROUP(TMU345, TMU3, TMU4, TMU5), | 199 | INTC_GROUP(TMU345, TMU3, TMU4, TMU5), |
226 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
227 | INTC_GROUP(DMAC, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, | ||
228 | DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE), | ||
229 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
230 | INTC_GROUP(GETHER, GEINT0, GEINT1, GEINT2), | ||
231 | INTC_GROUP(PCIC5, PCIERR, PCIPWD3, PCIPWD2, PCIPWD1, PCIPWD0), | ||
232 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | ||
233 | INTC_GROUP(USBF, USBFI0, USBFI1), | ||
234 | INTC_GROUP(MMCIF, MMCIF_FSTAT, MMCIF_TRAN, MMCIF_ERR, MMCIF_FRDY), | ||
235 | INTC_GROUP(SIM, SIM_ERI, SIM_RXI, SIM_TXI, SIM_TEND), | ||
236 | INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI), | ||
237 | INTC_GROUP(GPIO, GPIO_CH0, GPIO_CH1, GPIO_CH2, GPIO_CH3), | ||
238 | }; | 200 | }; |
239 | 201 | ||
240 | static struct intc_mask_reg mask_registers[] __initdata = { | 202 | static struct intc_mask_reg mask_registers[] __initdata = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c index fb8200cc7440..6f7227cd65bf 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c | |||
@@ -20,17 +20,7 @@ static struct resource rtc_resources[] = { | |||
20 | .flags = IORESOURCE_IO, | 20 | .flags = IORESOURCE_IO, |
21 | }, | 21 | }, |
22 | [1] = { | 22 | [1] = { |
23 | /* Period IRQ */ | 23 | /* Shared Period/Carry/Alarm IRQ */ |
24 | .start = 21, | ||
25 | .flags = IORESOURCE_IRQ, | ||
26 | }, | ||
27 | [2] = { | ||
28 | /* Carry IRQ */ | ||
29 | .start = 22, | ||
30 | .flags = IORESOURCE_IRQ, | ||
31 | }, | ||
32 | [3] = { | ||
33 | /* Alarm IRQ */ | ||
34 | .start = 20, | 24 | .start = 20, |
35 | .flags = IORESOURCE_IRQ, | 25 | .flags = IORESOURCE_IRQ, |
36 | }, | 26 | }, |
@@ -48,12 +38,12 @@ static struct plat_sci_port sci_platform_data[] = { | |||
48 | .mapbase = 0xffe00000, | 38 | .mapbase = 0xffe00000, |
49 | .flags = UPF_BOOT_AUTOCONF, | 39 | .flags = UPF_BOOT_AUTOCONF, |
50 | .type = PORT_SCIF, | 40 | .type = PORT_SCIF, |
51 | .irqs = { 40, 41, 43, 42 }, | 41 | .irqs = { 40, 40, 40, 40 }, |
52 | }, { | 42 | }, { |
53 | .mapbase = 0xffe10000, | 43 | .mapbase = 0xffe10000, |
54 | .flags = UPF_BOOT_AUTOCONF, | 44 | .flags = UPF_BOOT_AUTOCONF, |
55 | .type = PORT_SCIF, | 45 | .type = PORT_SCIF, |
56 | .irqs = { 76, 77, 79, 78 }, | 46 | .irqs = { 76, 76, 76, 76 }, |
57 | }, { | 47 | }, { |
58 | .flags = 0, | 48 | .flags = 0, |
59 | } | 49 | } |
@@ -90,82 +80,55 @@ enum { | |||
90 | IRL_HHLL, IRL_HHLH, IRL_HHHL, | 80 | IRL_HHLL, IRL_HHLH, IRL_HHHL, |
91 | 81 | ||
92 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 82 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
93 | RTC_ATI, RTC_PRI, RTC_CUI, | 83 | RTC, WDT, TMU0, TMU1, TMU2, TMU2_TICPI, |
94 | WDT, | 84 | HUDI, DMAC0, SCIF0, DMAC1, CMT, HAC, |
95 | TMU0, TMU1, TMU2, TMU2_TICPI, | 85 | PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5, |
96 | HUDI, | 86 | SCIF1, SIOF, HSPI, MMCIF, TMU3, TMU4, TMU5, SSI, FLCTL, GPIO, |
97 | DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, DMAC0_DMINT3, DMAC0_DMAE, | ||
98 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | ||
99 | DMAC0_DMINT4, DMAC0_DMINT5, DMAC1_DMINT6, DMAC1_DMINT7, | ||
100 | CMT, HAC, | ||
101 | PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, | ||
102 | PCIERR, PCIPWD3, PCIPWD2, PCIPWD1, PCIPWD0, | ||
103 | SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, | ||
104 | SIOF, HSPI, | ||
105 | MMCIF_FSTAT, MMCIF_TRAN, MMCIF_ERR, MMCIF_FRDY, | ||
106 | DMAC1_DMINT8, DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11, | ||
107 | TMU3, TMU4, TMU5, | ||
108 | SSI, | ||
109 | FLCTL_FLSTE, FLCTL_FLEND, FLCTL_FLTRQ0, FLCTL_FLTRQ1, | ||
110 | GPIOI0, GPIOI1, GPIOI2, GPIOI3, | ||
111 | 87 | ||
112 | /* interrupt groups */ | 88 | /* interrupt groups */ |
113 | 89 | ||
114 | RTC, TMU012, DMAC0, SCIF0, DMAC45, DMAC1, | 90 | TMU012, TMU345, |
115 | PCIC5, SCIF1, MMCIF, TMU345, FLCTL, GPIO, | ||
116 | }; | 91 | }; |
117 | 92 | ||
118 | static struct intc_vect vectors[] __initdata = { | 93 | static struct intc_vect vectors[] __initdata = { |
119 | INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0), | 94 | INTC_VECT(RTC, 0x480), INTC_VECT(RTC, 0x4a0), |
120 | INTC_VECT(RTC_CUI, 0x4c0), | 95 | INTC_VECT(RTC, 0x4c0), |
121 | INTC_VECT(WDT, 0x560), | 96 | INTC_VECT(WDT, 0x560), |
122 | INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0), | 97 | INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0), |
123 | INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0), | 98 | INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0), |
124 | INTC_VECT(HUDI, 0x600), | 99 | INTC_VECT(HUDI, 0x600), |
125 | INTC_VECT(DMAC0_DMINT0, 0x640), INTC_VECT(DMAC0_DMINT1, 0x660), | 100 | INTC_VECT(DMAC0, 0x640), INTC_VECT(DMAC0, 0x660), |
126 | INTC_VECT(DMAC0_DMINT2, 0x680), INTC_VECT(DMAC0_DMINT3, 0x6a0), | 101 | INTC_VECT(DMAC0, 0x680), INTC_VECT(DMAC0, 0x6a0), |
127 | INTC_VECT(DMAC0_DMAE, 0x6c0), | 102 | INTC_VECT(DMAC0, 0x6c0), |
128 | INTC_VECT(SCIF0_ERI, 0x700), INTC_VECT(SCIF0_RXI, 0x720), | 103 | INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720), |
129 | INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760), | 104 | INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760), |
130 | INTC_VECT(DMAC0_DMINT4, 0x780), INTC_VECT(DMAC0_DMINT5, 0x7a0), | 105 | INTC_VECT(DMAC0, 0x780), INTC_VECT(DMAC0, 0x7a0), |
131 | INTC_VECT(DMAC1_DMINT6, 0x7c0), INTC_VECT(DMAC1_DMINT7, 0x7e0), | 106 | INTC_VECT(DMAC1, 0x7c0), INTC_VECT(DMAC1, 0x7e0), |
132 | INTC_VECT(CMT, 0x900), INTC_VECT(HAC, 0x980), | 107 | INTC_VECT(CMT, 0x900), INTC_VECT(HAC, 0x980), |
133 | INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), | 108 | INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), |
134 | INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), | 109 | INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), |
135 | INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIERR, 0xaa0), | 110 | INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0), |
136 | INTC_VECT(PCIPWD3, 0xac0), INTC_VECT(PCIPWD2, 0xae0), | 111 | INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0), |
137 | INTC_VECT(PCIPWD1, 0xb00), INTC_VECT(PCIPWD0, 0xb20), | 112 | INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20), |
138 | INTC_VECT(SCIF1_ERI, 0xb80), INTC_VECT(SCIF1_RXI, 0xba0), | 113 | INTC_VECT(SCIF1, 0xb80), INTC_VECT(SCIF1, 0xba0), |
139 | INTC_VECT(SCIF1_BRI, 0xbc0), INTC_VECT(SCIF1_TXI, 0xbe0), | 114 | INTC_VECT(SCIF1, 0xbc0), INTC_VECT(SCIF1, 0xbe0), |
140 | INTC_VECT(SIOF, 0xc00), INTC_VECT(HSPI, 0xc80), | 115 | INTC_VECT(SIOF, 0xc00), INTC_VECT(HSPI, 0xc80), |
141 | INTC_VECT(MMCIF_FSTAT, 0xd00), INTC_VECT(MMCIF_TRAN, 0xd20), | 116 | INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20), |
142 | INTC_VECT(MMCIF_ERR, 0xd40), INTC_VECT(MMCIF_FRDY, 0xd60), | 117 | INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60), |
143 | INTC_VECT(DMAC1_DMINT8, 0xd80), INTC_VECT(DMAC1_DMINT9, 0xda0), | 118 | INTC_VECT(DMAC1, 0xd80), INTC_VECT(DMAC1, 0xda0), |
144 | INTC_VECT(DMAC1_DMINT10, 0xdc0), INTC_VECT(DMAC1_DMINT11, 0xde0), | 119 | INTC_VECT(DMAC1, 0xdc0), INTC_VECT(DMAC1, 0xde0), |
145 | INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), | 120 | INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), |
146 | INTC_VECT(TMU5, 0xe40), | 121 | INTC_VECT(TMU5, 0xe40), |
147 | INTC_VECT(SSI, 0xe80), | 122 | INTC_VECT(SSI, 0xe80), |
148 | INTC_VECT(FLCTL_FLSTE, 0xf00), INTC_VECT(FLCTL_FLEND, 0xf20), | 123 | INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20), |
149 | INTC_VECT(FLCTL_FLTRQ0, 0xf40), INTC_VECT(FLCTL_FLTRQ1, 0xf60), | 124 | INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60), |
150 | INTC_VECT(GPIOI0, 0xf80), INTC_VECT(GPIOI1, 0xfa0), | 125 | INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0), |
151 | INTC_VECT(GPIOI2, 0xfc0), INTC_VECT(GPIOI3, 0xfe0), | 126 | INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0), |
152 | }; | 127 | }; |
153 | 128 | ||
154 | static struct intc_group groups[] __initdata = { | 129 | static struct intc_group groups[] __initdata = { |
155 | INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI), | ||
156 | INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), | 130 | INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), |
157 | INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, | ||
158 | DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE), | ||
159 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
160 | INTC_GROUP(DMAC1, DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, | ||
161 | DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11), | ||
162 | INTC_GROUP(PCIC5, PCIERR, PCIPWD3, PCIPWD2, PCIPWD1, PCIPWD0), | ||
163 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | ||
164 | INTC_GROUP(MMCIF, MMCIF_FSTAT, MMCIF_TRAN, MMCIF_ERR, MMCIF_FRDY), | ||
165 | INTC_GROUP(TMU345, TMU3, TMU4, TMU5), | 131 | INTC_GROUP(TMU345, TMU3, TMU4, TMU5), |
166 | INTC_GROUP(FLCTL, FLCTL_FLSTE, FLCTL_FLEND, | ||
167 | FLCTL_FLTRQ0, FLCTL_FLTRQ1), | ||
168 | INTC_GROUP(GPIO, GPIOI0, GPIOI1, GPIOI2, GPIOI3), | ||
169 | }; | 132 | }; |
170 | 133 | ||
171 | static struct intc_mask_reg mask_registers[] __initdata = { | 134 | static struct intc_mask_reg mask_registers[] __initdata = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c index 30baa63b24c8..d80802a49dbd 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c | |||
@@ -20,18 +20,13 @@ static struct plat_sci_port sci_platform_data[] = { | |||
20 | .mapbase = 0xffea0000, | 20 | .mapbase = 0xffea0000, |
21 | .flags = UPF_BOOT_AUTOCONF, | 21 | .flags = UPF_BOOT_AUTOCONF, |
22 | .type = PORT_SCIF, | 22 | .type = PORT_SCIF, |
23 | .irqs = { 40, 41, 43, 42 }, | 23 | .irqs = { 40, 40, 40, 40 }, |
24 | }, { | 24 | }, { |
25 | .mapbase = 0xffeb0000, | 25 | .mapbase = 0xffeb0000, |
26 | .flags = UPF_BOOT_AUTOCONF, | 26 | .flags = UPF_BOOT_AUTOCONF, |
27 | .type = PORT_SCIF, | 27 | .type = PORT_SCIF, |
28 | .irqs = { 44, 45, 47, 46 }, | 28 | .irqs = { 44, 44, 44, 44 }, |
29 | }, | 29 | }, { |
30 | |||
31 | /* | ||
32 | * The rest of these all have multiplexed IRQs | ||
33 | */ | ||
34 | { | ||
35 | .mapbase = 0xffec0000, | 30 | .mapbase = 0xffec0000, |
36 | .flags = UPF_BOOT_AUTOCONF, | 31 | .flags = UPF_BOOT_AUTOCONF, |
37 | .type = PORT_SCIF, | 32 | .type = PORT_SCIF, |
@@ -91,33 +86,19 @@ enum { | |||
91 | IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, | 86 | IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, |
92 | 87 | ||
93 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | 88 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, |
94 | WDT, | 89 | WDT, TMU0, TMU1, TMU2, TMU2_TICPI, |
95 | TMU0, TMU1, TMU2, TMU2_TICPI, | 90 | HUDI, DMAC0, SCIF0, SCIF1, DMAC1, HSPI, |
96 | HUDI, | ||
97 | DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, DMAC0_DMINT3, | ||
98 | DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE, | ||
99 | SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI, | ||
100 | SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI, | ||
101 | DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, DMAC1_DMINT9, | ||
102 | DMAC1_DMINT10, DMAC1_DMINT11, DMAC1_DMAE, | ||
103 | HSPI, | ||
104 | SCIF2, SCIF3, SCIF4, SCIF5, | 91 | SCIF2, SCIF3, SCIF4, SCIF5, |
105 | PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, | 92 | PCISERR, PCIINTA, PCIINTB, PCIINTC, PCIINTD, PCIC5, |
106 | PCIERR, PCIPWD3, PCIPWD2, PCIPWD1, PCIPWD0, | 93 | SIOF, MMCIF, DU, GDTA, |
107 | SIOF, | ||
108 | MMCIF_FSTAT, MMCIF_TRAN, MMCIF_ERR, MMCIF_FRDY, | ||
109 | DU, | ||
110 | GDTA_GACLI, GDTA_GAMCI, GDTA_GAERI, | ||
111 | TMU3, TMU4, TMU5, | 94 | TMU3, TMU4, TMU5, |
112 | SSI0, SSI1, | 95 | SSI0, SSI1, |
113 | HAC0, HAC1, | 96 | HAC0, HAC1, |
114 | FLCTL_FLSTE, FLCTL_FLEND, FLCTL_FLTRQ0, FLCTL_FLTRQ1, | 97 | FLCTL, GPIO, |
115 | GPIOI0, GPIOI1, GPIOI2, GPIOI3, | ||
116 | 98 | ||
117 | /* interrupt groups */ | 99 | /* interrupt groups */ |
118 | 100 | ||
119 | TMU012, DMAC0, SCIF0, SCIF1, DMAC1, | 101 | TMU012, TMU345 |
120 | PCIC5, MMCIF, GDTA, TMU345, FLCTL, GPIO | ||
121 | }; | 102 | }; |
122 | 103 | ||
123 | static struct intc_vect vectors[] __initdata = { | 104 | static struct intc_vect vectors[] __initdata = { |
@@ -125,57 +106,45 @@ static struct intc_vect vectors[] __initdata = { | |||
125 | INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0), | 106 | INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0), |
126 | INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0), | 107 | INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0), |
127 | INTC_VECT(HUDI, 0x600), | 108 | INTC_VECT(HUDI, 0x600), |
128 | INTC_VECT(DMAC0_DMINT0, 0x620), INTC_VECT(DMAC0_DMINT1, 0x640), | 109 | INTC_VECT(DMAC0, 0x620), INTC_VECT(DMAC0, 0x640), |
129 | INTC_VECT(DMAC0_DMINT2, 0x660), INTC_VECT(DMAC0_DMINT3, 0x680), | 110 | INTC_VECT(DMAC0, 0x660), INTC_VECT(DMAC0, 0x680), |
130 | INTC_VECT(DMAC0_DMINT4, 0x6a0), INTC_VECT(DMAC0_DMINT5, 0x6c0), | 111 | INTC_VECT(DMAC0, 0x6a0), INTC_VECT(DMAC0, 0x6c0), |
131 | INTC_VECT(DMAC0_DMAE, 0x6e0), | 112 | INTC_VECT(DMAC0, 0x6e0), |
132 | INTC_VECT(SCIF0_ERI, 0x700), INTC_VECT(SCIF0_RXI, 0x720), | 113 | INTC_VECT(SCIF0, 0x700), INTC_VECT(SCIF0, 0x720), |
133 | INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760), | 114 | INTC_VECT(SCIF0, 0x740), INTC_VECT(SCIF0, 0x760), |
134 | INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0), | 115 | INTC_VECT(SCIF1, 0x780), INTC_VECT(SCIF1, 0x7a0), |
135 | INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0), | 116 | INTC_VECT(SCIF1, 0x7c0), INTC_VECT(SCIF1, 0x7e0), |
136 | INTC_VECT(DMAC1_DMINT6, 0x880), INTC_VECT(DMAC1_DMINT7, 0x8a0), | 117 | INTC_VECT(DMAC1, 0x880), INTC_VECT(DMAC1, 0x8a0), |
137 | INTC_VECT(DMAC1_DMINT8, 0x8c0), INTC_VECT(DMAC1_DMINT9, 0x8e0), | 118 | INTC_VECT(DMAC1, 0x8c0), INTC_VECT(DMAC1, 0x8e0), |
138 | INTC_VECT(DMAC1_DMINT10, 0x900), INTC_VECT(DMAC1_DMINT11, 0x920), | 119 | INTC_VECT(DMAC1, 0x900), INTC_VECT(DMAC1, 0x920), |
139 | INTC_VECT(DMAC1_DMAE, 0x940), | 120 | INTC_VECT(DMAC1, 0x940), |
140 | INTC_VECT(HSPI, 0x960), | 121 | INTC_VECT(HSPI, 0x960), |
141 | INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0), | 122 | INTC_VECT(SCIF2, 0x980), INTC_VECT(SCIF3, 0x9a0), |
142 | INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0), | 123 | INTC_VECT(SCIF4, 0x9c0), INTC_VECT(SCIF5, 0x9e0), |
143 | INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), | 124 | INTC_VECT(PCISERR, 0xa00), INTC_VECT(PCIINTA, 0xa20), |
144 | INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), | 125 | INTC_VECT(PCIINTB, 0xa40), INTC_VECT(PCIINTC, 0xa60), |
145 | INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIERR, 0xaa0), | 126 | INTC_VECT(PCIINTD, 0xa80), INTC_VECT(PCIC5, 0xaa0), |
146 | INTC_VECT(PCIPWD3, 0xac0), INTC_VECT(PCIPWD2, 0xae0), | 127 | INTC_VECT(PCIC5, 0xac0), INTC_VECT(PCIC5, 0xae0), |
147 | INTC_VECT(PCIPWD1, 0xb00), INTC_VECT(PCIPWD0, 0xb20), | 128 | INTC_VECT(PCIC5, 0xb00), INTC_VECT(PCIC5, 0xb20), |
148 | INTC_VECT(SIOF, 0xc00), | 129 | INTC_VECT(SIOF, 0xc00), |
149 | INTC_VECT(MMCIF_FSTAT, 0xd00), INTC_VECT(MMCIF_TRAN, 0xd20), | 130 | INTC_VECT(MMCIF, 0xd00), INTC_VECT(MMCIF, 0xd20), |
150 | INTC_VECT(MMCIF_ERR, 0xd40), INTC_VECT(MMCIF_FRDY, 0xd60), | 131 | INTC_VECT(MMCIF, 0xd40), INTC_VECT(MMCIF, 0xd60), |
151 | INTC_VECT(DU, 0xd80), | 132 | INTC_VECT(DU, 0xd80), |
152 | INTC_VECT(GDTA_GACLI, 0xda0), INTC_VECT(GDTA_GAMCI, 0xdc0), | 133 | INTC_VECT(GDTA, 0xda0), INTC_VECT(GDTA, 0xdc0), |
153 | INTC_VECT(GDTA_GAERI, 0xde0), | 134 | INTC_VECT(GDTA, 0xde0), |
154 | INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), | 135 | INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20), |
155 | INTC_VECT(TMU5, 0xe40), | 136 | INTC_VECT(TMU5, 0xe40), |
156 | INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0), | 137 | INTC_VECT(SSI0, 0xe80), INTC_VECT(SSI1, 0xea0), |
157 | INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0), | 138 | INTC_VECT(HAC0, 0xec0), INTC_VECT(HAC1, 0xee0), |
158 | INTC_VECT(FLCTL_FLSTE, 0xf00), INTC_VECT(FLCTL_FLEND, 0xf20), | 139 | INTC_VECT(FLCTL, 0xf00), INTC_VECT(FLCTL, 0xf20), |
159 | INTC_VECT(FLCTL_FLTRQ0, 0xf40), INTC_VECT(FLCTL_FLTRQ1, 0xf60), | 140 | INTC_VECT(FLCTL, 0xf40), INTC_VECT(FLCTL, 0xf60), |
160 | INTC_VECT(GPIOI0, 0xf80), INTC_VECT(GPIOI1, 0xfa0), | 141 | INTC_VECT(GPIO, 0xf80), INTC_VECT(GPIO, 0xfa0), |
161 | INTC_VECT(GPIOI2, 0xfc0), INTC_VECT(GPIOI3, 0xfe0), | 142 | INTC_VECT(GPIO, 0xfc0), INTC_VECT(GPIO, 0xfe0), |
162 | }; | 143 | }; |
163 | 144 | ||
164 | static struct intc_group groups[] __initdata = { | 145 | static struct intc_group groups[] __initdata = { |
165 | INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), | 146 | INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI), |
166 | INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2, | ||
167 | DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE), | ||
168 | INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI), | ||
169 | INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI), | ||
170 | INTC_GROUP(DMAC1, DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, | ||
171 | DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11, DMAC1_DMAE), | ||
172 | INTC_GROUP(PCIC5, PCIERR, PCIPWD3, PCIPWD2, PCIPWD1, PCIPWD0), | ||
173 | INTC_GROUP(MMCIF, MMCIF_FSTAT, MMCIF_TRAN, MMCIF_ERR, MMCIF_FRDY), | ||
174 | INTC_GROUP(GDTA, GDTA_GACLI, GDTA_GAMCI, GDTA_GAERI), | ||
175 | INTC_GROUP(TMU345, TMU3, TMU4, TMU5), | 147 | INTC_GROUP(TMU345, TMU3, TMU4, TMU5), |
176 | INTC_GROUP(FLCTL, FLCTL_FLSTE, FLCTL_FLEND, | ||
177 | FLCTL_FLTRQ0, FLCTL_FLTRQ1), | ||
178 | INTC_GROUP(GPIO, GPIOI0, GPIOI1, GPIOI2, GPIOI3), | ||
179 | }; | 148 | }; |
180 | 149 | ||
181 | static struct intc_mask_reg mask_registers[] __initdata = { | 150 | static struct intc_mask_reg mask_registers[] __initdata = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7786.c b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c new file mode 100644 index 000000000000..5a47e1cf442e --- /dev/null +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7786.c | |||
@@ -0,0 +1,490 @@ | |||
1 | /* | ||
2 | * SH7786 Setup | ||
3 | * | ||
4 | * Copyright (C) 2009 Renesas Solutions Corp. | ||
5 | * Kuninori Morimoto <morimoto.kuninori@renesas.com> | ||
6 | * | ||
7 | * Based on SH7785 Setup | ||
8 | * | ||
9 | * Copyright (C) 2007 Paul Mundt | ||
10 | * | ||
11 | * This file is subject to the terms and conditions of the GNU General Public | ||
12 | * License. See the file "COPYING" in the main directory of this archive | ||
13 | * for more details. | ||
14 | */ | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/serial.h> | ||
18 | #include <linux/serial_sci.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/mm.h> | ||
21 | #include <linux/dma-mapping.h> | ||
22 | #include <asm/mmzone.h> | ||
23 | |||
24 | static struct plat_sci_port sci_platform_data[] = { | ||
25 | { | ||
26 | .mapbase = 0xffea0000, | ||
27 | .flags = UPF_BOOT_AUTOCONF, | ||
28 | .type = PORT_SCIF, | ||
29 | .irqs = { 40, 41, 43, 42 }, | ||
30 | }, | ||
31 | /* | ||
32 | * The rest of these all have multiplexed IRQs | ||
33 | */ | ||
34 | { | ||
35 | .mapbase = 0xffeb0000, | ||
36 | .flags = UPF_BOOT_AUTOCONF, | ||
37 | .type = PORT_SCIF, | ||
38 | .irqs = { 44, 44, 44, 44 }, | ||
39 | }, { | ||
40 | .mapbase = 0xffec0000, | ||
41 | .flags = UPF_BOOT_AUTOCONF, | ||
42 | .type = PORT_SCIF, | ||
43 | .irqs = { 50, 50, 50, 50 }, | ||
44 | }, { | ||
45 | .mapbase = 0xffed0000, | ||
46 | .flags = UPF_BOOT_AUTOCONF, | ||
47 | .type = PORT_SCIF, | ||
48 | .irqs = { 51, 51, 51, 51 }, | ||
49 | }, { | ||
50 | .mapbase = 0xffee0000, | ||
51 | .flags = UPF_BOOT_AUTOCONF, | ||
52 | .type = PORT_SCIF, | ||
53 | .irqs = { 52, 52, 52, 52 }, | ||
54 | }, { | ||
55 | .mapbase = 0xffef0000, | ||
56 | .flags = UPF_BOOT_AUTOCONF, | ||
57 | .type = PORT_SCIF, | ||
58 | .irqs = { 53, 53, 53, 53 }, | ||
59 | }, { | ||
60 | .flags = 0, | ||
61 | } | ||
62 | }; | ||
63 | |||
64 | static struct platform_device sci_device = { | ||
65 | .name = "sh-sci", | ||
66 | .id = -1, | ||
67 | .dev = { | ||
68 | .platform_data = sci_platform_data, | ||
69 | }, | ||
70 | }; | ||
71 | |||
72 | static struct resource usb_ohci_resources[] = { | ||
73 | [0] = { | ||
74 | .start = 0xffe70400, | ||
75 | .end = 0xffe704ff, | ||
76 | .flags = IORESOURCE_MEM, | ||
77 | }, | ||
78 | [1] = { | ||
79 | .start = 77, | ||
80 | .end = 77, | ||
81 | .flags = IORESOURCE_IRQ, | ||
82 | }, | ||
83 | }; | ||
84 | |||
85 | static u64 usb_ohci_dma_mask = DMA_BIT_MASK(32); | ||
86 | static struct platform_device usb_ohci_device = { | ||
87 | .name = "sh_ohci", | ||
88 | .id = -1, | ||
89 | .dev = { | ||
90 | .dma_mask = &usb_ohci_dma_mask, | ||
91 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
92 | }, | ||
93 | .num_resources = ARRAY_SIZE(usb_ohci_resources), | ||
94 | .resource = usb_ohci_resources, | ||
95 | }; | ||
96 | |||
97 | static struct platform_device *sh7786_devices[] __initdata = { | ||
98 | &sci_device, | ||
99 | &usb_ohci_device, | ||
100 | }; | ||
101 | |||
102 | |||
103 | /* | ||
104 | * Please call this function if your platform board | ||
105 | * use external clock for USB | ||
106 | * */ | ||
107 | #define USBCTL0 0xffe70858 | ||
108 | #define CLOCK_MODE_MASK 0xffffff7f | ||
109 | #define EXT_CLOCK_MODE 0x00000080 | ||
110 | void __init sh7786_usb_use_exclock(void) | ||
111 | { | ||
112 | u32 val = __raw_readl(USBCTL0) & CLOCK_MODE_MASK; | ||
113 | __raw_writel(val | EXT_CLOCK_MODE, USBCTL0); | ||
114 | } | ||
115 | |||
116 | #define USBINITREG1 0xffe70094 | ||
117 | #define USBINITREG2 0xffe7009c | ||
118 | #define USBINITVAL1 0x00ff0040 | ||
119 | #define USBINITVAL2 0x00000001 | ||
120 | |||
121 | #define USBPCTL1 0xffe70804 | ||
122 | #define USBST 0xffe70808 | ||
123 | #define PHY_ENB 0x00000001 | ||
124 | #define PLL_ENB 0x00000002 | ||
125 | #define PHY_RST 0x00000004 | ||
126 | #define ACT_PLL_STATUS 0xc0000000 | ||
127 | static void __init sh7786_usb_setup(void) | ||
128 | { | ||
129 | int i = 1000000; | ||
130 | |||
131 | /* | ||
132 | * USB initial settings | ||
133 | * | ||
134 | * The following settings are necessary | ||
135 | * for using the USB modules. | ||
136 | * | ||
137 | * see "USB Inital Settings" for detail | ||
138 | */ | ||
139 | __raw_writel(USBINITVAL1, USBINITREG1); | ||
140 | __raw_writel(USBINITVAL2, USBINITREG2); | ||
141 | |||
142 | /* | ||
143 | * Set the PHY and PLL enable bit | ||
144 | */ | ||
145 | __raw_writel(PHY_ENB | PLL_ENB, USBPCTL1); | ||
146 | while (i-- && | ||
147 | ((__raw_readl(USBST) & ACT_PLL_STATUS) != ACT_PLL_STATUS)) | ||
148 | cpu_relax(); | ||
149 | |||
150 | if (i) { | ||
151 | /* Set the PHY RST bit */ | ||
152 | __raw_writel(PHY_ENB | PLL_ENB | PHY_RST, USBPCTL1); | ||
153 | printk(KERN_INFO "sh7786 usb setup done\n"); | ||
154 | } | ||
155 | } | ||
156 | |||
157 | static int __init sh7786_devices_setup(void) | ||
158 | { | ||
159 | sh7786_usb_setup(); | ||
160 | return platform_add_devices(sh7786_devices, | ||
161 | ARRAY_SIZE(sh7786_devices)); | ||
162 | } | ||
163 | device_initcall(sh7786_devices_setup); | ||
164 | |||
165 | enum { | ||
166 | UNUSED = 0, | ||
167 | |||
168 | /* interrupt sources */ | ||
169 | |||
170 | IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH, | ||
171 | IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH, | ||
172 | IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH, | ||
173 | IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, | ||
174 | |||
175 | IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH, | ||
176 | IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH, | ||
177 | IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH, | ||
178 | IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, | ||
179 | |||
180 | IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, | ||
181 | WDT, | ||
182 | TMU0_0, TMU0_1, TMU0_2, TMU0_3, | ||
183 | TMU1_0, TMU1_1, TMU1_2, | ||
184 | DMAC0_0, DMAC0_1, DMAC0_2, DMAC0_3, DMAC0_4, DMAC0_5, DMAC0_6, | ||
185 | HUDI1, HUDI0, | ||
186 | DMAC1_0, DMAC1_1, DMAC1_2, DMAC1_3, | ||
187 | HPB_0, HPB_1, HPB_2, | ||
188 | SCIF0_0, SCIF0_1, SCIF0_2, SCIF0_3, | ||
189 | SCIF1, | ||
190 | TMU2, TMU3, | ||
191 | SCIF2, SCIF3, SCIF4, SCIF5, | ||
192 | Eth_0, Eth_1, | ||
193 | PCIeC0_0, PCIeC0_1, PCIeC0_2, | ||
194 | PCIeC1_0, PCIeC1_1, PCIeC1_2, | ||
195 | USB, | ||
196 | I2C0, I2C1, | ||
197 | DU, | ||
198 | SSI0, SSI1, SSI2, SSI3, | ||
199 | PCIeC2_0, PCIeC2_1, PCIeC2_2, | ||
200 | HAC0, HAC1, | ||
201 | FLCTL, | ||
202 | HSPI, | ||
203 | GPIO0, GPIO1, | ||
204 | Thermal, | ||
205 | INTC0, INTC1, INTC2, INTC3, INTC4, INTC5, INTC6, INTC7, | ||
206 | |||
207 | /* interrupt groups */ | ||
208 | }; | ||
209 | |||
210 | static struct intc_vect vectors[] __initdata = { | ||
211 | INTC_VECT(WDT, 0x3e0), | ||
212 | INTC_VECT(TMU0_0, 0x400), INTC_VECT(TMU0_1, 0x420), | ||
213 | INTC_VECT(TMU0_2, 0x440), INTC_VECT(TMU0_3, 0x460), | ||
214 | INTC_VECT(TMU1_0, 0x480), INTC_VECT(TMU1_1, 0x4a0), | ||
215 | INTC_VECT(TMU1_2, 0x4c0), | ||
216 | INTC_VECT(DMAC0_0, 0x500), INTC_VECT(DMAC0_1, 0x520), | ||
217 | INTC_VECT(DMAC0_2, 0x540), INTC_VECT(DMAC0_3, 0x560), | ||
218 | INTC_VECT(DMAC0_4, 0x580), INTC_VECT(DMAC0_5, 0x5a0), | ||
219 | INTC_VECT(DMAC0_6, 0x5c0), | ||
220 | INTC_VECT(HUDI1, 0x5e0), INTC_VECT(HUDI0, 0x600), | ||
221 | INTC_VECT(DMAC1_0, 0x620), INTC_VECT(DMAC1_1, 0x640), | ||
222 | INTC_VECT(DMAC1_2, 0x660), INTC_VECT(DMAC1_3, 0x680), | ||
223 | INTC_VECT(HPB_0, 0x6a0), INTC_VECT(HPB_1, 0x6c0), | ||
224 | INTC_VECT(HPB_2, 0x6e0), | ||
225 | INTC_VECT(SCIF0_0, 0x700), INTC_VECT(SCIF0_1, 0x720), | ||
226 | INTC_VECT(SCIF0_2, 0x740), INTC_VECT(SCIF0_3, 0x760), | ||
227 | INTC_VECT(SCIF1, 0x780), | ||
228 | INTC_VECT(TMU2, 0x7a0), INTC_VECT(TMU3, 0x7c0), | ||
229 | INTC_VECT(SCIF2, 0x840), INTC_VECT(SCIF3, 0x860), | ||
230 | INTC_VECT(SCIF4, 0x880), INTC_VECT(SCIF5, 0x8a0), | ||
231 | INTC_VECT(Eth_0, 0x8c0), INTC_VECT(Eth_1, 0x8e0), | ||
232 | INTC_VECT(PCIeC0_0, 0xae0), INTC_VECT(PCIeC0_1, 0xb00), | ||
233 | INTC_VECT(PCIeC0_2, 0xb20), | ||
234 | INTC_VECT(PCIeC1_0, 0xb40), INTC_VECT(PCIeC1_1, 0xb60), | ||
235 | INTC_VECT(PCIeC1_2, 0xb80), | ||
236 | INTC_VECT(USB, 0xba0), | ||
237 | INTC_VECT(I2C0, 0xcc0), INTC_VECT(I2C1, 0xce0), | ||
238 | INTC_VECT(DU, 0xd00), | ||
239 | INTC_VECT(SSI0, 0xd20), INTC_VECT(SSI1, 0xd40), | ||
240 | INTC_VECT(SSI2, 0xd60), INTC_VECT(SSI3, 0xd80), | ||
241 | INTC_VECT(PCIeC2_0, 0xda0), INTC_VECT(PCIeC2_1, 0xdc0), | ||
242 | INTC_VECT(PCIeC2_2, 0xde0), | ||
243 | INTC_VECT(HAC0, 0xe00), INTC_VECT(HAC1, 0xe20), | ||
244 | INTC_VECT(FLCTL, 0xe40), | ||
245 | INTC_VECT(HSPI, 0xe80), | ||
246 | INTC_VECT(GPIO0, 0xea0), INTC_VECT(GPIO1, 0xec0), | ||
247 | INTC_VECT(Thermal, 0xee0), | ||
248 | }; | ||
249 | |||
250 | /* FIXME: Main CPU support only now */ | ||
251 | #if 1 /* Main CPU */ | ||
252 | #define CnINTMSK0 0xfe410030 | ||
253 | #define CnINTMSK1 0xfe410040 | ||
254 | #define CnINTMSKCLR0 0xfe410050 | ||
255 | #define CnINTMSKCLR1 0xfe410060 | ||
256 | #define CnINT2MSKR0 0xfe410a20 | ||
257 | #define CnINT2MSKR1 0xfe410a24 | ||
258 | #define CnINT2MSKR2 0xfe410a28 | ||
259 | #define CnINT2MSKR3 0xfe410a2c | ||
260 | #define CnINT2MSKCR0 0xfe410a30 | ||
261 | #define CnINT2MSKCR1 0xfe410a34 | ||
262 | #define CnINT2MSKCR2 0xfe410a38 | ||
263 | #define CnINT2MSKCR3 0xfe410a3c | ||
264 | #else /* Sub CPU */ | ||
265 | #define CnINTMSK0 0xfe410034 | ||
266 | #define CnINTMSK1 0xfe410044 | ||
267 | #define CnINTMSKCLR0 0xfe410054 | ||
268 | #define CnINTMSKCLR1 0xfe410064 | ||
269 | #define CnINT2MSKR0 0xfe410b20 | ||
270 | #define CnINT2MSKR1 0xfe410b24 | ||
271 | #define CnINT2MSKR2 0xfe410b28 | ||
272 | #define CnINT2MSKR3 0xfe410b2c | ||
273 | #define CnINT2MSKCR0 0xfe410b30 | ||
274 | #define CnINT2MSKCR1 0xfe410b34 | ||
275 | #define CnINT2MSKCR2 0xfe410b38 | ||
276 | #define CnINT2MSKCR3 0xfe410b3c | ||
277 | #endif | ||
278 | |||
279 | #define INTMSK2 0xfe410068 | ||
280 | #define INTMSKCLR2 0xfe41006c | ||
281 | |||
282 | static struct intc_mask_reg mask_registers[] __initdata = { | ||
283 | { CnINTMSK0, CnINTMSKCLR0, 32, | ||
284 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, | ||
285 | { INTMSK2, INTMSKCLR2, 32, | ||
286 | { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH, | ||
287 | IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH, | ||
288 | IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH, | ||
289 | IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0, | ||
290 | IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH, | ||
291 | IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH, | ||
292 | IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH, | ||
293 | IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } }, | ||
294 | { CnINT2MSKR0, CnINT2MSKCR0 , 32, | ||
295 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
296 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, WDT } }, | ||
297 | { CnINT2MSKR1, CnINT2MSKCR1, 32, | ||
298 | { TMU0_0, TMU0_1, TMU0_2, TMU0_3, TMU1_0, TMU1_1, TMU1_2, 0, | ||
299 | DMAC0_0, DMAC0_1, DMAC0_2, DMAC0_3, DMAC0_4, DMAC0_5, DMAC0_6, | ||
300 | HUDI1, HUDI0, | ||
301 | DMAC1_0, DMAC1_1, DMAC1_2, DMAC1_3, | ||
302 | HPB_0, HPB_1, HPB_2, | ||
303 | SCIF0_0, SCIF0_1, SCIF0_2, SCIF0_3, | ||
304 | SCIF1, | ||
305 | TMU2, TMU3, 0, } }, | ||
306 | { CnINT2MSKR2, CnINT2MSKCR2, 32, | ||
307 | { 0, 0, SCIF2, SCIF3, SCIF4, SCIF5, | ||
308 | Eth_0, Eth_1, | ||
309 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
310 | PCIeC0_0, PCIeC0_1, PCIeC0_2, | ||
311 | PCIeC1_0, PCIeC1_1, PCIeC1_2, | ||
312 | USB, 0, 0 } }, | ||
313 | { CnINT2MSKR3, CnINT2MSKCR3, 32, | ||
314 | { 0, 0, 0, 0, 0, 0, | ||
315 | I2C0, I2C1, | ||
316 | DU, SSI0, SSI1, SSI2, SSI3, | ||
317 | PCIeC2_0, PCIeC2_1, PCIeC2_2, | ||
318 | HAC0, HAC1, | ||
319 | FLCTL, 0, | ||
320 | HSPI, GPIO0, GPIO1, Thermal, | ||
321 | 0, 0, 0, 0, 0, 0, 0, 0 } }, | ||
322 | }; | ||
323 | |||
324 | static struct intc_prio_reg prio_registers[] __initdata = { | ||
325 | { 0xfe410010, 0, 32, 4, /* INTPRI */ { IRQ0, IRQ1, IRQ2, IRQ3, | ||
326 | IRQ4, IRQ5, IRQ6, IRQ7 } }, | ||
327 | { 0xfe410800, 0, 32, 8, /* INT2PRI0 */ { 0, 0, 0, WDT } }, | ||
328 | { 0xfe410804, 0, 32, 8, /* INT2PRI1 */ { TMU0_0, TMU0_1, | ||
329 | TMU0_2, TMU0_3 } }, | ||
330 | { 0xfe410808, 0, 32, 8, /* INT2PRI2 */ { TMU1_0, TMU1_1, | ||
331 | TMU1_2, 0 } }, | ||
332 | { 0xfe41080c, 0, 32, 8, /* INT2PRI3 */ { DMAC0_0, DMAC0_1, | ||
333 | DMAC0_2, DMAC0_3 } }, | ||
334 | { 0xfe410810, 0, 32, 8, /* INT2PRI4 */ { DMAC0_4, DMAC0_5, | ||
335 | DMAC0_6, HUDI1 } }, | ||
336 | { 0xfe410814, 0, 32, 8, /* INT2PRI5 */ { HUDI0, DMAC1_0, | ||
337 | DMAC1_1, DMAC1_2 } }, | ||
338 | { 0xfe410818, 0, 32, 8, /* INT2PRI6 */ { DMAC1_3, HPB_0, | ||
339 | HPB_1, HPB_2 } }, | ||
340 | { 0xfe41081c, 0, 32, 8, /* INT2PRI7 */ { SCIF0_0, SCIF0_1, | ||
341 | SCIF0_2, SCIF0_3 } }, | ||
342 | { 0xfe410820, 0, 32, 8, /* INT2PRI8 */ { SCIF1, TMU2, TMU3, 0 } }, | ||
343 | { 0xfe410824, 0, 32, 8, /* INT2PRI9 */ { 0, 0, SCIF2, SCIF3 } }, | ||
344 | { 0xfe410828, 0, 32, 8, /* INT2PRI10 */ { SCIF4, SCIF5, | ||
345 | Eth_0, Eth_1 } }, | ||
346 | { 0xfe41082c, 0, 32, 8, /* INT2PRI11 */ { 0, 0, 0, 0 } }, | ||
347 | { 0xfe410830, 0, 32, 8, /* INT2PRI12 */ { 0, 0, 0, 0 } }, | ||
348 | { 0xfe410834, 0, 32, 8, /* INT2PRI13 */ { 0, 0, 0, 0 } }, | ||
349 | { 0xfe410838, 0, 32, 8, /* INT2PRI14 */ { 0, 0, 0, PCIeC0_0 } }, | ||
350 | { 0xfe41083c, 0, 32, 8, /* INT2PRI15 */ { PCIeC0_1, PCIeC0_2, | ||
351 | PCIeC1_0, PCIeC1_1 } }, | ||
352 | { 0xfe410840, 0, 32, 8, /* INT2PRI16 */ { PCIeC1_2, USB, 0, 0 } }, | ||
353 | { 0xfe410844, 0, 32, 8, /* INT2PRI17 */ { 0, 0, 0, 0 } }, | ||
354 | { 0xfe410848, 0, 32, 8, /* INT2PRI18 */ { 0, 0, I2C0, I2C1 } }, | ||
355 | { 0xfe41084c, 0, 32, 8, /* INT2PRI19 */ { DU, SSI0, SSI1, SSI2 } }, | ||
356 | { 0xfe410850, 0, 32, 8, /* INT2PRI20 */ { SSI3, PCIeC2_0, | ||
357 | PCIeC2_1, PCIeC2_2 } }, | ||
358 | { 0xfe410854, 0, 32, 8, /* INT2PRI21 */ { HAC0, HAC1, FLCTL, 0 } }, | ||
359 | { 0xfe410858, 0, 32, 8, /* INT2PRI22 */ { HSPI, GPIO0, | ||
360 | GPIO1, Thermal } }, | ||
361 | { 0xfe41085c, 0, 32, 8, /* INT2PRI23 */ { 0, 0, 0, 0 } }, | ||
362 | { 0xfe410860, 0, 32, 8, /* INT2PRI24 */ { 0, 0, 0, 0 } }, | ||
363 | }; | ||
364 | |||
365 | static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL, | ||
366 | mask_registers, prio_registers, NULL); | ||
367 | |||
368 | /* Support for external interrupt pins in IRQ mode */ | ||
369 | |||
370 | static struct intc_vect vectors_irq0123[] __initdata = { | ||
371 | INTC_VECT(IRQ0, 0x200), INTC_VECT(IRQ1, 0x240), | ||
372 | INTC_VECT(IRQ2, 0x280), INTC_VECT(IRQ3, 0x2c0), | ||
373 | }; | ||
374 | |||
375 | static struct intc_vect vectors_irq4567[] __initdata = { | ||
376 | INTC_VECT(IRQ4, 0x300), INTC_VECT(IRQ5, 0x340), | ||
377 | INTC_VECT(IRQ6, 0x380), INTC_VECT(IRQ7, 0x3c0), | ||
378 | }; | ||
379 | |||
380 | static struct intc_sense_reg sense_registers[] __initdata = { | ||
381 | { 0xfe41001c, 32, 2, /* ICR1 */ { IRQ0, IRQ1, IRQ2, IRQ3, | ||
382 | IRQ4, IRQ5, IRQ6, IRQ7 } }, | ||
383 | }; | ||
384 | |||
385 | static struct intc_mask_reg ack_registers[] __initdata = { | ||
386 | { 0xfe410024, 0, 32, /* INTREQ */ | ||
387 | { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } }, | ||
388 | }; | ||
389 | |||
390 | static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7786-irq0123", | ||
391 | vectors_irq0123, NULL, mask_registers, | ||
392 | prio_registers, sense_registers, ack_registers); | ||
393 | |||
394 | static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7786-irq4567", | ||
395 | vectors_irq4567, NULL, mask_registers, | ||
396 | prio_registers, sense_registers, ack_registers); | ||
397 | |||
398 | /* External interrupt pins in IRL mode */ | ||
399 | |||
400 | static struct intc_vect vectors_irl0123[] __initdata = { | ||
401 | INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220), | ||
402 | INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260), | ||
403 | INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0), | ||
404 | INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0), | ||
405 | INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320), | ||
406 | INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360), | ||
407 | INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0), | ||
408 | INTC_VECT(IRL0_HHHL, 0x3c0), | ||
409 | }; | ||
410 | |||
411 | static struct intc_vect vectors_irl4567[] __initdata = { | ||
412 | INTC_VECT(IRL4_LLLL, 0x900), INTC_VECT(IRL4_LLLH, 0x920), | ||
413 | INTC_VECT(IRL4_LLHL, 0x940), INTC_VECT(IRL4_LLHH, 0x960), | ||
414 | INTC_VECT(IRL4_LHLL, 0x980), INTC_VECT(IRL4_LHLH, 0x9a0), | ||
415 | INTC_VECT(IRL4_LHHL, 0x9c0), INTC_VECT(IRL4_LHHH, 0x9e0), | ||
416 | INTC_VECT(IRL4_HLLL, 0xa00), INTC_VECT(IRL4_HLLH, 0xa20), | ||
417 | INTC_VECT(IRL4_HLHL, 0xa40), INTC_VECT(IRL4_HLHH, 0xa60), | ||
418 | INTC_VECT(IRL4_HHLL, 0xa80), INTC_VECT(IRL4_HHLH, 0xaa0), | ||
419 | INTC_VECT(IRL4_HHHL, 0xac0), | ||
420 | }; | ||
421 | |||
422 | static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7786-irl0123", vectors_irl0123, | ||
423 | NULL, mask_registers, NULL, NULL); | ||
424 | |||
425 | static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7786-irl4567", vectors_irl4567, | ||
426 | NULL, mask_registers, NULL, NULL); | ||
427 | |||
428 | #define INTC_ICR0 0xfe410000 | ||
429 | #define INTC_INTMSK0 CnINTMSK0 | ||
430 | #define INTC_INTMSK1 CnINTMSK1 | ||
431 | #define INTC_INTMSK2 INTMSK2 | ||
432 | #define INTC_INTMSKCLR1 CnINTMSKCLR1 | ||
433 | #define INTC_INTMSKCLR2 INTMSKCLR2 | ||
434 | |||
435 | void __init plat_irq_setup(void) | ||
436 | { | ||
437 | /* disable IRQ3-0 + IRQ7-4 */ | ||
438 | ctrl_outl(0xff000000, INTC_INTMSK0); | ||
439 | |||
440 | /* disable IRL3-0 + IRL7-4 */ | ||
441 | ctrl_outl(0xc0000000, INTC_INTMSK1); | ||
442 | ctrl_outl(0xfffefffe, INTC_INTMSK2); | ||
443 | |||
444 | /* select IRL mode for IRL3-0 + IRL7-4 */ | ||
445 | ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0); | ||
446 | |||
447 | register_intc_controller(&intc_desc); | ||
448 | } | ||
449 | |||
450 | void __init plat_irq_setup_pins(int mode) | ||
451 | { | ||
452 | switch (mode) { | ||
453 | case IRQ_MODE_IRQ7654: | ||
454 | /* select IRQ mode for IRL7-4 */ | ||
455 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00400000, INTC_ICR0); | ||
456 | register_intc_controller(&intc_desc_irq4567); | ||
457 | break; | ||
458 | case IRQ_MODE_IRQ3210: | ||
459 | /* select IRQ mode for IRL3-0 */ | ||
460 | ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00800000, INTC_ICR0); | ||
461 | register_intc_controller(&intc_desc_irq0123); | ||
462 | break; | ||
463 | case IRQ_MODE_IRL7654: | ||
464 | /* enable IRL7-4 but don't provide any masking */ | ||
465 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | ||
466 | ctrl_outl(0x0000fffe, INTC_INTMSKCLR2); | ||
467 | break; | ||
468 | case IRQ_MODE_IRL3210: | ||
469 | /* enable IRL0-3 but don't provide any masking */ | ||
470 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | ||
471 | ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); | ||
472 | break; | ||
473 | case IRQ_MODE_IRL7654_MASK: | ||
474 | /* enable IRL7-4 and mask using cpu intc controller */ | ||
475 | ctrl_outl(0x40000000, INTC_INTMSKCLR1); | ||
476 | register_intc_controller(&intc_desc_irl4567); | ||
477 | break; | ||
478 | case IRQ_MODE_IRL3210_MASK: | ||
479 | /* enable IRL0-3 and mask using cpu intc controller */ | ||
480 | ctrl_outl(0x80000000, INTC_INTMSKCLR1); | ||
481 | register_intc_controller(&intc_desc_irl0123); | ||
482 | break; | ||
483 | default: | ||
484 | BUG(); | ||
485 | } | ||
486 | } | ||
487 | |||
488 | void __init plat_mem_setup(void) | ||
489 | { | ||
490 | } | ||
diff --git a/arch/sh/kernel/cpu/shmobile/Makefile b/arch/sh/kernel/cpu/shmobile/Makefile new file mode 100644 index 000000000000..08bfa7c7db29 --- /dev/null +++ b/arch/sh/kernel/cpu/shmobile/Makefile | |||
@@ -0,0 +1,6 @@ | |||
1 | # | ||
2 | # Makefile for the Linux/SuperH SH-Mobile backends. | ||
3 | # | ||
4 | |||
5 | # Power Management & Sleep mode | ||
6 | obj-$(CONFIG_PM) += pm.o sleep.o | ||
diff --git a/arch/sh/kernel/cpu/shmobile/pm.c b/arch/sh/kernel/cpu/shmobile/pm.c new file mode 100644 index 000000000000..8c067adf6830 --- /dev/null +++ b/arch/sh/kernel/cpu/shmobile/pm.c | |||
@@ -0,0 +1,92 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/cpu/sh4a/pm-sh_mobile.c | ||
3 | * | ||
4 | * Power management support code for SuperH Mobile | ||
5 | * | ||
6 | * Copyright (C) 2009 Magnus Damm | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/suspend.h> | ||
16 | #include <asm/suspend.h> | ||
17 | #include <asm/uaccess.h> | ||
18 | |||
19 | /* | ||
20 | * Sleep modes available on SuperH Mobile: | ||
21 | * | ||
22 | * Sleep mode is just plain "sleep" instruction | ||
23 | * Sleep Self-Refresh mode is above plus RAM put in Self-Refresh | ||
24 | * Standby Self-Refresh mode is above plus stopped clocks | ||
25 | */ | ||
26 | #define SUSP_MODE_SLEEP (SUSP_SH_SLEEP) | ||
27 | #define SUSP_MODE_SLEEP_SF (SUSP_SH_SLEEP | SUSP_SH_SF) | ||
28 | #define SUSP_MODE_STANDBY_SF (SUSP_SH_STANDBY | SUSP_SH_SF) | ||
29 | |||
30 | /* | ||
31 | * The following modes are not there yet: | ||
32 | * | ||
33 | * R-standby mode is unsupported, but will be added in the future | ||
34 | * U-standby mode is low priority since it needs bootloader hacks | ||
35 | * | ||
36 | * All modes should be tied in with cpuidle. But before that can | ||
37 | * happen we need to keep track of enabled hardware blocks so we | ||
38 | * can avoid entering sleep modes that stop clocks to hardware | ||
39 | * blocks that are in use even though the cpu core is idle. | ||
40 | */ | ||
41 | |||
42 | extern const unsigned char sh_mobile_standby[]; | ||
43 | extern const unsigned int sh_mobile_standby_size; | ||
44 | |||
45 | static void sh_mobile_call_standby(unsigned long mode) | ||
46 | { | ||
47 | extern void *vbr_base; | ||
48 | void *onchip_mem = (void *)0xe5200000; /* ILRAM */ | ||
49 | void (*standby_onchip_mem)(unsigned long) = onchip_mem; | ||
50 | |||
51 | /* Note: Wake up from sleep may generate exceptions! | ||
52 | * Setup VBR to point to on-chip ram if self-refresh is | ||
53 | * going to be used. | ||
54 | */ | ||
55 | if (mode & SUSP_SH_SF) | ||
56 | asm volatile("ldc %0, vbr" : : "r" (onchip_mem) : "memory"); | ||
57 | |||
58 | /* Copy the assembly snippet to the otherwise ununsed ILRAM */ | ||
59 | memcpy(onchip_mem, sh_mobile_standby, sh_mobile_standby_size); | ||
60 | wmb(); | ||
61 | ctrl_barrier(); | ||
62 | |||
63 | /* Let assembly snippet in on-chip memory handle the rest */ | ||
64 | standby_onchip_mem(mode); | ||
65 | |||
66 | /* Put VBR back in System RAM again */ | ||
67 | if (mode & SUSP_SH_SF) | ||
68 | asm volatile("ldc %0, vbr" : : "r" (&vbr_base) : "memory"); | ||
69 | } | ||
70 | |||
71 | static int sh_pm_enter(suspend_state_t state) | ||
72 | { | ||
73 | local_irq_disable(); | ||
74 | set_bl_bit(); | ||
75 | sh_mobile_call_standby(SUSP_MODE_STANDBY_SF); | ||
76 | local_irq_disable(); | ||
77 | clear_bl_bit(); | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static struct platform_suspend_ops sh_pm_ops = { | ||
82 | .enter = sh_pm_enter, | ||
83 | .valid = suspend_valid_only_mem, | ||
84 | }; | ||
85 | |||
86 | static int __init sh_pm_init(void) | ||
87 | { | ||
88 | suspend_set_ops(&sh_pm_ops); | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | late_initcall(sh_pm_init); | ||
diff --git a/arch/sh/kernel/cpu/shmobile/sleep.S b/arch/sh/kernel/cpu/shmobile/sleep.S new file mode 100644 index 000000000000..5d888ef53d82 --- /dev/null +++ b/arch/sh/kernel/cpu/shmobile/sleep.S | |||
@@ -0,0 +1,125 @@ | |||
1 | /* | ||
2 | * arch/sh/kernel/cpu/sh4a/sleep-sh_mobile.S | ||
3 | * | ||
4 | * Sleep mode and Standby modes support for SuperH Mobile | ||
5 | * | ||
6 | * Copyright (C) 2009 Magnus Damm | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | |||
13 | #include <linux/sys.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/linkage.h> | ||
16 | #include <asm/asm-offsets.h> | ||
17 | #include <asm/suspend.h> | ||
18 | |||
19 | /* manage self-refresh and enter standby mode. | ||
20 | * this code will be copied to on-chip memory and executed from there. | ||
21 | */ | ||
22 | |||
23 | .balign 4096,0,4096 | ||
24 | ENTRY(sh_mobile_standby) | ||
25 | mov r4, r0 | ||
26 | |||
27 | tst #SUSP_SH_SF, r0 | ||
28 | bt skip_set_sf | ||
29 | |||
30 | /* SDRAM: disable power down and put in self-refresh mode */ | ||
31 | mov.l 1f, r4 | ||
32 | mov.l 2f, r1 | ||
33 | mov.l @r4, r2 | ||
34 | or r1, r2 | ||
35 | mov.l 3f, r3 | ||
36 | and r3, r2 | ||
37 | mov.l r2, @r4 | ||
38 | |||
39 | skip_set_sf: | ||
40 | tst #SUSP_SH_SLEEP, r0 | ||
41 | bt test_standby | ||
42 | |||
43 | /* set mode to "sleep mode" */ | ||
44 | bra do_sleep | ||
45 | mov #0x00, r1 | ||
46 | |||
47 | test_standby: | ||
48 | tst #SUSP_SH_STANDBY, r0 | ||
49 | bt test_rstandby | ||
50 | |||
51 | /* set mode to "software standby mode" */ | ||
52 | bra do_sleep | ||
53 | mov #0x80, r1 | ||
54 | |||
55 | test_rstandby: | ||
56 | tst #SUSP_SH_RSTANDBY, r0 | ||
57 | bt test_ustandby | ||
58 | |||
59 | /* set mode to "r-standby mode" */ | ||
60 | bra do_sleep | ||
61 | mov #0x20, r1 | ||
62 | |||
63 | test_ustandby: | ||
64 | tst #SUSP_SH_USTANDBY, r0 | ||
65 | bt done_sleep | ||
66 | |||
67 | /* set mode to "u-standby mode" */ | ||
68 | mov #0x10, r1 | ||
69 | |||
70 | /* fall-through */ | ||
71 | |||
72 | do_sleep: | ||
73 | /* setup and enter selected standby mode */ | ||
74 | mov.l 5f, r4 | ||
75 | mov.l r1, @r4 | ||
76 | sleep | ||
77 | |||
78 | done_sleep: | ||
79 | /* reset standby mode to sleep mode */ | ||
80 | mov.l 5f, r4 | ||
81 | mov #0x00, r1 | ||
82 | mov.l r1, @r4 | ||
83 | |||
84 | tst #SUSP_SH_SF, r0 | ||
85 | bt skip_restore_sf | ||
86 | |||
87 | /* SDRAM: set auto-refresh mode */ | ||
88 | mov.l 1f, r4 | ||
89 | mov.l @r4, r2 | ||
90 | mov.l 4f, r3 | ||
91 | and r3, r2 | ||
92 | mov.l r2, @r4 | ||
93 | mov.l 6f, r4 | ||
94 | mov.l 7f, r1 | ||
95 | mov.l 8f, r2 | ||
96 | mov.l @r4, r3 | ||
97 | mov #-1, r4 | ||
98 | add r4, r3 | ||
99 | or r2, r3 | ||
100 | mov.l r3, @r1 | ||
101 | skip_restore_sf: | ||
102 | rts | ||
103 | nop | ||
104 | |||
105 | .balign 4 | ||
106 | 1: .long 0xfe400008 /* SDCR0 */ | ||
107 | 2: .long 0x00000400 | ||
108 | 3: .long 0xffff7fff | ||
109 | 4: .long 0xfffffbff | ||
110 | 5: .long 0xa4150020 /* STBCR */ | ||
111 | 6: .long 0xfe40001c /* RTCOR */ | ||
112 | 7: .long 0xfe400018 /* RTCNT */ | ||
113 | 8: .long 0xa55a0000 | ||
114 | |||
115 | /* interrupt vector @ 0x600 */ | ||
116 | .balign 0x400,0,0x400 | ||
117 | .long 0xdeadbeef | ||
118 | .balign 0x200,0,0x200 | ||
119 | /* sh7722 will end up here in sleep mode */ | ||
120 | rte | ||
121 | nop | ||
122 | sh_mobile_standby_end: | ||
123 | |||
124 | ENTRY(sh_mobile_standby_size) | ||
125 | .long sh_mobile_standby_end - sh_mobile_standby | ||
diff --git a/arch/sh/kernel/gpio.c b/arch/sh/kernel/gpio.c index d37165361034..d22e5af699f9 100644 --- a/arch/sh/kernel/gpio.c +++ b/arch/sh/kernel/gpio.c | |||
@@ -19,36 +19,75 @@ | |||
19 | #include <linux/bitops.h> | 19 | #include <linux/bitops.h> |
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | 21 | ||
22 | static struct pinmux_info *registered_gpio; | 22 | static int enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r) |
23 | { | ||
24 | if (enum_id < r->begin) | ||
25 | return 0; | ||
23 | 26 | ||
24 | static struct pinmux_info *gpio_controller(unsigned gpio) | 27 | if (enum_id > r->end) |
28 | return 0; | ||
29 | |||
30 | return 1; | ||
31 | } | ||
32 | |||
33 | static unsigned long gpio_read_raw_reg(unsigned long reg, | ||
34 | unsigned long reg_width) | ||
25 | { | 35 | { |
26 | if (!registered_gpio) | 36 | switch (reg_width) { |
27 | return NULL; | 37 | case 8: |
38 | return ctrl_inb(reg); | ||
39 | case 16: | ||
40 | return ctrl_inw(reg); | ||
41 | case 32: | ||
42 | return ctrl_inl(reg); | ||
43 | } | ||
28 | 44 | ||
29 | if (gpio < registered_gpio->first_gpio) | 45 | BUG(); |
30 | return NULL; | 46 | return 0; |
47 | } | ||
31 | 48 | ||
32 | if (gpio > registered_gpio->last_gpio) | 49 | static void gpio_write_raw_reg(unsigned long reg, |
33 | return NULL; | 50 | unsigned long reg_width, |
51 | unsigned long data) | ||
52 | { | ||
53 | switch (reg_width) { | ||
54 | case 8: | ||
55 | ctrl_outb(data, reg); | ||
56 | return; | ||
57 | case 16: | ||
58 | ctrl_outw(data, reg); | ||
59 | return; | ||
60 | case 32: | ||
61 | ctrl_outl(data, reg); | ||
62 | return; | ||
63 | } | ||
34 | 64 | ||
35 | return registered_gpio; | 65 | BUG(); |
36 | } | 66 | } |
37 | 67 | ||
38 | static int enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r) | 68 | static void gpio_write_bit(struct pinmux_data_reg *dr, |
69 | unsigned long in_pos, unsigned long value) | ||
39 | { | 70 | { |
40 | if (enum_id < r->begin) | 71 | unsigned long pos; |
41 | return 0; | ||
42 | 72 | ||
43 | if (enum_id > r->end) | 73 | pos = dr->reg_width - (in_pos + 1); |
44 | return 0; | ||
45 | 74 | ||
46 | return 1; | 75 | #ifdef DEBUG |
76 | pr_info("write_bit addr = %lx, value = %ld, pos = %ld, " | ||
77 | "r_width = %ld\n", | ||
78 | dr->reg, !!value, pos, dr->reg_width); | ||
79 | #endif | ||
80 | |||
81 | if (value) | ||
82 | set_bit(pos, &dr->reg_shadow); | ||
83 | else | ||
84 | clear_bit(pos, &dr->reg_shadow); | ||
85 | |||
86 | gpio_write_raw_reg(dr->reg, dr->reg_width, dr->reg_shadow); | ||
47 | } | 87 | } |
48 | 88 | ||
49 | static int read_write_reg(unsigned long reg, unsigned long reg_width, | 89 | static int gpio_read_reg(unsigned long reg, unsigned long reg_width, |
50 | unsigned long field_width, unsigned long in_pos, | 90 | unsigned long field_width, unsigned long in_pos) |
51 | unsigned long value, int do_write) | ||
52 | { | 91 | { |
53 | unsigned long data, mask, pos; | 92 | unsigned long data, mask, pos; |
54 | 93 | ||
@@ -57,52 +96,53 @@ static int read_write_reg(unsigned long reg, unsigned long reg_width, | |||
57 | pos = reg_width - ((in_pos + 1) * field_width); | 96 | pos = reg_width - ((in_pos + 1) * field_width); |
58 | 97 | ||
59 | #ifdef DEBUG | 98 | #ifdef DEBUG |
60 | pr_info("%s, addr = %lx, value = %ld, pos = %ld, " | 99 | pr_info("read_reg: addr = %lx, pos = %ld, " |
61 | "r_width = %ld, f_width = %ld\n", | 100 | "r_width = %ld, f_width = %ld\n", |
62 | do_write ? "write" : "read", reg, value, pos, | 101 | reg, pos, reg_width, field_width); |
63 | reg_width, field_width); | ||
64 | #endif | 102 | #endif |
65 | 103 | ||
66 | switch (reg_width) { | 104 | data = gpio_read_raw_reg(reg, reg_width); |
67 | case 8: | 105 | return (data >> pos) & mask; |
68 | data = ctrl_inb(reg); | 106 | } |
69 | break; | ||
70 | case 16: | ||
71 | data = ctrl_inw(reg); | ||
72 | break; | ||
73 | case 32: | ||
74 | data = ctrl_inl(reg); | ||
75 | break; | ||
76 | } | ||
77 | 107 | ||
78 | if (!do_write) | 108 | static void gpio_write_reg(unsigned long reg, unsigned long reg_width, |
79 | return (data >> pos) & mask; | 109 | unsigned long field_width, unsigned long in_pos, |
110 | unsigned long value) | ||
111 | { | ||
112 | unsigned long mask, pos; | ||
80 | 113 | ||
81 | data &= ~(mask << pos); | 114 | mask = (1 << field_width) - 1; |
82 | data |= value << pos; | 115 | pos = reg_width - ((in_pos + 1) * field_width); |
116 | |||
117 | #ifdef DEBUG | ||
118 | pr_info("write_reg addr = %lx, value = %ld, pos = %ld, " | ||
119 | "r_width = %ld, f_width = %ld\n", | ||
120 | reg, value, pos, reg_width, field_width); | ||
121 | #endif | ||
122 | |||
123 | mask = ~(mask << pos); | ||
124 | value = value << pos; | ||
83 | 125 | ||
84 | switch (reg_width) { | 126 | switch (reg_width) { |
85 | case 8: | 127 | case 8: |
86 | ctrl_outb(data, reg); | 128 | ctrl_outb((ctrl_inb(reg) & mask) | value, reg); |
87 | break; | 129 | break; |
88 | case 16: | 130 | case 16: |
89 | ctrl_outw(data, reg); | 131 | ctrl_outw((ctrl_inw(reg) & mask) | value, reg); |
90 | break; | 132 | break; |
91 | case 32: | 133 | case 32: |
92 | ctrl_outl(data, reg); | 134 | ctrl_outl((ctrl_inl(reg) & mask) | value, reg); |
93 | break; | 135 | break; |
94 | } | 136 | } |
95 | return 0; | ||
96 | } | 137 | } |
97 | 138 | ||
98 | static int get_data_reg(struct pinmux_info *gpioc, unsigned gpio, | 139 | static int setup_data_reg(struct pinmux_info *gpioc, unsigned gpio) |
99 | struct pinmux_data_reg **drp, int *bitp) | ||
100 | { | 140 | { |
101 | pinmux_enum_t enum_id = gpioc->gpios[gpio].enum_id; | 141 | struct pinmux_gpio *gpiop = &gpioc->gpios[gpio]; |
102 | struct pinmux_data_reg *data_reg; | 142 | struct pinmux_data_reg *data_reg; |
103 | int k, n; | 143 | int k, n; |
104 | 144 | ||
105 | if (!enum_in_range(enum_id, &gpioc->data)) | 145 | if (!enum_in_range(gpiop->enum_id, &gpioc->data)) |
106 | return -1; | 146 | return -1; |
107 | 147 | ||
108 | k = 0; | 148 | k = 0; |
@@ -113,19 +153,58 @@ static int get_data_reg(struct pinmux_info *gpioc, unsigned gpio, | |||
113 | break; | 153 | break; |
114 | 154 | ||
115 | for (n = 0; n < data_reg->reg_width; n++) { | 155 | for (n = 0; n < data_reg->reg_width; n++) { |
116 | if (data_reg->enum_ids[n] == enum_id) { | 156 | if (data_reg->enum_ids[n] == gpiop->enum_id) { |
117 | *drp = data_reg; | 157 | gpiop->flags &= ~PINMUX_FLAG_DREG; |
118 | *bitp = n; | 158 | gpiop->flags |= (k << PINMUX_FLAG_DREG_SHIFT); |
159 | gpiop->flags &= ~PINMUX_FLAG_DBIT; | ||
160 | gpiop->flags |= (n << PINMUX_FLAG_DBIT_SHIFT); | ||
119 | return 0; | 161 | return 0; |
120 | |||
121 | } | 162 | } |
122 | } | 163 | } |
123 | k++; | 164 | k++; |
124 | } | 165 | } |
125 | 166 | ||
167 | BUG(); | ||
168 | |||
126 | return -1; | 169 | return -1; |
127 | } | 170 | } |
128 | 171 | ||
172 | static void setup_data_regs(struct pinmux_info *gpioc) | ||
173 | { | ||
174 | struct pinmux_data_reg *drp; | ||
175 | int k; | ||
176 | |||
177 | for (k = gpioc->first_gpio; k <= gpioc->last_gpio; k++) | ||
178 | setup_data_reg(gpioc, k); | ||
179 | |||
180 | k = 0; | ||
181 | while (1) { | ||
182 | drp = gpioc->data_regs + k; | ||
183 | |||
184 | if (!drp->reg_width) | ||
185 | break; | ||
186 | |||
187 | drp->reg_shadow = gpio_read_raw_reg(drp->reg, drp->reg_width); | ||
188 | k++; | ||
189 | } | ||
190 | } | ||
191 | |||
192 | static int get_data_reg(struct pinmux_info *gpioc, unsigned gpio, | ||
193 | struct pinmux_data_reg **drp, int *bitp) | ||
194 | { | ||
195 | struct pinmux_gpio *gpiop = &gpioc->gpios[gpio]; | ||
196 | int k, n; | ||
197 | |||
198 | if (!enum_in_range(gpiop->enum_id, &gpioc->data)) | ||
199 | return -1; | ||
200 | |||
201 | k = (gpiop->flags & PINMUX_FLAG_DREG) >> PINMUX_FLAG_DREG_SHIFT; | ||
202 | n = (gpiop->flags & PINMUX_FLAG_DBIT) >> PINMUX_FLAG_DBIT_SHIFT; | ||
203 | *drp = gpioc->data_regs + k; | ||
204 | *bitp = n; | ||
205 | return 0; | ||
206 | } | ||
207 | |||
129 | static int get_config_reg(struct pinmux_info *gpioc, pinmux_enum_t enum_id, | 208 | static int get_config_reg(struct pinmux_info *gpioc, pinmux_enum_t enum_id, |
130 | struct pinmux_cfg_reg **crp, int *indexp, | 209 | struct pinmux_cfg_reg **crp, int *indexp, |
131 | unsigned long **cntp) | 210 | unsigned long **cntp) |
@@ -187,9 +266,9 @@ static int get_gpio_enum_id(struct pinmux_info *gpioc, unsigned gpio, | |||
187 | return -1; | 266 | return -1; |
188 | } | 267 | } |
189 | 268 | ||
190 | static int write_config_reg(struct pinmux_info *gpioc, | 269 | static void write_config_reg(struct pinmux_info *gpioc, |
191 | struct pinmux_cfg_reg *crp, | 270 | struct pinmux_cfg_reg *crp, |
192 | int index) | 271 | int index) |
193 | { | 272 | { |
194 | unsigned long ncomb, pos, value; | 273 | unsigned long ncomb, pos, value; |
195 | 274 | ||
@@ -197,8 +276,7 @@ static int write_config_reg(struct pinmux_info *gpioc, | |||
197 | pos = index / ncomb; | 276 | pos = index / ncomb; |
198 | value = index % ncomb; | 277 | value = index % ncomb; |
199 | 278 | ||
200 | return read_write_reg(crp->reg, crp->reg_width, | 279 | gpio_write_reg(crp->reg, crp->reg_width, crp->field_width, pos, value); |
201 | crp->field_width, pos, value, 1); | ||
202 | } | 280 | } |
203 | 281 | ||
204 | static int check_config_reg(struct pinmux_info *gpioc, | 282 | static int check_config_reg(struct pinmux_info *gpioc, |
@@ -211,8 +289,8 @@ static int check_config_reg(struct pinmux_info *gpioc, | |||
211 | pos = index / ncomb; | 289 | pos = index / ncomb; |
212 | value = index % ncomb; | 290 | value = index % ncomb; |
213 | 291 | ||
214 | if (read_write_reg(crp->reg, crp->reg_width, | 292 | if (gpio_read_reg(crp->reg, crp->reg_width, |
215 | crp->field_width, pos, 0, 0) == value) | 293 | crp->field_width, pos) == value) |
216 | return 0; | 294 | return 0; |
217 | 295 | ||
218 | return -1; | 296 | return -1; |
@@ -220,8 +298,8 @@ static int check_config_reg(struct pinmux_info *gpioc, | |||
220 | 298 | ||
221 | enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE }; | 299 | enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE }; |
222 | 300 | ||
223 | int pinmux_config_gpio(struct pinmux_info *gpioc, unsigned gpio, | 301 | static int pinmux_config_gpio(struct pinmux_info *gpioc, unsigned gpio, |
224 | int pinmux_type, int cfg_mode) | 302 | int pinmux_type, int cfg_mode) |
225 | { | 303 | { |
226 | struct pinmux_cfg_reg *cr = NULL; | 304 | struct pinmux_cfg_reg *cr = NULL; |
227 | pinmux_enum_t enum_id; | 305 | pinmux_enum_t enum_id; |
@@ -287,8 +365,7 @@ int pinmux_config_gpio(struct pinmux_info *gpioc, unsigned gpio, | |||
287 | break; | 365 | break; |
288 | 366 | ||
289 | case GPIO_CFG_REQ: | 367 | case GPIO_CFG_REQ: |
290 | if (write_config_reg(gpioc, cr, index) != 0) | 368 | write_config_reg(gpioc, cr, index); |
291 | goto out_err; | ||
292 | *cntp = *cntp + 1; | 369 | *cntp = *cntp + 1; |
293 | break; | 370 | break; |
294 | 371 | ||
@@ -305,9 +382,14 @@ int pinmux_config_gpio(struct pinmux_info *gpioc, unsigned gpio, | |||
305 | 382 | ||
306 | static DEFINE_SPINLOCK(gpio_lock); | 383 | static DEFINE_SPINLOCK(gpio_lock); |
307 | 384 | ||
308 | int __gpio_request(unsigned gpio) | 385 | static struct pinmux_info *chip_to_pinmux(struct gpio_chip *chip) |
309 | { | 386 | { |
310 | struct pinmux_info *gpioc = gpio_controller(gpio); | 387 | return container_of(chip, struct pinmux_info, chip); |
388 | } | ||
389 | |||
390 | static int sh_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
391 | { | ||
392 | struct pinmux_info *gpioc = chip_to_pinmux(chip); | ||
311 | struct pinmux_data_reg *dummy; | 393 | struct pinmux_data_reg *dummy; |
312 | unsigned long flags; | 394 | unsigned long flags; |
313 | int i, ret, pinmux_type; | 395 | int i, ret, pinmux_type; |
@@ -319,29 +401,30 @@ int __gpio_request(unsigned gpio) | |||
319 | 401 | ||
320 | spin_lock_irqsave(&gpio_lock, flags); | 402 | spin_lock_irqsave(&gpio_lock, flags); |
321 | 403 | ||
322 | if ((gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE) != PINMUX_TYPE_NONE) | 404 | if ((gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE) != PINMUX_TYPE_NONE) |
323 | goto err_unlock; | 405 | goto err_unlock; |
324 | 406 | ||
325 | /* setup pin function here if no data is associated with pin */ | 407 | /* setup pin function here if no data is associated with pin */ |
326 | 408 | ||
327 | if (get_data_reg(gpioc, gpio, &dummy, &i) != 0) | 409 | if (get_data_reg(gpioc, offset, &dummy, &i) != 0) |
328 | pinmux_type = PINMUX_TYPE_FUNCTION; | 410 | pinmux_type = PINMUX_TYPE_FUNCTION; |
329 | else | 411 | else |
330 | pinmux_type = PINMUX_TYPE_GPIO; | 412 | pinmux_type = PINMUX_TYPE_GPIO; |
331 | 413 | ||
332 | if (pinmux_type == PINMUX_TYPE_FUNCTION) { | 414 | if (pinmux_type == PINMUX_TYPE_FUNCTION) { |
333 | if (pinmux_config_gpio(gpioc, gpio, | 415 | if (pinmux_config_gpio(gpioc, offset, |
334 | pinmux_type, | 416 | pinmux_type, |
335 | GPIO_CFG_DRYRUN) != 0) | 417 | GPIO_CFG_DRYRUN) != 0) |
336 | goto err_unlock; | 418 | goto err_unlock; |
337 | 419 | ||
338 | if (pinmux_config_gpio(gpioc, gpio, | 420 | if (pinmux_config_gpio(gpioc, offset, |
339 | pinmux_type, | 421 | pinmux_type, |
340 | GPIO_CFG_REQ) != 0) | 422 | GPIO_CFG_REQ) != 0) |
341 | BUG(); | 423 | BUG(); |
342 | } | 424 | } |
343 | 425 | ||
344 | gpioc->gpios[gpio].flags = pinmux_type; | 426 | gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; |
427 | gpioc->gpios[offset].flags |= pinmux_type; | ||
345 | 428 | ||
346 | ret = 0; | 429 | ret = 0; |
347 | err_unlock: | 430 | err_unlock: |
@@ -349,11 +432,10 @@ int __gpio_request(unsigned gpio) | |||
349 | err_out: | 432 | err_out: |
350 | return ret; | 433 | return ret; |
351 | } | 434 | } |
352 | EXPORT_SYMBOL(__gpio_request); | ||
353 | 435 | ||
354 | void gpio_free(unsigned gpio) | 436 | static void sh_gpio_free(struct gpio_chip *chip, unsigned offset) |
355 | { | 437 | { |
356 | struct pinmux_info *gpioc = gpio_controller(gpio); | 438 | struct pinmux_info *gpioc = chip_to_pinmux(chip); |
357 | unsigned long flags; | 439 | unsigned long flags; |
358 | int pinmux_type; | 440 | int pinmux_type; |
359 | 441 | ||
@@ -362,20 +444,23 @@ void gpio_free(unsigned gpio) | |||
362 | 444 | ||
363 | spin_lock_irqsave(&gpio_lock, flags); | 445 | spin_lock_irqsave(&gpio_lock, flags); |
364 | 446 | ||
365 | pinmux_type = gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE; | 447 | pinmux_type = gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE; |
366 | pinmux_config_gpio(gpioc, gpio, pinmux_type, GPIO_CFG_FREE); | 448 | pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_FREE); |
367 | gpioc->gpios[gpio].flags = PINMUX_TYPE_NONE; | 449 | gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; |
450 | gpioc->gpios[offset].flags |= PINMUX_TYPE_NONE; | ||
368 | 451 | ||
369 | spin_unlock_irqrestore(&gpio_lock, flags); | 452 | spin_unlock_irqrestore(&gpio_lock, flags); |
370 | } | 453 | } |
371 | EXPORT_SYMBOL(gpio_free); | ||
372 | 454 | ||
373 | static int pinmux_direction(struct pinmux_info *gpioc, | 455 | static int pinmux_direction(struct pinmux_info *gpioc, |
374 | unsigned gpio, int new_pinmux_type) | 456 | unsigned gpio, int new_pinmux_type) |
375 | { | 457 | { |
376 | int ret, pinmux_type; | 458 | int pinmux_type; |
459 | int ret = -EINVAL; | ||
460 | |||
461 | if (!gpioc) | ||
462 | goto err_out; | ||
377 | 463 | ||
378 | ret = -EINVAL; | ||
379 | pinmux_type = gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE; | 464 | pinmux_type = gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE; |
380 | 465 | ||
381 | switch (pinmux_type) { | 466 | switch (pinmux_type) { |
@@ -401,102 +486,99 @@ static int pinmux_direction(struct pinmux_info *gpioc, | |||
401 | GPIO_CFG_REQ) != 0) | 486 | GPIO_CFG_REQ) != 0) |
402 | BUG(); | 487 | BUG(); |
403 | 488 | ||
404 | gpioc->gpios[gpio].flags = new_pinmux_type; | 489 | gpioc->gpios[gpio].flags &= ~PINMUX_FLAG_TYPE; |
490 | gpioc->gpios[gpio].flags |= new_pinmux_type; | ||
405 | 491 | ||
406 | ret = 0; | 492 | ret = 0; |
407 | err_out: | 493 | err_out: |
408 | return ret; | 494 | return ret; |
409 | } | 495 | } |
410 | 496 | ||
411 | int gpio_direction_input(unsigned gpio) | 497 | static int sh_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
412 | { | 498 | { |
413 | struct pinmux_info *gpioc = gpio_controller(gpio); | 499 | struct pinmux_info *gpioc = chip_to_pinmux(chip); |
414 | unsigned long flags; | 500 | unsigned long flags; |
415 | int ret = -EINVAL; | 501 | int ret; |
416 | |||
417 | if (!gpioc) | ||
418 | goto err_out; | ||
419 | 502 | ||
420 | spin_lock_irqsave(&gpio_lock, flags); | 503 | spin_lock_irqsave(&gpio_lock, flags); |
421 | ret = pinmux_direction(gpioc, gpio, PINMUX_TYPE_INPUT); | 504 | ret = pinmux_direction(gpioc, offset, PINMUX_TYPE_INPUT); |
422 | spin_unlock_irqrestore(&gpio_lock, flags); | 505 | spin_unlock_irqrestore(&gpio_lock, flags); |
423 | err_out: | 506 | |
424 | return ret; | 507 | return ret; |
425 | } | 508 | } |
426 | EXPORT_SYMBOL(gpio_direction_input); | ||
427 | 509 | ||
428 | static int __gpio_get_set_value(struct pinmux_info *gpioc, | 510 | static void sh_gpio_set_value(struct pinmux_info *gpioc, |
429 | unsigned gpio, int value, | 511 | unsigned gpio, int value) |
430 | int do_write) | ||
431 | { | 512 | { |
432 | struct pinmux_data_reg *dr = NULL; | 513 | struct pinmux_data_reg *dr = NULL; |
433 | int bit = 0; | 514 | int bit = 0; |
434 | 515 | ||
435 | if (get_data_reg(gpioc, gpio, &dr, &bit) != 0) | 516 | if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) |
436 | BUG(); | 517 | BUG(); |
437 | else | 518 | else |
438 | value = read_write_reg(dr->reg, dr->reg_width, | 519 | gpio_write_bit(dr, bit, value); |
439 | 1, bit, !!value, do_write); | ||
440 | |||
441 | return value; | ||
442 | } | 520 | } |
443 | 521 | ||
444 | int gpio_direction_output(unsigned gpio, int value) | 522 | static int sh_gpio_direction_output(struct gpio_chip *chip, unsigned offset, |
523 | int value) | ||
445 | { | 524 | { |
446 | struct pinmux_info *gpioc = gpio_controller(gpio); | 525 | struct pinmux_info *gpioc = chip_to_pinmux(chip); |
447 | unsigned long flags; | 526 | unsigned long flags; |
448 | int ret = -EINVAL; | 527 | int ret; |
449 | |||
450 | if (!gpioc) | ||
451 | goto err_out; | ||
452 | 528 | ||
529 | sh_gpio_set_value(gpioc, offset, value); | ||
453 | spin_lock_irqsave(&gpio_lock, flags); | 530 | spin_lock_irqsave(&gpio_lock, flags); |
454 | __gpio_get_set_value(gpioc, gpio, value, 1); | 531 | ret = pinmux_direction(gpioc, offset, PINMUX_TYPE_OUTPUT); |
455 | ret = pinmux_direction(gpioc, gpio, PINMUX_TYPE_OUTPUT); | ||
456 | spin_unlock_irqrestore(&gpio_lock, flags); | 532 | spin_unlock_irqrestore(&gpio_lock, flags); |
457 | err_out: | 533 | |
458 | return ret; | 534 | return ret; |
459 | } | 535 | } |
460 | EXPORT_SYMBOL(gpio_direction_output); | ||
461 | 536 | ||
462 | int gpio_get_value(unsigned gpio) | 537 | static int sh_gpio_get_value(struct pinmux_info *gpioc, unsigned gpio) |
463 | { | 538 | { |
464 | struct pinmux_info *gpioc = gpio_controller(gpio); | 539 | struct pinmux_data_reg *dr = NULL; |
465 | unsigned long flags; | 540 | int bit = 0; |
466 | int value = 0; | ||
467 | 541 | ||
468 | if (!gpioc) | 542 | if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) { |
469 | BUG(); | 543 | BUG(); |
470 | else { | 544 | return 0; |
471 | spin_lock_irqsave(&gpio_lock, flags); | ||
472 | value = __gpio_get_set_value(gpioc, gpio, 0, 0); | ||
473 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
474 | } | 545 | } |
475 | 546 | ||
476 | return value; | 547 | return gpio_read_reg(dr->reg, dr->reg_width, 1, bit); |
477 | } | 548 | } |
478 | EXPORT_SYMBOL(gpio_get_value); | ||
479 | 549 | ||
480 | void gpio_set_value(unsigned gpio, int value) | 550 | static int sh_gpio_get(struct gpio_chip *chip, unsigned offset) |
481 | { | 551 | { |
482 | struct pinmux_info *gpioc = gpio_controller(gpio); | 552 | return sh_gpio_get_value(chip_to_pinmux(chip), offset); |
483 | unsigned long flags; | 553 | } |
484 | 554 | ||
485 | if (!gpioc) | 555 | static void sh_gpio_set(struct gpio_chip *chip, unsigned offset, int value) |
486 | BUG(); | 556 | { |
487 | else { | 557 | sh_gpio_set_value(chip_to_pinmux(chip), offset, value); |
488 | spin_lock_irqsave(&gpio_lock, flags); | ||
489 | __gpio_get_set_value(gpioc, gpio, value, 1); | ||
490 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
491 | } | ||
492 | } | 558 | } |
493 | EXPORT_SYMBOL(gpio_set_value); | ||
494 | 559 | ||
495 | int register_pinmux(struct pinmux_info *pip) | 560 | int register_pinmux(struct pinmux_info *pip) |
496 | { | 561 | { |
497 | registered_gpio = pip; | 562 | struct gpio_chip *chip = &pip->chip; |
498 | pr_info("pinmux: %s handling gpio %d -> %d\n", | 563 | |
564 | pr_info("sh pinmux: %s handling gpio %d -> %d\n", | ||
499 | pip->name, pip->first_gpio, pip->last_gpio); | 565 | pip->name, pip->first_gpio, pip->last_gpio); |
500 | 566 | ||
501 | return 0; | 567 | setup_data_regs(pip); |
568 | |||
569 | chip->request = sh_gpio_request; | ||
570 | chip->free = sh_gpio_free; | ||
571 | chip->direction_input = sh_gpio_direction_input; | ||
572 | chip->get = sh_gpio_get; | ||
573 | chip->direction_output = sh_gpio_direction_output; | ||
574 | chip->set = sh_gpio_set; | ||
575 | |||
576 | WARN_ON(pip->first_gpio != 0); /* needs testing */ | ||
577 | |||
578 | chip->label = pip->name; | ||
579 | chip->owner = THIS_MODULE; | ||
580 | chip->base = pip->first_gpio; | ||
581 | chip->ngpio = (pip->last_gpio - pip->first_gpio) + 1; | ||
582 | |||
583 | return gpiochip_add(chip); | ||
502 | } | 584 | } |
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index 64b7690c664c..3f1372eb0091 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
@@ -51,7 +51,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
51 | goto unlock; | 51 | goto unlock; |
52 | seq_printf(p, "%3d: ",i); | 52 | seq_printf(p, "%3d: ",i); |
53 | for_each_online_cpu(j) | 53 | for_each_online_cpu(j) |
54 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 54 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
55 | seq_printf(p, " %14s", irq_desc[i].chip->name); | 55 | seq_printf(p, " %14s", irq_desc[i].chip->name); |
56 | seq_printf(p, "-%-8s", irq_desc[i].name); | 56 | seq_printf(p, "-%-8s", irq_desc[i].name); |
57 | seq_printf(p, " %s", action->name); | 57 | seq_printf(p, " %s", action->name); |
@@ -106,7 +106,7 @@ asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs) | |||
106 | } | 106 | } |
107 | #endif | 107 | #endif |
108 | 108 | ||
109 | irq = irq_demux(evt2irq(irq)); | 109 | irq = irq_demux(intc_evt2irq(irq)); |
110 | 110 | ||
111 | #ifdef CONFIG_IRQSTACKS | 111 | #ifdef CONFIG_IRQSTACKS |
112 | curctx = (union irq_ctx *)current_thread_info(); | 112 | curctx = (union irq_ctx *)current_thread_info(); |
diff --git a/arch/sh/kernel/machine_kexec.c b/arch/sh/kernel/machine_kexec.c index 94df56b0d1f6..7ea2704ea033 100644 --- a/arch/sh/kernel/machine_kexec.c +++ b/arch/sh/kernel/machine_kexec.c | |||
@@ -14,21 +14,22 @@ | |||
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/reboot.h> | 15 | #include <linux/reboot.h> |
16 | #include <linux/numa.h> | 16 | #include <linux/numa.h> |
17 | #include <linux/ftrace.h> | ||
18 | #include <linux/suspend.h> | ||
17 | #include <asm/pgtable.h> | 19 | #include <asm/pgtable.h> |
18 | #include <asm/pgalloc.h> | 20 | #include <asm/pgalloc.h> |
19 | #include <asm/mmu_context.h> | 21 | #include <asm/mmu_context.h> |
20 | #include <asm/io.h> | 22 | #include <asm/io.h> |
21 | #include <asm/cacheflush.h> | 23 | #include <asm/cacheflush.h> |
22 | 24 | ||
23 | typedef NORET_TYPE void (*relocate_new_kernel_t)( | 25 | typedef void (*relocate_new_kernel_t)(unsigned long indirection_page, |
24 | unsigned long indirection_page, | 26 | unsigned long reboot_code_buffer, |
25 | unsigned long reboot_code_buffer, | 27 | unsigned long start_address); |
26 | unsigned long start_address, | ||
27 | unsigned long vbr_reg) ATTRIB_NORET; | ||
28 | 28 | ||
29 | extern const unsigned char relocate_new_kernel[]; | 29 | extern const unsigned char relocate_new_kernel[]; |
30 | extern const unsigned int relocate_new_kernel_size; | 30 | extern const unsigned int relocate_new_kernel_size; |
31 | extern void *gdb_vbr_vector; | 31 | extern void *gdb_vbr_vector; |
32 | extern void *vbr_base; | ||
32 | 33 | ||
33 | void machine_shutdown(void) | 34 | void machine_shutdown(void) |
34 | { | 35 | { |
@@ -45,6 +46,12 @@ void machine_crash_shutdown(struct pt_regs *regs) | |||
45 | */ | 46 | */ |
46 | int machine_kexec_prepare(struct kimage *image) | 47 | int machine_kexec_prepare(struct kimage *image) |
47 | { | 48 | { |
49 | /* older versions of kexec-tools are passing | ||
50 | * the zImage entry point as a virtual address. | ||
51 | */ | ||
52 | if (image->start != PHYSADDR(image->start)) | ||
53 | return -EINVAL; /* upgrade your kexec-tools */ | ||
54 | |||
48 | return 0; | 55 | return 0; |
49 | } | 56 | } |
50 | 57 | ||
@@ -73,17 +80,33 @@ static void kexec_info(struct kimage *image) | |||
73 | */ | 80 | */ |
74 | void machine_kexec(struct kimage *image) | 81 | void machine_kexec(struct kimage *image) |
75 | { | 82 | { |
76 | |||
77 | unsigned long page_list; | 83 | unsigned long page_list; |
78 | unsigned long reboot_code_buffer; | 84 | unsigned long reboot_code_buffer; |
79 | unsigned long vbr_reg; | ||
80 | relocate_new_kernel_t rnk; | 85 | relocate_new_kernel_t rnk; |
86 | unsigned long entry; | ||
87 | unsigned long *ptr; | ||
88 | int save_ftrace_enabled; | ||
89 | |||
90 | /* | ||
91 | * Nicked from the mips version of machine_kexec(): | ||
92 | * The generic kexec code builds a page list with physical | ||
93 | * addresses. Use phys_to_virt() to convert them to virtual. | ||
94 | */ | ||
95 | for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); | ||
96 | ptr = (entry & IND_INDIRECTION) ? | ||
97 | phys_to_virt(entry & PAGE_MASK) : ptr + 1) { | ||
98 | if (*ptr & IND_SOURCE || *ptr & IND_INDIRECTION || | ||
99 | *ptr & IND_DESTINATION) | ||
100 | *ptr = (unsigned long) phys_to_virt(*ptr); | ||
101 | } | ||
81 | 102 | ||
82 | #if defined(CONFIG_SH_STANDARD_BIOS) | 103 | #ifdef CONFIG_KEXEC_JUMP |
83 | vbr_reg = ((unsigned long )gdb_vbr_vector) - 0x100; | 104 | if (image->preserve_context) |
84 | #else | 105 | save_processor_state(); |
85 | vbr_reg = 0x80000000; // dummy | ||
86 | #endif | 106 | #endif |
107 | |||
108 | save_ftrace_enabled = __ftrace_enabled_save(); | ||
109 | |||
87 | /* Interrupts aren't acceptable while we reboot */ | 110 | /* Interrupts aren't acceptable while we reboot */ |
88 | local_irq_disable(); | 111 | local_irq_disable(); |
89 | 112 | ||
@@ -97,12 +120,37 @@ void machine_kexec(struct kimage *image) | |||
97 | memcpy((void *)reboot_code_buffer, relocate_new_kernel, | 120 | memcpy((void *)reboot_code_buffer, relocate_new_kernel, |
98 | relocate_new_kernel_size); | 121 | relocate_new_kernel_size); |
99 | 122 | ||
100 | kexec_info(image); | 123 | kexec_info(image); |
101 | flush_cache_all(); | 124 | flush_cache_all(); |
102 | 125 | ||
126 | #if defined(CONFIG_SH_STANDARD_BIOS) | ||
127 | asm volatile("ldc %0, vbr" : | ||
128 | : "r" (((unsigned long) gdb_vbr_vector) - 0x100) | ||
129 | : "memory"); | ||
130 | #endif | ||
131 | |||
103 | /* now call it */ | 132 | /* now call it */ |
104 | rnk = (relocate_new_kernel_t) reboot_code_buffer; | 133 | rnk = (relocate_new_kernel_t) reboot_code_buffer; |
105 | (*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start), vbr_reg); | 134 | (*rnk)(page_list, reboot_code_buffer, |
135 | (unsigned long)phys_to_virt(image->start)); | ||
136 | |||
137 | #ifdef CONFIG_KEXEC_JUMP | ||
138 | asm volatile("ldc %0, vbr" : : "r" (&vbr_base) : "memory"); | ||
139 | |||
140 | if (image->preserve_context) | ||
141 | restore_processor_state(); | ||
142 | |||
143 | /* Convert page list back to physical addresses, what a mess. */ | ||
144 | for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); | ||
145 | ptr = (*ptr & IND_INDIRECTION) ? | ||
146 | phys_to_virt(*ptr & PAGE_MASK) : ptr + 1) { | ||
147 | if (*ptr & IND_SOURCE || *ptr & IND_INDIRECTION || | ||
148 | *ptr & IND_DESTINATION) | ||
149 | *ptr = virt_to_phys(*ptr); | ||
150 | } | ||
151 | #endif | ||
152 | |||
153 | __ftrace_enabled_restore(save_ftrace_enabled); | ||
106 | } | 154 | } |
107 | 155 | ||
108 | void arch_crash_save_vmcoreinfo(void) | 156 | void arch_crash_save_vmcoreinfo(void) |
diff --git a/arch/sh/kernel/relocate_kernel.S b/arch/sh/kernel/relocate_kernel.S index c66cb3209db5..fcc9934fb97b 100644 --- a/arch/sh/kernel/relocate_kernel.S +++ b/arch/sh/kernel/relocate_kernel.S | |||
@@ -4,6 +4,8 @@ | |||
4 | * | 4 | * |
5 | * LANDISK/sh4 is supported. Maybe, SH archtecture works well. | 5 | * LANDISK/sh4 is supported. Maybe, SH archtecture works well. |
6 | * | 6 | * |
7 | * 2009-03-18 Magnus Damm - Added Kexec Jump support | ||
8 | * | ||
7 | * This source code is licensed under the GNU General Public License, | 9 | * This source code is licensed under the GNU General Public License, |
8 | * Version 2. See the file COPYING for more details. | 10 | * Version 2. See the file COPYING for more details. |
9 | */ | 11 | */ |
@@ -16,23 +18,141 @@ relocate_new_kernel: | |||
16 | /* r4 = indirection_page */ | 18 | /* r4 = indirection_page */ |
17 | /* r5 = reboot_code_buffer */ | 19 | /* r5 = reboot_code_buffer */ |
18 | /* r6 = start_address */ | 20 | /* r6 = start_address */ |
19 | /* r7 = vbr_reg */ | ||
20 | 21 | ||
21 | mov.l 10f,r8 /* PAGE_SIZE */ | 22 | mov.l 10f, r0 /* PAGE_SIZE */ |
22 | mov.l 11f,r9 /* P2SEG */ | 23 | add r5, r0 /* setup new stack at end of control page */ |
24 | |||
25 | /* save r15->r8 to new stack */ | ||
26 | mov.l r15, @-r0 | ||
27 | mov r0, r15 | ||
28 | mov.l r14, @-r15 | ||
29 | mov.l r13, @-r15 | ||
30 | mov.l r12, @-r15 | ||
31 | mov.l r11, @-r15 | ||
32 | mov.l r10, @-r15 | ||
33 | mov.l r9, @-r15 | ||
34 | mov.l r8, @-r15 | ||
35 | |||
36 | /* save other random registers */ | ||
37 | sts.l macl, @-r15 | ||
38 | sts.l mach, @-r15 | ||
39 | stc.l gbr, @-r15 | ||
40 | stc.l ssr, @-r15 | ||
41 | stc.l sr, @-r15 | ||
42 | sts.l pr, @-r15 | ||
43 | stc.l spc, @-r15 | ||
44 | |||
45 | /* switch to bank1 and save r7->r0 */ | ||
46 | mov.l 12f, r9 | ||
47 | stc sr, r8 | ||
48 | or r9, r8 | ||
49 | ldc r8, sr | ||
50 | mov.l r7, @-r15 | ||
51 | mov.l r6, @-r15 | ||
52 | mov.l r5, @-r15 | ||
53 | mov.l r4, @-r15 | ||
54 | mov.l r3, @-r15 | ||
55 | mov.l r2, @-r15 | ||
56 | mov.l r1, @-r15 | ||
57 | mov.l r0, @-r15 | ||
58 | |||
59 | /* switch to bank0 and save r7->r0 */ | ||
60 | mov.l 12f, r9 | ||
61 | not r9, r9 | ||
62 | stc sr, r8 | ||
63 | and r9, r8 | ||
64 | ldc r8, sr | ||
65 | mov.l r7, @-r15 | ||
66 | mov.l r6, @-r15 | ||
67 | mov.l r5, @-r15 | ||
68 | mov.l r4, @-r15 | ||
69 | mov.l r3, @-r15 | ||
70 | mov.l r2, @-r15 | ||
71 | mov.l r1, @-r15 | ||
72 | mov.l r0, @-r15 | ||
73 | |||
74 | mov.l r4, @-r15 /* save indirection page again */ | ||
75 | |||
76 | bsr swap_pages /* swap pages before jumping to new kernel */ | ||
77 | nop | ||
78 | |||
79 | mova 11f, r0 | ||
80 | mov.l r15, @r0 /* save pointer to stack */ | ||
81 | |||
82 | jsr @r6 /* hand over control to new kernel */ | ||
83 | nop | ||
84 | |||
85 | mov.l 11f, r15 /* get pointer to stack */ | ||
86 | mov.l @r15+, r4 /* restore r4 to get indirection page */ | ||
23 | 87 | ||
24 | /* stack setting */ | 88 | bsr swap_pages /* swap pages back to previous state */ |
25 | add r8,r5 | 89 | nop |
26 | mov r5,r15 | ||
27 | 90 | ||
91 | /* make sure bank0 is active and restore r0->r7 */ | ||
92 | mov.l 12f, r9 | ||
93 | not r9, r9 | ||
94 | stc sr, r8 | ||
95 | and r9, r8 | ||
96 | ldc r8, sr | ||
97 | mov.l @r15+, r0 | ||
98 | mov.l @r15+, r1 | ||
99 | mov.l @r15+, r2 | ||
100 | mov.l @r15+, r3 | ||
101 | mov.l @r15+, r4 | ||
102 | mov.l @r15+, r5 | ||
103 | mov.l @r15+, r6 | ||
104 | mov.l @r15+, r7 | ||
105 | |||
106 | /* switch to bank1 and restore r0->r7 */ | ||
107 | mov.l 12f, r9 | ||
108 | stc sr, r8 | ||
109 | or r9, r8 | ||
110 | ldc r8, sr | ||
111 | mov.l @r15+, r0 | ||
112 | mov.l @r15+, r1 | ||
113 | mov.l @r15+, r2 | ||
114 | mov.l @r15+, r3 | ||
115 | mov.l @r15+, r4 | ||
116 | mov.l @r15+, r5 | ||
117 | mov.l @r15+, r6 | ||
118 | mov.l @r15+, r7 | ||
119 | |||
120 | /* switch back to bank0 */ | ||
121 | mov.l 12f, r9 | ||
122 | not r9, r9 | ||
123 | stc sr, r8 | ||
124 | and r9, r8 | ||
125 | ldc r8, sr | ||
126 | |||
127 | /* restore other random registers */ | ||
128 | ldc.l @r15+, spc | ||
129 | lds.l @r15+, pr | ||
130 | ldc.l @r15+, sr | ||
131 | ldc.l @r15+, ssr | ||
132 | ldc.l @r15+, gbr | ||
133 | lds.l @r15+, mach | ||
134 | lds.l @r15+, macl | ||
135 | |||
136 | /* restore r8->r15 */ | ||
137 | mov.l @r15+, r8 | ||
138 | mov.l @r15+, r9 | ||
139 | mov.l @r15+, r10 | ||
140 | mov.l @r15+, r11 | ||
141 | mov.l @r15+, r12 | ||
142 | mov.l @r15+, r13 | ||
143 | mov.l @r15+, r14 | ||
144 | mov.l @r15+, r15 | ||
145 | rts | ||
146 | nop | ||
147 | |||
148 | swap_pages: | ||
28 | bra 1f | 149 | bra 1f |
29 | mov r4,r0 /* cmd = indirection_page */ | 150 | mov r4,r0 /* cmd = indirection_page */ |
30 | 0: | 151 | 0: |
31 | mov.l @r4+,r0 /* cmd = *ind++ */ | 152 | mov.l @r4+,r0 /* cmd = *ind++ */ |
32 | 153 | ||
33 | 1: /* addr = (cmd | P2SEG) & 0xfffffff0 */ | 154 | 1: /* addr = cmd & 0xfffffff0 */ |
34 | mov r0,r2 | 155 | mov r0,r2 |
35 | or r9,r2 | ||
36 | mov #-16,r1 | 156 | mov #-16,r1 |
37 | and r1,r2 | 157 | and r1,r2 |
38 | 158 | ||
@@ -40,57 +160,70 @@ relocate_new_kernel: | |||
40 | tst #1,r0 | 160 | tst #1,r0 |
41 | bt 2f | 161 | bt 2f |
42 | bra 0b | 162 | bra 0b |
43 | mov r2,r5 | 163 | mov r2,r5 |
44 | 164 | ||
45 | 2: /* else if(cmd & IND_INDIRECTION) ind = addr */ | 165 | 2: /* else if(cmd & IND_INDIRECTION) ind = addr */ |
46 | tst #2,r0 | 166 | tst #2,r0 |
47 | bt 3f | 167 | bt 3f |
48 | bra 0b | 168 | bra 0b |
49 | mov r2,r4 | 169 | mov r2,r4 |
50 | 170 | ||
51 | 3: /* else if(cmd & IND_DONE) goto 6 */ | 171 | 3: /* else if(cmd & IND_DONE) return */ |
52 | tst #4,r0 | 172 | tst #4,r0 |
53 | bt 4f | 173 | bt 4f |
54 | bra 6f | 174 | rts |
55 | nop | 175 | nop |
56 | 176 | ||
57 | 4: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */ | 177 | 4: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */ |
58 | tst #8,r0 | 178 | tst #8,r0 |
59 | bt 0b | 179 | bt 0b |
60 | 180 | ||
61 | mov r8,r3 | 181 | mov.l 10f,r3 /* PAGE_SIZE */ |
62 | shlr2 r3 | 182 | shlr2 r3 |
63 | shlr2 r3 | 183 | shlr2 r3 |
64 | 5: | 184 | 5: |
65 | dt r3 | 185 | dt r3 |
66 | mov.l @r2+,r1 /* 16n+0 */ | 186 | |
67 | mov.l r1,@r5 | 187 | /* regular kexec just overwrites the destination page |
68 | add #4,r5 | 188 | * with the contents of the source page. |
69 | mov.l @r2+,r1 /* 16n+4 */ | 189 | * for the kexec jump case we need to swap the contents |
70 | mov.l r1,@r5 | 190 | * of the pages. |
71 | add #4,r5 | 191 | * to keep it simple swap the contents for both cases. |
72 | mov.l @r2+,r1 /* 16n+8 */ | 192 | */ |
73 | mov.l r1,@r5 | 193 | mov.l @(0, r2), r8 |
74 | add #4,r5 | 194 | mov.l @(0, r5), r1 |
75 | mov.l @r2+,r1 /* 16n+12 */ | 195 | mov.l r8, @(0, r5) |
76 | mov.l r1,@r5 | 196 | mov.l r1, @(0, r2) |
77 | add #4,r5 | 197 | |
198 | mov.l @(4, r2), r8 | ||
199 | mov.l @(4, r5), r1 | ||
200 | mov.l r8, @(4, r5) | ||
201 | mov.l r1, @(4, r2) | ||
202 | |||
203 | mov.l @(8, r2), r8 | ||
204 | mov.l @(8, r5), r1 | ||
205 | mov.l r8, @(8, r5) | ||
206 | mov.l r1, @(8, r2) | ||
207 | |||
208 | mov.l @(12, r2), r8 | ||
209 | mov.l @(12, r5), r1 | ||
210 | mov.l r8, @(12, r5) | ||
211 | mov.l r1, @(12, r2) | ||
212 | |||
213 | add #16,r5 | ||
214 | add #16,r2 | ||
78 | bf 5b | 215 | bf 5b |
79 | 216 | ||
80 | bra 0b | 217 | bra 0b |
81 | nop | 218 | nop |
82 | 6: | ||
83 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
84 | ldc r7, vbr | ||
85 | #endif | ||
86 | jmp @r6 | ||
87 | nop | ||
88 | 219 | ||
89 | .align 2 | 220 | .align 2 |
90 | 10: | 221 | 10: |
91 | .long PAGE_SIZE | 222 | .long PAGE_SIZE |
92 | 11: | 223 | 11: |
93 | .long P2SEG | 224 | .long 0 |
225 | 12: | ||
226 | .long 0x20000000 ! RB=1 | ||
94 | 227 | ||
95 | relocate_new_kernel_end: | 228 | relocate_new_kernel_end: |
96 | 229 | ||
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index 370d2cfa34eb..24c60251f680 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c | |||
@@ -432,6 +432,7 @@ static const char *cpu_name[] = { | |||
432 | [CPU_SH7763] = "SH7763", [CPU_SH7770] = "SH7770", | 432 | [CPU_SH7763] = "SH7763", [CPU_SH7770] = "SH7770", |
433 | [CPU_SH7780] = "SH7780", [CPU_SH7781] = "SH7781", | 433 | [CPU_SH7780] = "SH7780", [CPU_SH7781] = "SH7781", |
434 | [CPU_SH7343] = "SH7343", [CPU_SH7785] = "SH7785", | 434 | [CPU_SH7343] = "SH7343", [CPU_SH7785] = "SH7785", |
435 | [CPU_SH7786] = "SH7786", | ||
435 | [CPU_SH7722] = "SH7722", [CPU_SHX3] = "SH-X3", | 436 | [CPU_SH7722] = "SH7722", [CPU_SHX3] = "SH-X3", |
436 | [CPU_SH5_101] = "SH5-101", [CPU_SH5_103] = "SH5-103", | 437 | [CPU_SH5_101] = "SH5-101", [CPU_SH5_103] = "SH5-103", |
437 | [CPU_MXG] = "MX-G", [CPU_SH7723] = "SH7723", | 438 | [CPU_MXG] = "MX-G", [CPU_SH7723] = "SH7723", |
@@ -448,7 +449,7 @@ EXPORT_SYMBOL(get_cpu_subtype); | |||
448 | /* Symbolic CPU flags, keep in sync with asm/cpu-features.h */ | 449 | /* Symbolic CPU flags, keep in sync with asm/cpu-features.h */ |
449 | static const char *cpu_flags[] = { | 450 | static const char *cpu_flags[] = { |
450 | "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr", | 451 | "none", "fpu", "p2flush", "mmuassoc", "dsp", "perfctr", |
451 | "ptea", "llsc", "l2", "op32", NULL | 452 | "ptea", "llsc", "l2", "op32", "pteaex", NULL |
452 | }; | 453 | }; |
453 | 454 | ||
454 | static void show_cpuflags(struct seq_file *m, struct sh_cpuinfo *c) | 455 | static void show_cpuflags(struct seq_file *m, struct sh_cpuinfo *c) |
diff --git a/arch/sh/kernel/swsusp.c b/arch/sh/kernel/swsusp.c new file mode 100644 index 000000000000..12b64a0f2f01 --- /dev/null +++ b/arch/sh/kernel/swsusp.c | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * swsusp.c - SuperH hibernation support | ||
3 | * | ||
4 | * Copyright (C) 2009 Magnus Damm | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/mm.h> | ||
12 | #include <linux/sched.h> | ||
13 | #include <linux/suspend.h> | ||
14 | #include <asm/suspend.h> | ||
15 | #include <asm/sections.h> | ||
16 | #include <asm/tlbflush.h> | ||
17 | #include <asm/page.h> | ||
18 | #include <asm/fpu.h> | ||
19 | |||
20 | struct swsusp_arch_regs swsusp_arch_regs_cpu0; | ||
21 | |||
22 | int pfn_is_nosave(unsigned long pfn) | ||
23 | { | ||
24 | unsigned long begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT; | ||
25 | unsigned long end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT; | ||
26 | |||
27 | return (pfn >= begin_pfn) && (pfn < end_pfn); | ||
28 | } | ||
29 | |||
30 | void save_processor_state(void) | ||
31 | { | ||
32 | init_fpu(current); | ||
33 | } | ||
34 | |||
35 | void restore_processor_state(void) | ||
36 | { | ||
37 | local_flush_tlb_all(); | ||
38 | } | ||
diff --git a/arch/sh/kernel/time_32.c b/arch/sh/kernel/time_32.c index 8457f83242c5..c34e1e0f9b02 100644 --- a/arch/sh/kernel/time_32.c +++ b/arch/sh/kernel/time_32.c | |||
@@ -41,14 +41,6 @@ static int null_rtc_set_time(const time_t secs) | |||
41 | return 0; | 41 | return 0; |
42 | } | 42 | } |
43 | 43 | ||
44 | /* | ||
45 | * Null high precision timer functions for systems lacking one. | ||
46 | */ | ||
47 | static cycle_t null_hpt_read(void) | ||
48 | { | ||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time; | 44 | void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time; |
53 | int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time; | 45 | int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time; |
54 | 46 | ||
@@ -112,7 +104,6 @@ int do_settimeofday(struct timespec *tv) | |||
112 | EXPORT_SYMBOL(do_settimeofday); | 104 | EXPORT_SYMBOL(do_settimeofday); |
113 | #endif /* !CONFIG_GENERIC_TIME */ | 105 | #endif /* !CONFIG_GENERIC_TIME */ |
114 | 106 | ||
115 | #ifndef CONFIG_GENERIC_CLOCKEVENTS | ||
116 | /* last time the RTC clock got updated */ | 107 | /* last time the RTC clock got updated */ |
117 | static long last_rtc_update; | 108 | static long last_rtc_update; |
118 | 109 | ||
@@ -156,7 +147,6 @@ void handle_timer_tick(void) | |||
156 | update_process_times(user_mode(get_irq_regs())); | 147 | update_process_times(user_mode(get_irq_regs())); |
157 | #endif | 148 | #endif |
158 | } | 149 | } |
159 | #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ | ||
160 | 150 | ||
161 | #ifdef CONFIG_PM | 151 | #ifdef CONFIG_PM |
162 | int timer_suspend(struct sys_device *dev, pm_message_t state) | 152 | int timer_suspend(struct sys_device *dev, pm_message_t state) |
@@ -189,7 +179,12 @@ static struct sysdev_class timer_sysclass = { | |||
189 | 179 | ||
190 | static int __init timer_init_sysfs(void) | 180 | static int __init timer_init_sysfs(void) |
191 | { | 181 | { |
192 | int ret = sysdev_class_register(&timer_sysclass); | 182 | int ret; |
183 | |||
184 | if (!sys_timer) | ||
185 | return 0; | ||
186 | |||
187 | ret = sysdev_class_register(&timer_sysclass); | ||
193 | if (ret != 0) | 188 | if (ret != 0) |
194 | return ret; | 189 | return ret; |
195 | 190 | ||
@@ -200,42 +195,21 @@ device_initcall(timer_init_sysfs); | |||
200 | 195 | ||
201 | void (*board_time_init)(void); | 196 | void (*board_time_init)(void); |
202 | 197 | ||
203 | /* | 198 | struct clocksource clocksource_sh = { |
204 | * Shamelessly based on the MIPS and Sparc64 work. | ||
205 | */ | ||
206 | static unsigned long timer_ticks_per_nsec_quotient __read_mostly; | ||
207 | unsigned long sh_hpt_frequency = 0; | ||
208 | |||
209 | #define NSEC_PER_CYC_SHIFT 10 | ||
210 | |||
211 | static struct clocksource clocksource_sh = { | ||
212 | .name = "SuperH", | 199 | .name = "SuperH", |
213 | .rating = 200, | ||
214 | .mask = CLOCKSOURCE_MASK(32), | ||
215 | .read = null_hpt_read, | ||
216 | .shift = 16, | ||
217 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
218 | }; | 200 | }; |
219 | 201 | ||
220 | static void __init init_sh_clocksource(void) | ||
221 | { | ||
222 | if (!sh_hpt_frequency || clocksource_sh.read == null_hpt_read) | ||
223 | return; | ||
224 | |||
225 | clocksource_sh.mult = clocksource_hz2mult(sh_hpt_frequency, | ||
226 | clocksource_sh.shift); | ||
227 | |||
228 | timer_ticks_per_nsec_quotient = | ||
229 | clocksource_hz2mult(sh_hpt_frequency, NSEC_PER_CYC_SHIFT); | ||
230 | |||
231 | clocksource_register(&clocksource_sh); | ||
232 | } | ||
233 | |||
234 | #ifdef CONFIG_GENERIC_TIME | 202 | #ifdef CONFIG_GENERIC_TIME |
235 | unsigned long long sched_clock(void) | 203 | unsigned long long sched_clock(void) |
236 | { | 204 | { |
237 | unsigned long long ticks = clocksource_sh.read(); | 205 | unsigned long long cycles; |
238 | return (ticks * timer_ticks_per_nsec_quotient) >> NSEC_PER_CYC_SHIFT; | 206 | |
207 | /* jiffies based sched_clock if no clocksource is installed */ | ||
208 | if (!clocksource_sh.rating) | ||
209 | return (unsigned long long)jiffies * (NSEC_PER_SEC / HZ); | ||
210 | |||
211 | cycles = clocksource_sh.read(); | ||
212 | return cyc2ns(&clocksource_sh, cycles); | ||
239 | } | 213 | } |
240 | #endif | 214 | #endif |
241 | 215 | ||
@@ -259,17 +233,8 @@ void __init time_init(void) | |||
259 | * initialized for us. | 233 | * initialized for us. |
260 | */ | 234 | */ |
261 | sys_timer = get_sys_timer(); | 235 | sys_timer = get_sys_timer(); |
262 | printk(KERN_INFO "Using %s for system timer\n", sys_timer->name); | 236 | if (unlikely(!sys_timer)) |
263 | 237 | panic("System timer missing.\n"); | |
264 | |||
265 | if (sys_timer->ops->read) | ||
266 | clocksource_sh.read = sys_timer->ops->read; | ||
267 | |||
268 | init_sh_clocksource(); | ||
269 | |||
270 | if (sh_hpt_frequency) | ||
271 | printk("Using %lu.%03lu MHz high precision timer.\n", | ||
272 | ((sh_hpt_frequency + 500) / 1000) / 1000, | ||
273 | ((sh_hpt_frequency + 500) / 1000) % 1000); | ||
274 | 238 | ||
239 | printk(KERN_INFO "Using %s for system timer\n", sys_timer->name); | ||
275 | } | 240 | } |
diff --git a/arch/sh/kernel/timers/timer-mtu2.c b/arch/sh/kernel/timers/timer-mtu2.c index c3d237e1d566..9a77ae86b403 100644 --- a/arch/sh/kernel/timers/timer-mtu2.c +++ b/arch/sh/kernel/timers/timer-mtu2.c | |||
@@ -35,7 +35,8 @@ | |||
35 | #define MTU2_TSR_1 0xfffe4385 | 35 | #define MTU2_TSR_1 0xfffe4385 |
36 | #define MTU2_TCNT_1 0xfffe4386 /* 16-bit counter */ | 36 | #define MTU2_TCNT_1 0xfffe4386 /* 16-bit counter */ |
37 | 37 | ||
38 | #if defined(CONFIG_CPU_SUBTYPE_SH7201) | 38 | #if defined(CONFIG_CPU_SUBTYPE_SH7201) || \ |
39 | defined(CONFIG_CPU_SUBTYPE_SH7203) | ||
39 | #define MTU2_TGRA_1 0xfffe4388 | 40 | #define MTU2_TGRA_1 0xfffe4388 |
40 | #else | 41 | #else |
41 | #define MTU2_TGRA_1 0xfffe438a | 42 | #define MTU2_TGRA_1 0xfffe438a |
diff --git a/arch/sh/kernel/timers/timer-tmu.c b/arch/sh/kernel/timers/timer-tmu.c index 0db3f9510336..10b5a6f17cc0 100644 --- a/arch/sh/kernel/timers/timer-tmu.c +++ b/arch/sh/kernel/timers/timer-tmu.c | |||
@@ -146,7 +146,14 @@ static irqreturn_t tmu_timer_interrupt(int irq, void *dummy) | |||
146 | _tmu_clear_status(TMU0); | 146 | _tmu_clear_status(TMU0); |
147 | _tmu_set_irq(TMU0,tmu0_clockevent.mode != CLOCK_EVT_MODE_ONESHOT); | 147 | _tmu_set_irq(TMU0,tmu0_clockevent.mode != CLOCK_EVT_MODE_ONESHOT); |
148 | 148 | ||
149 | evt->event_handler(evt); | 149 | switch (tmu0_clockevent.mode) { |
150 | case CLOCK_EVT_MODE_ONESHOT: | ||
151 | case CLOCK_EVT_MODE_PERIODIC: | ||
152 | evt->event_handler(evt); | ||
153 | break; | ||
154 | default: | ||
155 | break; | ||
156 | } | ||
150 | 157 | ||
151 | return IRQ_HANDLED; | 158 | return IRQ_HANDLED; |
152 | } | 159 | } |
@@ -237,6 +244,7 @@ static int tmu_timer_init(void) | |||
237 | !defined(CONFIG_CPU_SUBTYPE_SH7721) && \ | 244 | !defined(CONFIG_CPU_SUBTYPE_SH7721) && \ |
238 | !defined(CONFIG_CPU_SUBTYPE_SH7760) && \ | 245 | !defined(CONFIG_CPU_SUBTYPE_SH7760) && \ |
239 | !defined(CONFIG_CPU_SUBTYPE_SH7785) && \ | 246 | !defined(CONFIG_CPU_SUBTYPE_SH7785) && \ |
247 | !defined(CONFIG_CPU_SUBTYPE_SH7786) && \ | ||
240 | !defined(CONFIG_CPU_SUBTYPE_SHX3) | 248 | !defined(CONFIG_CPU_SUBTYPE_SHX3) |
241 | ctrl_outb(TMU_TOCR_INIT, TMU_TOCR); | 249 | ctrl_outb(TMU_TOCR_INIT, TMU_TOCR); |
242 | #endif | 250 | #endif |
@@ -254,7 +262,14 @@ static int tmu_timer_init(void) | |||
254 | 262 | ||
255 | _tmu_start(TMU1); | 263 | _tmu_start(TMU1); |
256 | 264 | ||
257 | sh_hpt_frequency = clk_get_rate(&tmu1_clk); | 265 | clocksource_sh.rating = 200; |
266 | clocksource_sh.mask = CLOCKSOURCE_MASK(32); | ||
267 | clocksource_sh.read = tmu_timer_read; | ||
268 | clocksource_sh.shift = 10; | ||
269 | clocksource_sh.mult = clocksource_hz2mult(clk_get_rate(&tmu1_clk), | ||
270 | clocksource_sh.shift); | ||
271 | clocksource_sh.flags = CLOCK_SOURCE_IS_CONTINUOUS; | ||
272 | clocksource_register(&clocksource_sh); | ||
258 | 273 | ||
259 | tmu0_clockevent.mult = div_sc(frequency, NSEC_PER_SEC, | 274 | tmu0_clockevent.mult = div_sc(frequency, NSEC_PER_SEC, |
260 | tmu0_clockevent.shift); | 275 | tmu0_clockevent.shift); |
@@ -264,6 +279,7 @@ static int tmu_timer_init(void) | |||
264 | clockevent_delta2ns(1, &tmu0_clockevent); | 279 | clockevent_delta2ns(1, &tmu0_clockevent); |
265 | 280 | ||
266 | tmu0_clockevent.cpumask = cpumask_of(0); | 281 | tmu0_clockevent.cpumask = cpumask_of(0); |
282 | tmu0_clockevent.rating = 100; | ||
267 | 283 | ||
268 | clockevents_register_device(&tmu0_clockevent); | 284 | clockevents_register_device(&tmu0_clockevent); |
269 | 285 | ||
@@ -274,7 +290,6 @@ static struct sys_timer_ops tmu_timer_ops = { | |||
274 | .init = tmu_timer_init, | 290 | .init = tmu_timer_init, |
275 | .start = tmu_timer_start, | 291 | .start = tmu_timer_start, |
276 | .stop = tmu_timer_stop, | 292 | .stop = tmu_timer_stop, |
277 | .read = tmu_timer_read, | ||
278 | }; | 293 | }; |
279 | 294 | ||
280 | struct sys_timer tmu_timer = { | 295 | struct sys_timer tmu_timer = { |
diff --git a/arch/sh/kernel/vmlinux_32.lds.S b/arch/sh/kernel/vmlinux_32.lds.S index 7b4b82bd1156..d0b2a715cd14 100644 --- a/arch/sh/kernel/vmlinux_32.lds.S +++ b/arch/sh/kernel/vmlinux_32.lds.S | |||
@@ -15,7 +15,10 @@ OUTPUT_ARCH(sh) | |||
15 | ENTRY(_start) | 15 | ENTRY(_start) |
16 | SECTIONS | 16 | SECTIONS |
17 | { | 17 | { |
18 | #ifdef CONFIG_32BIT | 18 | #ifdef CONFIG_PMB_FIXED |
19 | . = CONFIG_PAGE_OFFSET + (CONFIG_MEMORY_START & 0x1fffffff) + | ||
20 | CONFIG_ZERO_PAGE_OFFSET; | ||
21 | #elif defined(CONFIG_32BIT) | ||
19 | . = CONFIG_PAGE_OFFSET + CONFIG_ZERO_PAGE_OFFSET; | 22 | . = CONFIG_PAGE_OFFSET + CONFIG_ZERO_PAGE_OFFSET; |
20 | #else | 23 | #else |
21 | . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET; | 24 | . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET; |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 555ec9714b9e..10c24356d2d5 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -57,7 +57,7 @@ config 32BIT | |||
57 | bool | 57 | bool |
58 | default y if CPU_SH5 | 58 | default y if CPU_SH5 |
59 | 59 | ||
60 | config PMB | 60 | config PMB_ENABLE |
61 | bool "Support 32-bit physical addressing through PMB" | 61 | bool "Support 32-bit physical addressing through PMB" |
62 | depends on MMU && EXPERIMENTAL && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785) | 62 | depends on MMU && EXPERIMENTAL && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785) |
63 | select 32BIT | 63 | select 32BIT |
@@ -67,6 +67,33 @@ config PMB | |||
67 | 32-bits through the SH-4A PMB. If this is not set, legacy | 67 | 32-bits through the SH-4A PMB. If this is not set, legacy |
68 | 29-bit physical addressing will be used. | 68 | 29-bit physical addressing will be used. |
69 | 69 | ||
70 | choice | ||
71 | prompt "PMB handling type" | ||
72 | depends on PMB_ENABLE | ||
73 | default PMB_FIXED | ||
74 | |||
75 | config PMB | ||
76 | bool "PMB" | ||
77 | depends on MMU && EXPERIMENTAL && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785) | ||
78 | select 32BIT | ||
79 | help | ||
80 | If you say Y here, physical addressing will be extended to | ||
81 | 32-bits through the SH-4A PMB. If this is not set, legacy | ||
82 | 29-bit physical addressing will be used. | ||
83 | |||
84 | config PMB_FIXED | ||
85 | bool "fixed PMB" | ||
86 | depends on MMU && EXPERIMENTAL && (CPU_SUBTYPE_SH7780 || \ | ||
87 | CPU_SUBTYPE_SH7785) | ||
88 | select 32BIT | ||
89 | help | ||
90 | If this option is enabled, fixed PMB mappings are inherited | ||
91 | from the boot loader, and the kernel does not attempt dynamic | ||
92 | management. This is the closest to legacy 29-bit physical mode, | ||
93 | and allows systems to support up to 512MiB of system memory. | ||
94 | |||
95 | endchoice | ||
96 | |||
70 | config X2TLB | 97 | config X2TLB |
71 | bool "Enable extended TLB mode" | 98 | bool "Enable extended TLB mode" |
72 | depends on (CPU_SHX2 || CPU_SHX3) && MMU && EXPERIMENTAL | 99 | depends on (CPU_SHX2 || CPU_SHX3) && MMU && EXPERIMENTAL |
diff --git a/arch/sh/mm/Makefile_32 b/arch/sh/mm/Makefile_32 index cb2f3f299591..986a1e055834 100644 --- a/arch/sh/mm/Makefile_32 +++ b/arch/sh/mm/Makefile_32 | |||
@@ -25,8 +25,10 @@ obj-$(CONFIG_CPU_SH4) += cache-debugfs.o | |||
25 | endif | 25 | endif |
26 | 26 | ||
27 | ifdef CONFIG_MMU | 27 | ifdef CONFIG_MMU |
28 | obj-$(CONFIG_CPU_SH3) += tlb-sh3.o | 28 | tlb-$(CONFIG_CPU_SH3) := tlb-sh3.o |
29 | obj-$(CONFIG_CPU_SH4) += tlb-sh4.o | 29 | tlb-$(CONFIG_CPU_SH4) := tlb-sh4.o |
30 | tlb-$(CONFIG_CPU_HAS_PTEAEX) := tlb-pteaex.o | ||
31 | obj-y += $(tlb-y) | ||
30 | ifndef CONFIG_CACHE_OFF | 32 | ifndef CONFIG_CACHE_OFF |
31 | obj-$(CONFIG_CPU_SH4) += pg-sh4.o | 33 | obj-$(CONFIG_CPU_SH4) += pg-sh4.o |
32 | obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o | 34 | obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o |
@@ -35,6 +37,7 @@ endif | |||
35 | 37 | ||
36 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 38 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
37 | obj-$(CONFIG_PMB) += pmb.o | 39 | obj-$(CONFIG_PMB) += pmb.o |
40 | obj-$(CONFIG_PMB_FIXED) += pmb-fixed.o | ||
38 | obj-$(CONFIG_NUMA) += numa.o | 41 | obj-$(CONFIG_NUMA) += numa.o |
39 | 42 | ||
40 | EXTRA_CFLAGS += -Werror | 43 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/sh/mm/asids-debugfs.c b/arch/sh/mm/asids-debugfs.c index 8e912a15e94f..cd8c3bf39b5a 100644 --- a/arch/sh/mm/asids-debugfs.c +++ b/arch/sh/mm/asids-debugfs.c | |||
@@ -37,10 +37,8 @@ static int asids_seq_show(struct seq_file *file, void *iter) | |||
37 | continue; | 37 | continue; |
38 | 38 | ||
39 | if (p->mm) | 39 | if (p->mm) |
40 | seq_printf(file, "%5d : %02lx\n", pid, | 40 | seq_printf(file, "%5d : %04lx\n", pid, |
41 | cpu_asid(smp_processor_id(), p->mm)); | 41 | cpu_asid(smp_processor_id(), p->mm)); |
42 | else | ||
43 | seq_printf(file, "%5d : (none)\n", pid); | ||
44 | } | 42 | } |
45 | 43 | ||
46 | read_unlock(&tasklist_lock); | 44 | read_unlock(&tasklist_lock); |
diff --git a/arch/sh/mm/ioremap_32.c b/arch/sh/mm/ioremap_32.c index 32946fba123e..60cc486d2c2c 100644 --- a/arch/sh/mm/ioremap_32.c +++ b/arch/sh/mm/ioremap_32.c | |||
@@ -59,11 +59,13 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
59 | if (is_pci_memaddr(phys_addr) && is_pci_memaddr(last_addr)) | 59 | if (is_pci_memaddr(phys_addr) && is_pci_memaddr(last_addr)) |
60 | return (void __iomem *)phys_addr; | 60 | return (void __iomem *)phys_addr; |
61 | 61 | ||
62 | #if !defined(CONFIG_PMB_FIXED) | ||
62 | /* | 63 | /* |
63 | * Don't allow anybody to remap normal RAM that we're using.. | 64 | * Don't allow anybody to remap normal RAM that we're using.. |
64 | */ | 65 | */ |
65 | if (phys_addr < virt_to_phys(high_memory)) | 66 | if (phys_addr < virt_to_phys(high_memory)) |
66 | return NULL; | 67 | return NULL; |
68 | #endif | ||
67 | 69 | ||
68 | /* | 70 | /* |
69 | * Mappings have to be page-aligned | 71 | * Mappings have to be page-aligned |
@@ -81,7 +83,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
81 | area->phys_addr = phys_addr; | 83 | area->phys_addr = phys_addr; |
82 | orig_addr = addr = (unsigned long)area->addr; | 84 | orig_addr = addr = (unsigned long)area->addr; |
83 | 85 | ||
84 | #ifdef CONFIG_32BIT | 86 | #ifdef CONFIG_PMB |
85 | /* | 87 | /* |
86 | * First try to remap through the PMB once a valid VMA has been | 88 | * First try to remap through the PMB once a valid VMA has been |
87 | * established. Smaller allocations (or the rest of the size | 89 | * established. Smaller allocations (or the rest of the size |
@@ -119,10 +121,10 @@ void __iounmap(void __iomem *addr) | |||
119 | unsigned long seg = PXSEG(vaddr); | 121 | unsigned long seg = PXSEG(vaddr); |
120 | struct vm_struct *p; | 122 | struct vm_struct *p; |
121 | 123 | ||
122 | if (seg < P3SEG || seg >= P3_ADDR_MAX || is_pci_memaddr(vaddr)) | 124 | if (seg < P3SEG || vaddr >= P3_ADDR_MAX || is_pci_memaddr(vaddr)) |
123 | return; | 125 | return; |
124 | 126 | ||
125 | #ifdef CONFIG_32BIT | 127 | #ifdef CONFIG_PMB |
126 | /* | 128 | /* |
127 | * Purge any PMB entries that may have been established for this | 129 | * Purge any PMB entries that may have been established for this |
128 | * mapping, then proceed with conventional VMA teardown. | 130 | * mapping, then proceed with conventional VMA teardown. |
diff --git a/arch/sh/mm/pmb-fixed.c b/arch/sh/mm/pmb-fixed.c new file mode 100644 index 000000000000..43c8eac4d8a1 --- /dev/null +++ b/arch/sh/mm/pmb-fixed.c | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/fixed_pmb.c | ||
3 | * | ||
4 | * Copyright (C) 2009 Renesas Solutions Corp. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/mm.h> | ||
12 | #include <linux/io.h> | ||
13 | #include <asm/mmu.h> | ||
14 | #include <asm/mmu_context.h> | ||
15 | |||
16 | static int __uses_jump_to_uncached fixed_pmb_init(void) | ||
17 | { | ||
18 | int i; | ||
19 | unsigned long addr, data; | ||
20 | |||
21 | jump_to_uncached(); | ||
22 | |||
23 | for (i = 0; i < PMB_ENTRY_MAX; i++) { | ||
24 | addr = PMB_DATA + (i << PMB_E_SHIFT); | ||
25 | data = ctrl_inl(addr); | ||
26 | if (!(data & PMB_V)) | ||
27 | continue; | ||
28 | |||
29 | if (data & PMB_C) { | ||
30 | #if defined(CONFIG_CACHE_WRITETHROUGH) | ||
31 | data |= PMB_WT; | ||
32 | #elif defined(CONFIG_CACHE_WRITEBACK) | ||
33 | data &= ~PMB_WT; | ||
34 | #else | ||
35 | data &= ~(PMB_C | PMB_WT); | ||
36 | #endif | ||
37 | } | ||
38 | ctrl_outl(data, addr); | ||
39 | } | ||
40 | |||
41 | back_to_cached(); | ||
42 | |||
43 | return 0; | ||
44 | } | ||
45 | arch_initcall(fixed_pmb_init); | ||
diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index 84241676265e..b1a714a92b14 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c | |||
@@ -15,6 +15,8 @@ | |||
15 | */ | 15 | */ |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/sysdev.h> | ||
19 | #include <linux/cpu.h> | ||
18 | #include <linux/module.h> | 20 | #include <linux/module.h> |
19 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
20 | #include <linux/bitops.h> | 22 | #include <linux/bitops.h> |
@@ -402,3 +404,39 @@ static int __init pmb_debugfs_init(void) | |||
402 | return 0; | 404 | return 0; |
403 | } | 405 | } |
404 | postcore_initcall(pmb_debugfs_init); | 406 | postcore_initcall(pmb_debugfs_init); |
407 | |||
408 | #ifdef CONFIG_PM | ||
409 | static int pmb_sysdev_suspend(struct sys_device *dev, pm_message_t state) | ||
410 | { | ||
411 | static pm_message_t prev_state; | ||
412 | |||
413 | /* Restore the PMB after a resume from hibernation */ | ||
414 | if (state.event == PM_EVENT_ON && | ||
415 | prev_state.event == PM_EVENT_FREEZE) { | ||
416 | struct pmb_entry *pmbe; | ||
417 | spin_lock_irq(&pmb_list_lock); | ||
418 | for (pmbe = pmb_list; pmbe; pmbe = pmbe->next) | ||
419 | set_pmb_entry(pmbe); | ||
420 | spin_unlock_irq(&pmb_list_lock); | ||
421 | } | ||
422 | prev_state = state; | ||
423 | return 0; | ||
424 | } | ||
425 | |||
426 | static int pmb_sysdev_resume(struct sys_device *dev) | ||
427 | { | ||
428 | return pmb_sysdev_suspend(dev, PMSG_ON); | ||
429 | } | ||
430 | |||
431 | static struct sysdev_driver pmb_sysdev_driver = { | ||
432 | .suspend = pmb_sysdev_suspend, | ||
433 | .resume = pmb_sysdev_resume, | ||
434 | }; | ||
435 | |||
436 | static int __init pmb_sysdev_init(void) | ||
437 | { | ||
438 | return sysdev_driver_register(&cpu_sysdev_class, &pmb_sysdev_driver); | ||
439 | } | ||
440 | |||
441 | subsys_initcall(pmb_sysdev_init); | ||
442 | #endif | ||
diff --git a/arch/sh/mm/tlb-pteaex.c b/arch/sh/mm/tlb-pteaex.c new file mode 100644 index 000000000000..2aab3ea934d7 --- /dev/null +++ b/arch/sh/mm/tlb-pteaex.c | |||
@@ -0,0 +1,96 @@ | |||
1 | /* | ||
2 | * arch/sh/mm/tlb-pteaex.c | ||
3 | * | ||
4 | * TLB operations for SH-X3 CPUs featuring PTE ASID Extensions. | ||
5 | * | ||
6 | * Copyright (C) 2009 Paul Mundt | ||
7 | * | ||
8 | * This file is subject to the terms and conditions of the GNU General Public | ||
9 | * License. See the file "COPYING" in the main directory of this archive | ||
10 | * for more details. | ||
11 | */ | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/mm.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <asm/system.h> | ||
16 | #include <asm/mmu_context.h> | ||
17 | #include <asm/cacheflush.h> | ||
18 | |||
19 | void update_mmu_cache(struct vm_area_struct * vma, | ||
20 | unsigned long address, pte_t pte) | ||
21 | { | ||
22 | unsigned long flags; | ||
23 | unsigned long pteval; | ||
24 | unsigned long vpn; | ||
25 | |||
26 | /* Ptrace may call this routine. */ | ||
27 | if (vma && current->active_mm != vma->vm_mm) | ||
28 | return; | ||
29 | |||
30 | #ifndef CONFIG_CACHE_OFF | ||
31 | { | ||
32 | unsigned long pfn = pte_pfn(pte); | ||
33 | |||
34 | if (pfn_valid(pfn)) { | ||
35 | struct page *page = pfn_to_page(pfn); | ||
36 | |||
37 | if (!test_bit(PG_mapped, &page->flags)) { | ||
38 | unsigned long phys = pte_val(pte) & PTE_PHYS_MASK; | ||
39 | __flush_wback_region((void *)P1SEGADDR(phys), | ||
40 | PAGE_SIZE); | ||
41 | __set_bit(PG_mapped, &page->flags); | ||
42 | } | ||
43 | } | ||
44 | } | ||
45 | #endif | ||
46 | |||
47 | local_irq_save(flags); | ||
48 | |||
49 | /* Set PTEH register */ | ||
50 | vpn = address & MMU_VPN_MASK; | ||
51 | __raw_writel(vpn, MMU_PTEH); | ||
52 | |||
53 | /* Set PTEAEX */ | ||
54 | __raw_writel(get_asid(), MMU_PTEAEX); | ||
55 | |||
56 | pteval = pte.pte_low; | ||
57 | |||
58 | /* Set PTEA register */ | ||
59 | #ifdef CONFIG_X2TLB | ||
60 | /* | ||
61 | * For the extended mode TLB this is trivial, only the ESZ and | ||
62 | * EPR bits need to be written out to PTEA, with the remainder of | ||
63 | * the protection bits (with the exception of the compat-mode SZ | ||
64 | * and PR bits, which are cleared) being written out in PTEL. | ||
65 | */ | ||
66 | __raw_writel(pte.pte_high, MMU_PTEA); | ||
67 | #endif | ||
68 | |||
69 | /* Set PTEL register */ | ||
70 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ | ||
71 | #ifdef CONFIG_CACHE_WRITETHROUGH | ||
72 | pteval |= _PAGE_WT; | ||
73 | #endif | ||
74 | /* conveniently, we want all the software flags to be 0 anyway */ | ||
75 | __raw_writel(pteval, MMU_PTEL); | ||
76 | |||
77 | /* Load the TLB */ | ||
78 | asm volatile("ldtlb": /* no output */ : /* no input */ : "memory"); | ||
79 | local_irq_restore(flags); | ||
80 | } | ||
81 | |||
82 | /* | ||
83 | * While SH-X2 extended TLB mode splits out the memory-mapped I/UTLB | ||
84 | * data arrays, SH-X3 cores with PTEAEX split out the memory-mapped | ||
85 | * address arrays. In compat mode the second array is inaccessible, while | ||
86 | * in extended mode, the legacy 8-bit ASID field in address array 1 has | ||
87 | * undefined behaviour. | ||
88 | */ | ||
89 | void __uses_jump_to_uncached local_flush_tlb_one(unsigned long asid, | ||
90 | unsigned long page) | ||
91 | { | ||
92 | jump_to_uncached(); | ||
93 | __raw_writel(page, MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT); | ||
94 | __raw_writel(asid, MMU_UTLB_ADDRESS_ARRAY2 | MMU_PAGE_ASSOC_BIT); | ||
95 | back_to_cached(); | ||
96 | } | ||
diff --git a/arch/sh/oprofile/common.c b/arch/sh/oprofile/common.c index 1d97d64cb95f..1b9d4304b3bf 100644 --- a/arch/sh/oprofile/common.c +++ b/arch/sh/oprofile/common.c | |||
@@ -107,6 +107,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
107 | case CPU_SH7780: | 107 | case CPU_SH7780: |
108 | case CPU_SH7781: | 108 | case CPU_SH7781: |
109 | case CPU_SH7785: | 109 | case CPU_SH7785: |
110 | case CPU_SH7786: | ||
110 | case CPU_SH7723: | 111 | case CPU_SH7723: |
111 | case CPU_SHX3: | 112 | case CPU_SHX3: |
112 | lmodel = &op_model_sh4a_ops; | 113 | lmodel = &op_model_sh4a_ops; |
diff --git a/arch/sh/tools/mach-types b/arch/sh/tools/mach-types index 284b7e867496..8477b5d884fd 100644 --- a/arch/sh/tools/mach-types +++ b/arch/sh/tools/mach-types | |||
@@ -52,3 +52,6 @@ RSK7203 SH_RSK7203 | |||
52 | AP325RXA SH_AP325RXA | 52 | AP325RXA SH_AP325RXA |
53 | SH7763RDP SH_SH7763RDP | 53 | SH7763RDP SH_SH7763RDP |
54 | SH7785LCR SH_SH7785LCR | 54 | SH7785LCR SH_SH7785LCR |
55 | URQUELL SH_URQUELL | ||
56 | ESPT SH_ESPT | ||
57 | POLARIS SH_POLARIS | ||
diff --git a/arch/sparc/include/asm/socket.h b/arch/sparc/include/asm/socket.h index bf50d0c2d583..982a12f959f4 100644 --- a/arch/sparc/include/asm/socket.h +++ b/arch/sparc/include/asm/socket.h | |||
@@ -50,6 +50,9 @@ | |||
50 | 50 | ||
51 | #define SO_MARK 0x0022 | 51 | #define SO_MARK 0x0022 |
52 | 52 | ||
53 | #define SO_TIMESTAMPING 0x0023 | ||
54 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
55 | |||
53 | /* Security levels - as per NRL IPv6 - don't actually do anything */ | 56 | /* Security levels - as per NRL IPv6 - don't actually do anything */ |
54 | #define SO_SECURITY_AUTHENTICATION 0x5001 | 57 | #define SO_SECURITY_AUTHENTICATION 0x5001 |
55 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 | 58 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 |
diff --git a/arch/sparc/include/asm/tlb_64.h b/arch/sparc/include/asm/tlb_64.h index ec81cdedef2c..ee38e731bfa6 100644 --- a/arch/sparc/include/asm/tlb_64.h +++ b/arch/sparc/include/asm/tlb_64.h | |||
@@ -57,6 +57,8 @@ static inline struct mmu_gather *tlb_gather_mmu(struct mm_struct *mm, unsigned i | |||
57 | 57 | ||
58 | static inline void tlb_flush_mmu(struct mmu_gather *mp) | 58 | static inline void tlb_flush_mmu(struct mmu_gather *mp) |
59 | { | 59 | { |
60 | if (!mp->fullmm) | ||
61 | flush_tlb_pending(); | ||
60 | if (mp->need_flush) { | 62 | if (mp->need_flush) { |
61 | free_pages_and_swap_cache(mp->pages, mp->pages_nr); | 63 | free_pages_and_swap_cache(mp->pages, mp->pages_nr); |
62 | mp->pages_nr = 0; | 64 | mp->pages_nr = 0; |
@@ -78,8 +80,6 @@ static inline void tlb_finish_mmu(struct mmu_gather *mp, unsigned long start, un | |||
78 | 80 | ||
79 | if (mp->fullmm) | 81 | if (mp->fullmm) |
80 | mp->fullmm = 0; | 82 | mp->fullmm = 0; |
81 | else | ||
82 | flush_tlb_pending(); | ||
83 | 83 | ||
84 | /* keep the page table cache within bounds */ | 84 | /* keep the page table cache within bounds */ |
85 | check_pgt_cache(); | 85 | check_pgt_cache(); |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 233bd87a9637..d0d6a515499a 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
@@ -185,7 +185,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
185 | seq_printf(p, "%10u ", kstat_irqs(i)); | 185 | seq_printf(p, "%10u ", kstat_irqs(i)); |
186 | #else | 186 | #else |
187 | for_each_online_cpu(j) | 187 | for_each_online_cpu(j) |
188 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 188 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
189 | #endif | 189 | #endif |
190 | seq_printf(p, " %9s", irq_desc[i].chip->typename); | 190 | seq_printf(p, " %9s", irq_desc[i].chip->typename); |
191 | seq_printf(p, " %s", action->name); | 191 | seq_printf(p, " %s", action->name); |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index 6cd1a5b65067..79457f682b5a 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
@@ -1031,7 +1031,7 @@ void smp_fetch_global_regs(void) | |||
1031 | * If the address space is non-shared (ie. mm->count == 1) we avoid | 1031 | * If the address space is non-shared (ie. mm->count == 1) we avoid |
1032 | * cross calls when we want to flush the currently running process's | 1032 | * cross calls when we want to flush the currently running process's |
1033 | * tlb state. This is done by clearing all cpu bits except the current | 1033 | * tlb state. This is done by clearing all cpu bits except the current |
1034 | * processor's in current->active_mm->cpu_vm_mask and performing the | 1034 | * processor's in current->mm->cpu_vm_mask and performing the |
1035 | * flush locally only. This will force any subsequent cpus which run | 1035 | * flush locally only. This will force any subsequent cpus which run |
1036 | * this task to flush the context from the local tlb if the process | 1036 | * this task to flush the context from the local tlb if the process |
1037 | * migrates to another cpu (again). | 1037 | * migrates to another cpu (again). |
@@ -1074,7 +1074,7 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long | |||
1074 | u32 ctx = CTX_HWBITS(mm->context); | 1074 | u32 ctx = CTX_HWBITS(mm->context); |
1075 | int cpu = get_cpu(); | 1075 | int cpu = get_cpu(); |
1076 | 1076 | ||
1077 | if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) | 1077 | if (mm == current->mm && atomic_read(&mm->mm_users) == 1) |
1078 | mm->cpu_vm_mask = cpumask_of_cpu(cpu); | 1078 | mm->cpu_vm_mask = cpumask_of_cpu(cpu); |
1079 | else | 1079 | else |
1080 | smp_cross_call_masked(&xcall_flush_tlb_pending, | 1080 | smp_cross_call_masked(&xcall_flush_tlb_pending, |
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index f93c42a2b522..a8000b1cda74 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -51,7 +51,7 @@ sys_call_table32: | |||
51 | /*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 | 51 | /*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 |
52 | .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount | 52 | .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount |
53 | /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys32_getdomainname, sys32_setdomainname, sys_nis_syscall | 53 | /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys32_getdomainname, sys32_setdomainname, sys_nis_syscall |
54 | .word sys_quotactl, sys_set_tid_address, compat_sys_mount, sys_ustat, sys32_setxattr | 54 | .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys32_setxattr |
55 | /*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents | 55 | /*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents |
56 | .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr | 56 | .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr |
57 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall | 57 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall |
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index fde510b664d3..434224e2229f 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c | |||
@@ -86,7 +86,7 @@ static int uml_net_rx(struct net_device *dev) | |||
86 | drop_skb->dev = dev; | 86 | drop_skb->dev = dev; |
87 | /* Read a packet into drop_skb and don't do anything with it. */ | 87 | /* Read a packet into drop_skb and don't do anything with it. */ |
88 | (*lp->read)(lp->fd, drop_skb, lp); | 88 | (*lp->read)(lp->fd, drop_skb, lp); |
89 | lp->stats.rx_dropped++; | 89 | dev->stats.rx_dropped++; |
90 | return 0; | 90 | return 0; |
91 | } | 91 | } |
92 | 92 | ||
@@ -99,8 +99,8 @@ static int uml_net_rx(struct net_device *dev) | |||
99 | skb_trim(skb, pkt_len); | 99 | skb_trim(skb, pkt_len); |
100 | skb->protocol = (*lp->protocol)(skb); | 100 | skb->protocol = (*lp->protocol)(skb); |
101 | 101 | ||
102 | lp->stats.rx_bytes += skb->len; | 102 | dev->stats.rx_bytes += skb->len; |
103 | lp->stats.rx_packets++; | 103 | dev->stats.rx_packets++; |
104 | netif_rx(skb); | 104 | netif_rx(skb); |
105 | return pkt_len; | 105 | return pkt_len; |
106 | } | 106 | } |
@@ -224,8 +224,8 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
224 | len = (*lp->write)(lp->fd, skb, lp); | 224 | len = (*lp->write)(lp->fd, skb, lp); |
225 | 225 | ||
226 | if (len == skb->len) { | 226 | if (len == skb->len) { |
227 | lp->stats.tx_packets++; | 227 | dev->stats.tx_packets++; |
228 | lp->stats.tx_bytes += skb->len; | 228 | dev->stats.tx_bytes += skb->len; |
229 | dev->trans_start = jiffies; | 229 | dev->trans_start = jiffies; |
230 | netif_start_queue(dev); | 230 | netif_start_queue(dev); |
231 | 231 | ||
@@ -234,7 +234,7 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
234 | } | 234 | } |
235 | else if (len == 0) { | 235 | else if (len == 0) { |
236 | netif_start_queue(dev); | 236 | netif_start_queue(dev); |
237 | lp->stats.tx_dropped++; | 237 | dev->stats.tx_dropped++; |
238 | } | 238 | } |
239 | else { | 239 | else { |
240 | netif_start_queue(dev); | 240 | netif_start_queue(dev); |
@@ -248,12 +248,6 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
248 | return 0; | 248 | return 0; |
249 | } | 249 | } |
250 | 250 | ||
251 | static struct net_device_stats *uml_net_get_stats(struct net_device *dev) | ||
252 | { | ||
253 | struct uml_net_private *lp = netdev_priv(dev); | ||
254 | return &lp->stats; | ||
255 | } | ||
256 | |||
257 | static void uml_net_set_multicast_list(struct net_device *dev) | 251 | static void uml_net_set_multicast_list(struct net_device *dev) |
258 | { | 252 | { |
259 | return; | 253 | return; |
@@ -377,6 +371,18 @@ static void net_device_release(struct device *dev) | |||
377 | free_netdev(netdev); | 371 | free_netdev(netdev); |
378 | } | 372 | } |
379 | 373 | ||
374 | static const struct net_device_ops uml_netdev_ops = { | ||
375 | .ndo_open = uml_net_open, | ||
376 | .ndo_stop = uml_net_close, | ||
377 | .ndo_start_xmit = uml_net_start_xmit, | ||
378 | .ndo_set_multicast_list = uml_net_set_multicast_list, | ||
379 | .ndo_tx_timeout = uml_net_tx_timeout, | ||
380 | .ndo_set_mac_address = uml_net_set_mac, | ||
381 | .ndo_change_mtu = uml_net_change_mtu, | ||
382 | .ndo_set_mac_address = eth_mac_addr, | ||
383 | .ndo_validate_addr = eth_validate_addr, | ||
384 | }; | ||
385 | |||
380 | /* | 386 | /* |
381 | * Ensures that platform_driver_register is called only once by | 387 | * Ensures that platform_driver_register is called only once by |
382 | * eth_configure. Will be set in an initcall. | 388 | * eth_configure. Will be set in an initcall. |
@@ -473,14 +479,7 @@ static void eth_configure(int n, void *init, char *mac, | |||
473 | 479 | ||
474 | set_ether_mac(dev, device->mac); | 480 | set_ether_mac(dev, device->mac); |
475 | dev->mtu = transport->user->mtu; | 481 | dev->mtu = transport->user->mtu; |
476 | dev->open = uml_net_open; | 482 | dev->netdev_ops = ¨_netdev_ops; |
477 | dev->hard_start_xmit = uml_net_start_xmit; | ||
478 | dev->stop = uml_net_close; | ||
479 | dev->get_stats = uml_net_get_stats; | ||
480 | dev->set_multicast_list = uml_net_set_multicast_list; | ||
481 | dev->tx_timeout = uml_net_tx_timeout; | ||
482 | dev->set_mac_address = uml_net_set_mac; | ||
483 | dev->change_mtu = uml_net_change_mtu; | ||
484 | dev->ethtool_ops = ¨_net_ethtool_ops; | 483 | dev->ethtool_ops = ¨_net_ethtool_ops; |
485 | dev->watchdog_timeo = (HZ >> 1); | 484 | dev->watchdog_timeo = (HZ >> 1); |
486 | dev->irq = UM_ETH_IRQ; | 485 | dev->irq = UM_ETH_IRQ; |
diff --git a/arch/um/include/shared/net_kern.h b/arch/um/include/shared/net_kern.h index d843c7924a7c..5c367f22595b 100644 --- a/arch/um/include/shared/net_kern.h +++ b/arch/um/include/shared/net_kern.h | |||
@@ -26,7 +26,7 @@ struct uml_net_private { | |||
26 | spinlock_t lock; | 26 | spinlock_t lock; |
27 | struct net_device *dev; | 27 | struct net_device *dev; |
28 | struct timer_list tl; | 28 | struct timer_list tl; |
29 | struct net_device_stats stats; | 29 | |
30 | struct work_struct work; | 30 | struct work_struct work; |
31 | int fd; | 31 | int fd; |
32 | unsigned char mac[ETH_ALEN]; | 32 | unsigned char mac[ETH_ALEN]; |
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 3d7aad09b171..336b61569072 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
@@ -42,7 +42,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
42 | seq_printf(p, "%10u ", kstat_irqs(i)); | 42 | seq_printf(p, "%10u ", kstat_irqs(i)); |
43 | #else | 43 | #else |
44 | for_each_online_cpu(j) | 44 | for_each_online_cpu(j) |
45 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 45 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
46 | #endif | 46 | #endif |
47 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 47 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
48 | seq_printf(p, " %s", action->name); | 48 | seq_printf(p, " %s", action->name); |
diff --git a/arch/x86/crypto/Makefile b/arch/x86/crypto/Makefile index 903de4aa5094..ebe7deedd5b4 100644 --- a/arch/x86/crypto/Makefile +++ b/arch/x86/crypto/Makefile | |||
@@ -9,6 +9,7 @@ obj-$(CONFIG_CRYPTO_SALSA20_586) += salsa20-i586.o | |||
9 | obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o | 9 | obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o |
10 | obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o | 10 | obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o |
11 | obj-$(CONFIG_CRYPTO_SALSA20_X86_64) += salsa20-x86_64.o | 11 | obj-$(CONFIG_CRYPTO_SALSA20_X86_64) += salsa20-x86_64.o |
12 | obj-$(CONFIG_CRYPTO_AES_NI_INTEL) += aesni-intel.o | ||
12 | 13 | ||
13 | obj-$(CONFIG_CRYPTO_CRC32C_INTEL) += crc32c-intel.o | 14 | obj-$(CONFIG_CRYPTO_CRC32C_INTEL) += crc32c-intel.o |
14 | 15 | ||
@@ -19,3 +20,5 @@ salsa20-i586-y := salsa20-i586-asm_32.o salsa20_glue.o | |||
19 | aes-x86_64-y := aes-x86_64-asm_64.o aes_glue.o | 20 | aes-x86_64-y := aes-x86_64-asm_64.o aes_glue.o |
20 | twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_glue.o | 21 | twofish-x86_64-y := twofish-x86_64-asm_64.o twofish_glue.o |
21 | salsa20-x86_64-y := salsa20-x86_64-asm_64.o salsa20_glue.o | 22 | salsa20-x86_64-y := salsa20-x86_64-asm_64.o salsa20_glue.o |
23 | |||
24 | aesni-intel-y := aesni-intel_asm.o aesni-intel_glue.o | ||
diff --git a/arch/x86/crypto/aes-i586-asm_32.S b/arch/x86/crypto/aes-i586-asm_32.S index e41b147f4509..b949ec2f9af4 100644 --- a/arch/x86/crypto/aes-i586-asm_32.S +++ b/arch/x86/crypto/aes-i586-asm_32.S | |||
@@ -41,14 +41,14 @@ | |||
41 | #define tlen 1024 // length of each of 4 'xor' arrays (256 32-bit words) | 41 | #define tlen 1024 // length of each of 4 'xor' arrays (256 32-bit words) |
42 | 42 | ||
43 | /* offsets to parameters with one register pushed onto stack */ | 43 | /* offsets to parameters with one register pushed onto stack */ |
44 | #define tfm 8 | 44 | #define ctx 8 |
45 | #define out_blk 12 | 45 | #define out_blk 12 |
46 | #define in_blk 16 | 46 | #define in_blk 16 |
47 | 47 | ||
48 | /* offsets in crypto_tfm structure */ | 48 | /* offsets in crypto_aes_ctx structure */ |
49 | #define klen (crypto_tfm_ctx_offset + 0) | 49 | #define klen (480) |
50 | #define ekey (crypto_tfm_ctx_offset + 4) | 50 | #define ekey (0) |
51 | #define dkey (crypto_tfm_ctx_offset + 244) | 51 | #define dkey (240) |
52 | 52 | ||
53 | // register mapping for encrypt and decrypt subroutines | 53 | // register mapping for encrypt and decrypt subroutines |
54 | 54 | ||
@@ -217,7 +217,7 @@ | |||
217 | do_col (table, r5,r0,r1,r4, r2,r3); /* idx=r5 */ | 217 | do_col (table, r5,r0,r1,r4, r2,r3); /* idx=r5 */ |
218 | 218 | ||
219 | // AES (Rijndael) Encryption Subroutine | 219 | // AES (Rijndael) Encryption Subroutine |
220 | /* void aes_enc_blk(struct crypto_tfm *tfm, u8 *out_blk, const u8 *in_blk) */ | 220 | /* void aes_enc_blk(struct crypto_aes_ctx *ctx, u8 *out_blk, const u8 *in_blk) */ |
221 | 221 | ||
222 | .global aes_enc_blk | 222 | .global aes_enc_blk |
223 | 223 | ||
@@ -228,7 +228,7 @@ | |||
228 | 228 | ||
229 | aes_enc_blk: | 229 | aes_enc_blk: |
230 | push %ebp | 230 | push %ebp |
231 | mov tfm(%esp),%ebp | 231 | mov ctx(%esp),%ebp |
232 | 232 | ||
233 | // CAUTION: the order and the values used in these assigns | 233 | // CAUTION: the order and the values used in these assigns |
234 | // rely on the register mappings | 234 | // rely on the register mappings |
@@ -292,7 +292,7 @@ aes_enc_blk: | |||
292 | ret | 292 | ret |
293 | 293 | ||
294 | // AES (Rijndael) Decryption Subroutine | 294 | // AES (Rijndael) Decryption Subroutine |
295 | /* void aes_dec_blk(struct crypto_tfm *tfm, u8 *out_blk, const u8 *in_blk) */ | 295 | /* void aes_dec_blk(struct crypto_aes_ctx *ctx, u8 *out_blk, const u8 *in_blk) */ |
296 | 296 | ||
297 | .global aes_dec_blk | 297 | .global aes_dec_blk |
298 | 298 | ||
@@ -303,7 +303,7 @@ aes_enc_blk: | |||
303 | 303 | ||
304 | aes_dec_blk: | 304 | aes_dec_blk: |
305 | push %ebp | 305 | push %ebp |
306 | mov tfm(%esp),%ebp | 306 | mov ctx(%esp),%ebp |
307 | 307 | ||
308 | // CAUTION: the order and the values used in these assigns | 308 | // CAUTION: the order and the values used in these assigns |
309 | // rely on the register mappings | 309 | // rely on the register mappings |
diff --git a/arch/x86/crypto/aes-x86_64-asm_64.S b/arch/x86/crypto/aes-x86_64-asm_64.S index a120f526c3df..5b577d5a059b 100644 --- a/arch/x86/crypto/aes-x86_64-asm_64.S +++ b/arch/x86/crypto/aes-x86_64-asm_64.S | |||
@@ -17,8 +17,6 @@ | |||
17 | 17 | ||
18 | #include <asm/asm-offsets.h> | 18 | #include <asm/asm-offsets.h> |
19 | 19 | ||
20 | #define BASE crypto_tfm_ctx_offset | ||
21 | |||
22 | #define R1 %rax | 20 | #define R1 %rax |
23 | #define R1E %eax | 21 | #define R1E %eax |
24 | #define R1X %ax | 22 | #define R1X %ax |
@@ -56,13 +54,13 @@ | |||
56 | .align 8; \ | 54 | .align 8; \ |
57 | FUNC: movq r1,r2; \ | 55 | FUNC: movq r1,r2; \ |
58 | movq r3,r4; \ | 56 | movq r3,r4; \ |
59 | leaq BASE+KEY+48+4(r8),r9; \ | 57 | leaq KEY+48(r8),r9; \ |
60 | movq r10,r11; \ | 58 | movq r10,r11; \ |
61 | movl (r7),r5 ## E; \ | 59 | movl (r7),r5 ## E; \ |
62 | movl 4(r7),r1 ## E; \ | 60 | movl 4(r7),r1 ## E; \ |
63 | movl 8(r7),r6 ## E; \ | 61 | movl 8(r7),r6 ## E; \ |
64 | movl 12(r7),r7 ## E; \ | 62 | movl 12(r7),r7 ## E; \ |
65 | movl BASE+0(r8),r10 ## E; \ | 63 | movl 480(r8),r10 ## E; \ |
66 | xorl -48(r9),r5 ## E; \ | 64 | xorl -48(r9),r5 ## E; \ |
67 | xorl -44(r9),r1 ## E; \ | 65 | xorl -44(r9),r1 ## E; \ |
68 | xorl -40(r9),r6 ## E; \ | 66 | xorl -40(r9),r6 ## E; \ |
diff --git a/arch/x86/crypto/aes_glue.c b/arch/x86/crypto/aes_glue.c index 71f457827116..49ae9fe32b22 100644 --- a/arch/x86/crypto/aes_glue.c +++ b/arch/x86/crypto/aes_glue.c | |||
@@ -5,17 +5,29 @@ | |||
5 | 5 | ||
6 | #include <crypto/aes.h> | 6 | #include <crypto/aes.h> |
7 | 7 | ||
8 | asmlinkage void aes_enc_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in); | 8 | asmlinkage void aes_enc_blk(struct crypto_aes_ctx *ctx, u8 *out, const u8 *in); |
9 | asmlinkage void aes_dec_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in); | 9 | asmlinkage void aes_dec_blk(struct crypto_aes_ctx *ctx, u8 *out, const u8 *in); |
10 | |||
11 | void crypto_aes_encrypt_x86(struct crypto_aes_ctx *ctx, u8 *dst, const u8 *src) | ||
12 | { | ||
13 | aes_enc_blk(ctx, dst, src); | ||
14 | } | ||
15 | EXPORT_SYMBOL_GPL(crypto_aes_encrypt_x86); | ||
16 | |||
17 | void crypto_aes_decrypt_x86(struct crypto_aes_ctx *ctx, u8 *dst, const u8 *src) | ||
18 | { | ||
19 | aes_dec_blk(ctx, dst, src); | ||
20 | } | ||
21 | EXPORT_SYMBOL_GPL(crypto_aes_decrypt_x86); | ||
10 | 22 | ||
11 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | 23 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) |
12 | { | 24 | { |
13 | aes_enc_blk(tfm, dst, src); | 25 | aes_enc_blk(crypto_tfm_ctx(tfm), dst, src); |
14 | } | 26 | } |
15 | 27 | ||
16 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | 28 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) |
17 | { | 29 | { |
18 | aes_dec_blk(tfm, dst, src); | 30 | aes_dec_blk(crypto_tfm_ctx(tfm), dst, src); |
19 | } | 31 | } |
20 | 32 | ||
21 | static struct crypto_alg aes_alg = { | 33 | static struct crypto_alg aes_alg = { |
diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S new file mode 100644 index 000000000000..caba99601703 --- /dev/null +++ b/arch/x86/crypto/aesni-intel_asm.S | |||
@@ -0,0 +1,896 @@ | |||
1 | /* | ||
2 | * Implement AES algorithm in Intel AES-NI instructions. | ||
3 | * | ||
4 | * The white paper of AES-NI instructions can be downloaded from: | ||
5 | * http://softwarecommunity.intel.com/isn/downloads/intelavx/AES-Instructions-Set_WP.pdf | ||
6 | * | ||
7 | * Copyright (C) 2008, Intel Corp. | ||
8 | * Author: Huang Ying <ying.huang@intel.com> | ||
9 | * Vinodh Gopal <vinodh.gopal@intel.com> | ||
10 | * Kahraman Akdemir | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License as published by | ||
14 | * the Free Software Foundation; either version 2 of the License, or | ||
15 | * (at your option) any later version. | ||
16 | */ | ||
17 | |||
18 | #include <linux/linkage.h> | ||
19 | |||
20 | .text | ||
21 | |||
22 | #define STATE1 %xmm0 | ||
23 | #define STATE2 %xmm4 | ||
24 | #define STATE3 %xmm5 | ||
25 | #define STATE4 %xmm6 | ||
26 | #define STATE STATE1 | ||
27 | #define IN1 %xmm1 | ||
28 | #define IN2 %xmm7 | ||
29 | #define IN3 %xmm8 | ||
30 | #define IN4 %xmm9 | ||
31 | #define IN IN1 | ||
32 | #define KEY %xmm2 | ||
33 | #define IV %xmm3 | ||
34 | |||
35 | #define KEYP %rdi | ||
36 | #define OUTP %rsi | ||
37 | #define INP %rdx | ||
38 | #define LEN %rcx | ||
39 | #define IVP %r8 | ||
40 | #define KLEN %r9d | ||
41 | #define T1 %r10 | ||
42 | #define TKEYP T1 | ||
43 | #define T2 %r11 | ||
44 | |||
45 | _key_expansion_128: | ||
46 | _key_expansion_256a: | ||
47 | pshufd $0b11111111, %xmm1, %xmm1 | ||
48 | shufps $0b00010000, %xmm0, %xmm4 | ||
49 | pxor %xmm4, %xmm0 | ||
50 | shufps $0b10001100, %xmm0, %xmm4 | ||
51 | pxor %xmm4, %xmm0 | ||
52 | pxor %xmm1, %xmm0 | ||
53 | movaps %xmm0, (%rcx) | ||
54 | add $0x10, %rcx | ||
55 | ret | ||
56 | |||
57 | _key_expansion_192a: | ||
58 | pshufd $0b01010101, %xmm1, %xmm1 | ||
59 | shufps $0b00010000, %xmm0, %xmm4 | ||
60 | pxor %xmm4, %xmm0 | ||
61 | shufps $0b10001100, %xmm0, %xmm4 | ||
62 | pxor %xmm4, %xmm0 | ||
63 | pxor %xmm1, %xmm0 | ||
64 | |||
65 | movaps %xmm2, %xmm5 | ||
66 | movaps %xmm2, %xmm6 | ||
67 | pslldq $4, %xmm5 | ||
68 | pshufd $0b11111111, %xmm0, %xmm3 | ||
69 | pxor %xmm3, %xmm2 | ||
70 | pxor %xmm5, %xmm2 | ||
71 | |||
72 | movaps %xmm0, %xmm1 | ||
73 | shufps $0b01000100, %xmm0, %xmm6 | ||
74 | movaps %xmm6, (%rcx) | ||
75 | shufps $0b01001110, %xmm2, %xmm1 | ||
76 | movaps %xmm1, 16(%rcx) | ||
77 | add $0x20, %rcx | ||
78 | ret | ||
79 | |||
80 | _key_expansion_192b: | ||
81 | pshufd $0b01010101, %xmm1, %xmm1 | ||
82 | shufps $0b00010000, %xmm0, %xmm4 | ||
83 | pxor %xmm4, %xmm0 | ||
84 | shufps $0b10001100, %xmm0, %xmm4 | ||
85 | pxor %xmm4, %xmm0 | ||
86 | pxor %xmm1, %xmm0 | ||
87 | |||
88 | movaps %xmm2, %xmm5 | ||
89 | pslldq $4, %xmm5 | ||
90 | pshufd $0b11111111, %xmm0, %xmm3 | ||
91 | pxor %xmm3, %xmm2 | ||
92 | pxor %xmm5, %xmm2 | ||
93 | |||
94 | movaps %xmm0, (%rcx) | ||
95 | add $0x10, %rcx | ||
96 | ret | ||
97 | |||
98 | _key_expansion_256b: | ||
99 | pshufd $0b10101010, %xmm1, %xmm1 | ||
100 | shufps $0b00010000, %xmm2, %xmm4 | ||
101 | pxor %xmm4, %xmm2 | ||
102 | shufps $0b10001100, %xmm2, %xmm4 | ||
103 | pxor %xmm4, %xmm2 | ||
104 | pxor %xmm1, %xmm2 | ||
105 | movaps %xmm2, (%rcx) | ||
106 | add $0x10, %rcx | ||
107 | ret | ||
108 | |||
109 | /* | ||
110 | * int aesni_set_key(struct crypto_aes_ctx *ctx, const u8 *in_key, | ||
111 | * unsigned int key_len) | ||
112 | */ | ||
113 | ENTRY(aesni_set_key) | ||
114 | movups (%rsi), %xmm0 # user key (first 16 bytes) | ||
115 | movaps %xmm0, (%rdi) | ||
116 | lea 0x10(%rdi), %rcx # key addr | ||
117 | movl %edx, 480(%rdi) | ||
118 | pxor %xmm4, %xmm4 # xmm4 is assumed 0 in _key_expansion_x | ||
119 | cmp $24, %dl | ||
120 | jb .Lenc_key128 | ||
121 | je .Lenc_key192 | ||
122 | movups 0x10(%rsi), %xmm2 # other user key | ||
123 | movaps %xmm2, (%rcx) | ||
124 | add $0x10, %rcx | ||
125 | # aeskeygenassist $0x1, %xmm2, %xmm1 # round 1 | ||
126 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x01 | ||
127 | call _key_expansion_256a | ||
128 | # aeskeygenassist $0x1, %xmm0, %xmm1 | ||
129 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x01 | ||
130 | call _key_expansion_256b | ||
131 | # aeskeygenassist $0x2, %xmm2, %xmm1 # round 2 | ||
132 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x02 | ||
133 | call _key_expansion_256a | ||
134 | # aeskeygenassist $0x2, %xmm0, %xmm1 | ||
135 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x02 | ||
136 | call _key_expansion_256b | ||
137 | # aeskeygenassist $0x4, %xmm2, %xmm1 # round 3 | ||
138 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x04 | ||
139 | call _key_expansion_256a | ||
140 | # aeskeygenassist $0x4, %xmm0, %xmm1 | ||
141 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x04 | ||
142 | call _key_expansion_256b | ||
143 | # aeskeygenassist $0x8, %xmm2, %xmm1 # round 4 | ||
144 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x08 | ||
145 | call _key_expansion_256a | ||
146 | # aeskeygenassist $0x8, %xmm0, %xmm1 | ||
147 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x08 | ||
148 | call _key_expansion_256b | ||
149 | # aeskeygenassist $0x10, %xmm2, %xmm1 # round 5 | ||
150 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x10 | ||
151 | call _key_expansion_256a | ||
152 | # aeskeygenassist $0x10, %xmm0, %xmm1 | ||
153 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x10 | ||
154 | call _key_expansion_256b | ||
155 | # aeskeygenassist $0x20, %xmm2, %xmm1 # round 6 | ||
156 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x20 | ||
157 | call _key_expansion_256a | ||
158 | # aeskeygenassist $0x20, %xmm0, %xmm1 | ||
159 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x20 | ||
160 | call _key_expansion_256b | ||
161 | # aeskeygenassist $0x40, %xmm2, %xmm1 # round 7 | ||
162 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x40 | ||
163 | call _key_expansion_256a | ||
164 | jmp .Ldec_key | ||
165 | .Lenc_key192: | ||
166 | movq 0x10(%rsi), %xmm2 # other user key | ||
167 | # aeskeygenassist $0x1, %xmm2, %xmm1 # round 1 | ||
168 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x01 | ||
169 | call _key_expansion_192a | ||
170 | # aeskeygenassist $0x2, %xmm2, %xmm1 # round 2 | ||
171 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x02 | ||
172 | call _key_expansion_192b | ||
173 | # aeskeygenassist $0x4, %xmm2, %xmm1 # round 3 | ||
174 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x04 | ||
175 | call _key_expansion_192a | ||
176 | # aeskeygenassist $0x8, %xmm2, %xmm1 # round 4 | ||
177 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x08 | ||
178 | call _key_expansion_192b | ||
179 | # aeskeygenassist $0x10, %xmm2, %xmm1 # round 5 | ||
180 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x10 | ||
181 | call _key_expansion_192a | ||
182 | # aeskeygenassist $0x20, %xmm2, %xmm1 # round 6 | ||
183 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x20 | ||
184 | call _key_expansion_192b | ||
185 | # aeskeygenassist $0x40, %xmm2, %xmm1 # round 7 | ||
186 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x40 | ||
187 | call _key_expansion_192a | ||
188 | # aeskeygenassist $0x80, %xmm2, %xmm1 # round 8 | ||
189 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xca, 0x80 | ||
190 | call _key_expansion_192b | ||
191 | jmp .Ldec_key | ||
192 | .Lenc_key128: | ||
193 | # aeskeygenassist $0x1, %xmm0, %xmm1 # round 1 | ||
194 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x01 | ||
195 | call _key_expansion_128 | ||
196 | # aeskeygenassist $0x2, %xmm0, %xmm1 # round 2 | ||
197 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x02 | ||
198 | call _key_expansion_128 | ||
199 | # aeskeygenassist $0x4, %xmm0, %xmm1 # round 3 | ||
200 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x04 | ||
201 | call _key_expansion_128 | ||
202 | # aeskeygenassist $0x8, %xmm0, %xmm1 # round 4 | ||
203 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x08 | ||
204 | call _key_expansion_128 | ||
205 | # aeskeygenassist $0x10, %xmm0, %xmm1 # round 5 | ||
206 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x10 | ||
207 | call _key_expansion_128 | ||
208 | # aeskeygenassist $0x20, %xmm0, %xmm1 # round 6 | ||
209 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x20 | ||
210 | call _key_expansion_128 | ||
211 | # aeskeygenassist $0x40, %xmm0, %xmm1 # round 7 | ||
212 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x40 | ||
213 | call _key_expansion_128 | ||
214 | # aeskeygenassist $0x80, %xmm0, %xmm1 # round 8 | ||
215 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x80 | ||
216 | call _key_expansion_128 | ||
217 | # aeskeygenassist $0x1b, %xmm0, %xmm1 # round 9 | ||
218 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x1b | ||
219 | call _key_expansion_128 | ||
220 | # aeskeygenassist $0x36, %xmm0, %xmm1 # round 10 | ||
221 | .byte 0x66, 0x0f, 0x3a, 0xdf, 0xc8, 0x36 | ||
222 | call _key_expansion_128 | ||
223 | .Ldec_key: | ||
224 | sub $0x10, %rcx | ||
225 | movaps (%rdi), %xmm0 | ||
226 | movaps (%rcx), %xmm1 | ||
227 | movaps %xmm0, 240(%rcx) | ||
228 | movaps %xmm1, 240(%rdi) | ||
229 | add $0x10, %rdi | ||
230 | lea 240-16(%rcx), %rsi | ||
231 | .align 4 | ||
232 | .Ldec_key_loop: | ||
233 | movaps (%rdi), %xmm0 | ||
234 | # aesimc %xmm0, %xmm1 | ||
235 | .byte 0x66, 0x0f, 0x38, 0xdb, 0xc8 | ||
236 | movaps %xmm1, (%rsi) | ||
237 | add $0x10, %rdi | ||
238 | sub $0x10, %rsi | ||
239 | cmp %rcx, %rdi | ||
240 | jb .Ldec_key_loop | ||
241 | xor %rax, %rax | ||
242 | ret | ||
243 | |||
244 | /* | ||
245 | * void aesni_enc(struct crypto_aes_ctx *ctx, u8 *dst, const u8 *src) | ||
246 | */ | ||
247 | ENTRY(aesni_enc) | ||
248 | movl 480(KEYP), KLEN # key length | ||
249 | movups (INP), STATE # input | ||
250 | call _aesni_enc1 | ||
251 | movups STATE, (OUTP) # output | ||
252 | ret | ||
253 | |||
254 | /* | ||
255 | * _aesni_enc1: internal ABI | ||
256 | * input: | ||
257 | * KEYP: key struct pointer | ||
258 | * KLEN: round count | ||
259 | * STATE: initial state (input) | ||
260 | * output: | ||
261 | * STATE: finial state (output) | ||
262 | * changed: | ||
263 | * KEY | ||
264 | * TKEYP (T1) | ||
265 | */ | ||
266 | _aesni_enc1: | ||
267 | movaps (KEYP), KEY # key | ||
268 | mov KEYP, TKEYP | ||
269 | pxor KEY, STATE # round 0 | ||
270 | add $0x30, TKEYP | ||
271 | cmp $24, KLEN | ||
272 | jb .Lenc128 | ||
273 | lea 0x20(TKEYP), TKEYP | ||
274 | je .Lenc192 | ||
275 | add $0x20, TKEYP | ||
276 | movaps -0x60(TKEYP), KEY | ||
277 | # aesenc KEY, STATE | ||
278 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
279 | movaps -0x50(TKEYP), KEY | ||
280 | # aesenc KEY, STATE | ||
281 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
282 | .align 4 | ||
283 | .Lenc192: | ||
284 | movaps -0x40(TKEYP), KEY | ||
285 | # aesenc KEY, STATE | ||
286 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
287 | movaps -0x30(TKEYP), KEY | ||
288 | # aesenc KEY, STATE | ||
289 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
290 | .align 4 | ||
291 | .Lenc128: | ||
292 | movaps -0x20(TKEYP), KEY | ||
293 | # aesenc KEY, STATE | ||
294 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
295 | movaps -0x10(TKEYP), KEY | ||
296 | # aesenc KEY, STATE | ||
297 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
298 | movaps (TKEYP), KEY | ||
299 | # aesenc KEY, STATE | ||
300 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
301 | movaps 0x10(TKEYP), KEY | ||
302 | # aesenc KEY, STATE | ||
303 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
304 | movaps 0x20(TKEYP), KEY | ||
305 | # aesenc KEY, STATE | ||
306 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
307 | movaps 0x30(TKEYP), KEY | ||
308 | # aesenc KEY, STATE | ||
309 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
310 | movaps 0x40(TKEYP), KEY | ||
311 | # aesenc KEY, STATE | ||
312 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
313 | movaps 0x50(TKEYP), KEY | ||
314 | # aesenc KEY, STATE | ||
315 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
316 | movaps 0x60(TKEYP), KEY | ||
317 | # aesenc KEY, STATE | ||
318 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
319 | movaps 0x70(TKEYP), KEY | ||
320 | # aesenclast KEY, STATE # last round | ||
321 | .byte 0x66, 0x0f, 0x38, 0xdd, 0xc2 | ||
322 | ret | ||
323 | |||
324 | /* | ||
325 | * _aesni_enc4: internal ABI | ||
326 | * input: | ||
327 | * KEYP: key struct pointer | ||
328 | * KLEN: round count | ||
329 | * STATE1: initial state (input) | ||
330 | * STATE2 | ||
331 | * STATE3 | ||
332 | * STATE4 | ||
333 | * output: | ||
334 | * STATE1: finial state (output) | ||
335 | * STATE2 | ||
336 | * STATE3 | ||
337 | * STATE4 | ||
338 | * changed: | ||
339 | * KEY | ||
340 | * TKEYP (T1) | ||
341 | */ | ||
342 | _aesni_enc4: | ||
343 | movaps (KEYP), KEY # key | ||
344 | mov KEYP, TKEYP | ||
345 | pxor KEY, STATE1 # round 0 | ||
346 | pxor KEY, STATE2 | ||
347 | pxor KEY, STATE3 | ||
348 | pxor KEY, STATE4 | ||
349 | add $0x30, TKEYP | ||
350 | cmp $24, KLEN | ||
351 | jb .L4enc128 | ||
352 | lea 0x20(TKEYP), TKEYP | ||
353 | je .L4enc192 | ||
354 | add $0x20, TKEYP | ||
355 | movaps -0x60(TKEYP), KEY | ||
356 | # aesenc KEY, STATE1 | ||
357 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
358 | # aesenc KEY, STATE2 | ||
359 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
360 | # aesenc KEY, STATE3 | ||
361 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
362 | # aesenc KEY, STATE4 | ||
363 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
364 | movaps -0x50(TKEYP), KEY | ||
365 | # aesenc KEY, STATE1 | ||
366 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
367 | # aesenc KEY, STATE2 | ||
368 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
369 | # aesenc KEY, STATE3 | ||
370 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
371 | # aesenc KEY, STATE4 | ||
372 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
373 | #.align 4 | ||
374 | .L4enc192: | ||
375 | movaps -0x40(TKEYP), KEY | ||
376 | # aesenc KEY, STATE1 | ||
377 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
378 | # aesenc KEY, STATE2 | ||
379 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
380 | # aesenc KEY, STATE3 | ||
381 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
382 | # aesenc KEY, STATE4 | ||
383 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
384 | movaps -0x30(TKEYP), KEY | ||
385 | # aesenc KEY, STATE1 | ||
386 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
387 | # aesenc KEY, STATE2 | ||
388 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
389 | # aesenc KEY, STATE3 | ||
390 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
391 | # aesenc KEY, STATE4 | ||
392 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
393 | #.align 4 | ||
394 | .L4enc128: | ||
395 | movaps -0x20(TKEYP), KEY | ||
396 | # aesenc KEY, STATE1 | ||
397 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
398 | # aesenc KEY, STATE2 | ||
399 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
400 | # aesenc KEY, STATE3 | ||
401 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
402 | # aesenc KEY, STATE4 | ||
403 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
404 | movaps -0x10(TKEYP), KEY | ||
405 | # aesenc KEY, STATE1 | ||
406 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
407 | # aesenc KEY, STATE2 | ||
408 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
409 | # aesenc KEY, STATE3 | ||
410 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
411 | # aesenc KEY, STATE4 | ||
412 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
413 | movaps (TKEYP), KEY | ||
414 | # aesenc KEY, STATE1 | ||
415 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
416 | # aesenc KEY, STATE2 | ||
417 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
418 | # aesenc KEY, STATE3 | ||
419 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
420 | # aesenc KEY, STATE4 | ||
421 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
422 | movaps 0x10(TKEYP), KEY | ||
423 | # aesenc KEY, STATE1 | ||
424 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
425 | # aesenc KEY, STATE2 | ||
426 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
427 | # aesenc KEY, STATE3 | ||
428 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
429 | # aesenc KEY, STATE4 | ||
430 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
431 | movaps 0x20(TKEYP), KEY | ||
432 | # aesenc KEY, STATE1 | ||
433 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
434 | # aesenc KEY, STATE2 | ||
435 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
436 | # aesenc KEY, STATE3 | ||
437 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
438 | # aesenc KEY, STATE4 | ||
439 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
440 | movaps 0x30(TKEYP), KEY | ||
441 | # aesenc KEY, STATE1 | ||
442 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
443 | # aesenc KEY, STATE2 | ||
444 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
445 | # aesenc KEY, STATE3 | ||
446 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
447 | # aesenc KEY, STATE4 | ||
448 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
449 | movaps 0x40(TKEYP), KEY | ||
450 | # aesenc KEY, STATE1 | ||
451 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
452 | # aesenc KEY, STATE2 | ||
453 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
454 | # aesenc KEY, STATE3 | ||
455 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
456 | # aesenc KEY, STATE4 | ||
457 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
458 | movaps 0x50(TKEYP), KEY | ||
459 | # aesenc KEY, STATE1 | ||
460 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
461 | # aesenc KEY, STATE2 | ||
462 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
463 | # aesenc KEY, STATE3 | ||
464 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
465 | # aesenc KEY, STATE4 | ||
466 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
467 | movaps 0x60(TKEYP), KEY | ||
468 | # aesenc KEY, STATE1 | ||
469 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xc2 | ||
470 | # aesenc KEY, STATE2 | ||
471 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xe2 | ||
472 | # aesenc KEY, STATE3 | ||
473 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xea | ||
474 | # aesenc KEY, STATE4 | ||
475 | .byte 0x66, 0x0f, 0x38, 0xdc, 0xf2 | ||
476 | movaps 0x70(TKEYP), KEY | ||
477 | # aesenclast KEY, STATE1 # last round | ||
478 | .byte 0x66, 0x0f, 0x38, 0xdd, 0xc2 | ||
479 | # aesenclast KEY, STATE2 | ||
480 | .byte 0x66, 0x0f, 0x38, 0xdd, 0xe2 | ||
481 | # aesenclast KEY, STATE3 | ||
482 | .byte 0x66, 0x0f, 0x38, 0xdd, 0xea | ||
483 | # aesenclast KEY, STATE4 | ||
484 | .byte 0x66, 0x0f, 0x38, 0xdd, 0xf2 | ||
485 | ret | ||
486 | |||
487 | /* | ||
488 | * void aesni_dec (struct crypto_aes_ctx *ctx, u8 *dst, const u8 *src) | ||
489 | */ | ||
490 | ENTRY(aesni_dec) | ||
491 | mov 480(KEYP), KLEN # key length | ||
492 | add $240, KEYP | ||
493 | movups (INP), STATE # input | ||
494 | call _aesni_dec1 | ||
495 | movups STATE, (OUTP) #output | ||
496 | ret | ||
497 | |||
498 | /* | ||
499 | * _aesni_dec1: internal ABI | ||
500 | * input: | ||
501 | * KEYP: key struct pointer | ||
502 | * KLEN: key length | ||
503 | * STATE: initial state (input) | ||
504 | * output: | ||
505 | * STATE: finial state (output) | ||
506 | * changed: | ||
507 | * KEY | ||
508 | * TKEYP (T1) | ||
509 | */ | ||
510 | _aesni_dec1: | ||
511 | movaps (KEYP), KEY # key | ||
512 | mov KEYP, TKEYP | ||
513 | pxor KEY, STATE # round 0 | ||
514 | add $0x30, TKEYP | ||
515 | cmp $24, KLEN | ||
516 | jb .Ldec128 | ||
517 | lea 0x20(TKEYP), TKEYP | ||
518 | je .Ldec192 | ||
519 | add $0x20, TKEYP | ||
520 | movaps -0x60(TKEYP), KEY | ||
521 | # aesdec KEY, STATE | ||
522 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
523 | movaps -0x50(TKEYP), KEY | ||
524 | # aesdec KEY, STATE | ||
525 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
526 | .align 4 | ||
527 | .Ldec192: | ||
528 | movaps -0x40(TKEYP), KEY | ||
529 | # aesdec KEY, STATE | ||
530 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
531 | movaps -0x30(TKEYP), KEY | ||
532 | # aesdec KEY, STATE | ||
533 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
534 | .align 4 | ||
535 | .Ldec128: | ||
536 | movaps -0x20(TKEYP), KEY | ||
537 | # aesdec KEY, STATE | ||
538 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
539 | movaps -0x10(TKEYP), KEY | ||
540 | # aesdec KEY, STATE | ||
541 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
542 | movaps (TKEYP), KEY | ||
543 | # aesdec KEY, STATE | ||
544 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
545 | movaps 0x10(TKEYP), KEY | ||
546 | # aesdec KEY, STATE | ||
547 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
548 | movaps 0x20(TKEYP), KEY | ||
549 | # aesdec KEY, STATE | ||
550 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
551 | movaps 0x30(TKEYP), KEY | ||
552 | # aesdec KEY, STATE | ||
553 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
554 | movaps 0x40(TKEYP), KEY | ||
555 | # aesdec KEY, STATE | ||
556 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
557 | movaps 0x50(TKEYP), KEY | ||
558 | # aesdec KEY, STATE | ||
559 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
560 | movaps 0x60(TKEYP), KEY | ||
561 | # aesdec KEY, STATE | ||
562 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
563 | movaps 0x70(TKEYP), KEY | ||
564 | # aesdeclast KEY, STATE # last round | ||
565 | .byte 0x66, 0x0f, 0x38, 0xdf, 0xc2 | ||
566 | ret | ||
567 | |||
568 | /* | ||
569 | * _aesni_dec4: internal ABI | ||
570 | * input: | ||
571 | * KEYP: key struct pointer | ||
572 | * KLEN: key length | ||
573 | * STATE1: initial state (input) | ||
574 | * STATE2 | ||
575 | * STATE3 | ||
576 | * STATE4 | ||
577 | * output: | ||
578 | * STATE1: finial state (output) | ||
579 | * STATE2 | ||
580 | * STATE3 | ||
581 | * STATE4 | ||
582 | * changed: | ||
583 | * KEY | ||
584 | * TKEYP (T1) | ||
585 | */ | ||
586 | _aesni_dec4: | ||
587 | movaps (KEYP), KEY # key | ||
588 | mov KEYP, TKEYP | ||
589 | pxor KEY, STATE1 # round 0 | ||
590 | pxor KEY, STATE2 | ||
591 | pxor KEY, STATE3 | ||
592 | pxor KEY, STATE4 | ||
593 | add $0x30, TKEYP | ||
594 | cmp $24, KLEN | ||
595 | jb .L4dec128 | ||
596 | lea 0x20(TKEYP), TKEYP | ||
597 | je .L4dec192 | ||
598 | add $0x20, TKEYP | ||
599 | movaps -0x60(TKEYP), KEY | ||
600 | # aesdec KEY, STATE1 | ||
601 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
602 | # aesdec KEY, STATE2 | ||
603 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
604 | # aesdec KEY, STATE3 | ||
605 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
606 | # aesdec KEY, STATE4 | ||
607 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
608 | movaps -0x50(TKEYP), KEY | ||
609 | # aesdec KEY, STATE1 | ||
610 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
611 | # aesdec KEY, STATE2 | ||
612 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
613 | # aesdec KEY, STATE3 | ||
614 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
615 | # aesdec KEY, STATE4 | ||
616 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
617 | .align 4 | ||
618 | .L4dec192: | ||
619 | movaps -0x40(TKEYP), KEY | ||
620 | # aesdec KEY, STATE1 | ||
621 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
622 | # aesdec KEY, STATE2 | ||
623 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
624 | # aesdec KEY, STATE3 | ||
625 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
626 | # aesdec KEY, STATE4 | ||
627 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
628 | movaps -0x30(TKEYP), KEY | ||
629 | # aesdec KEY, STATE1 | ||
630 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
631 | # aesdec KEY, STATE2 | ||
632 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
633 | # aesdec KEY, STATE3 | ||
634 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
635 | # aesdec KEY, STATE4 | ||
636 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
637 | .align 4 | ||
638 | .L4dec128: | ||
639 | movaps -0x20(TKEYP), KEY | ||
640 | # aesdec KEY, STATE1 | ||
641 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
642 | # aesdec KEY, STATE2 | ||
643 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
644 | # aesdec KEY, STATE3 | ||
645 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
646 | # aesdec KEY, STATE4 | ||
647 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
648 | movaps -0x10(TKEYP), KEY | ||
649 | # aesdec KEY, STATE1 | ||
650 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
651 | # aesdec KEY, STATE2 | ||
652 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
653 | # aesdec KEY, STATE3 | ||
654 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
655 | # aesdec KEY, STATE4 | ||
656 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
657 | movaps (TKEYP), KEY | ||
658 | # aesdec KEY, STATE1 | ||
659 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
660 | # aesdec KEY, STATE2 | ||
661 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
662 | # aesdec KEY, STATE3 | ||
663 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
664 | # aesdec KEY, STATE4 | ||
665 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
666 | movaps 0x10(TKEYP), KEY | ||
667 | # aesdec KEY, STATE1 | ||
668 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
669 | # aesdec KEY, STATE2 | ||
670 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
671 | # aesdec KEY, STATE3 | ||
672 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
673 | # aesdec KEY, STATE4 | ||
674 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
675 | movaps 0x20(TKEYP), KEY | ||
676 | # aesdec KEY, STATE1 | ||
677 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
678 | # aesdec KEY, STATE2 | ||
679 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
680 | # aesdec KEY, STATE3 | ||
681 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
682 | # aesdec KEY, STATE4 | ||
683 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
684 | movaps 0x30(TKEYP), KEY | ||
685 | # aesdec KEY, STATE1 | ||
686 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
687 | # aesdec KEY, STATE2 | ||
688 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
689 | # aesdec KEY, STATE3 | ||
690 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
691 | # aesdec KEY, STATE4 | ||
692 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
693 | movaps 0x40(TKEYP), KEY | ||
694 | # aesdec KEY, STATE1 | ||
695 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
696 | # aesdec KEY, STATE2 | ||
697 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
698 | # aesdec KEY, STATE3 | ||
699 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
700 | # aesdec KEY, STATE4 | ||
701 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
702 | movaps 0x50(TKEYP), KEY | ||
703 | # aesdec KEY, STATE1 | ||
704 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
705 | # aesdec KEY, STATE2 | ||
706 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
707 | # aesdec KEY, STATE3 | ||
708 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
709 | # aesdec KEY, STATE4 | ||
710 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
711 | movaps 0x60(TKEYP), KEY | ||
712 | # aesdec KEY, STATE1 | ||
713 | .byte 0x66, 0x0f, 0x38, 0xde, 0xc2 | ||
714 | # aesdec KEY, STATE2 | ||
715 | .byte 0x66, 0x0f, 0x38, 0xde, 0xe2 | ||
716 | # aesdec KEY, STATE3 | ||
717 | .byte 0x66, 0x0f, 0x38, 0xde, 0xea | ||
718 | # aesdec KEY, STATE4 | ||
719 | .byte 0x66, 0x0f, 0x38, 0xde, 0xf2 | ||
720 | movaps 0x70(TKEYP), KEY | ||
721 | # aesdeclast KEY, STATE1 # last round | ||
722 | .byte 0x66, 0x0f, 0x38, 0xdf, 0xc2 | ||
723 | # aesdeclast KEY, STATE2 | ||
724 | .byte 0x66, 0x0f, 0x38, 0xdf, 0xe2 | ||
725 | # aesdeclast KEY, STATE3 | ||
726 | .byte 0x66, 0x0f, 0x38, 0xdf, 0xea | ||
727 | # aesdeclast KEY, STATE4 | ||
728 | .byte 0x66, 0x0f, 0x38, 0xdf, 0xf2 | ||
729 | ret | ||
730 | |||
731 | /* | ||
732 | * void aesni_ecb_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, | ||
733 | * size_t len) | ||
734 | */ | ||
735 | ENTRY(aesni_ecb_enc) | ||
736 | test LEN, LEN # check length | ||
737 | jz .Lecb_enc_ret | ||
738 | mov 480(KEYP), KLEN | ||
739 | cmp $16, LEN | ||
740 | jb .Lecb_enc_ret | ||
741 | cmp $64, LEN | ||
742 | jb .Lecb_enc_loop1 | ||
743 | .align 4 | ||
744 | .Lecb_enc_loop4: | ||
745 | movups (INP), STATE1 | ||
746 | movups 0x10(INP), STATE2 | ||
747 | movups 0x20(INP), STATE3 | ||
748 | movups 0x30(INP), STATE4 | ||
749 | call _aesni_enc4 | ||
750 | movups STATE1, (OUTP) | ||
751 | movups STATE2, 0x10(OUTP) | ||
752 | movups STATE3, 0x20(OUTP) | ||
753 | movups STATE4, 0x30(OUTP) | ||
754 | sub $64, LEN | ||
755 | add $64, INP | ||
756 | add $64, OUTP | ||
757 | cmp $64, LEN | ||
758 | jge .Lecb_enc_loop4 | ||
759 | cmp $16, LEN | ||
760 | jb .Lecb_enc_ret | ||
761 | .align 4 | ||
762 | .Lecb_enc_loop1: | ||
763 | movups (INP), STATE1 | ||
764 | call _aesni_enc1 | ||
765 | movups STATE1, (OUTP) | ||
766 | sub $16, LEN | ||
767 | add $16, INP | ||
768 | add $16, OUTP | ||
769 | cmp $16, LEN | ||
770 | jge .Lecb_enc_loop1 | ||
771 | .Lecb_enc_ret: | ||
772 | ret | ||
773 | |||
774 | /* | ||
775 | * void aesni_ecb_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, | ||
776 | * size_t len); | ||
777 | */ | ||
778 | ENTRY(aesni_ecb_dec) | ||
779 | test LEN, LEN | ||
780 | jz .Lecb_dec_ret | ||
781 | mov 480(KEYP), KLEN | ||
782 | add $240, KEYP | ||
783 | cmp $16, LEN | ||
784 | jb .Lecb_dec_ret | ||
785 | cmp $64, LEN | ||
786 | jb .Lecb_dec_loop1 | ||
787 | .align 4 | ||
788 | .Lecb_dec_loop4: | ||
789 | movups (INP), STATE1 | ||
790 | movups 0x10(INP), STATE2 | ||
791 | movups 0x20(INP), STATE3 | ||
792 | movups 0x30(INP), STATE4 | ||
793 | call _aesni_dec4 | ||
794 | movups STATE1, (OUTP) | ||
795 | movups STATE2, 0x10(OUTP) | ||
796 | movups STATE3, 0x20(OUTP) | ||
797 | movups STATE4, 0x30(OUTP) | ||
798 | sub $64, LEN | ||
799 | add $64, INP | ||
800 | add $64, OUTP | ||
801 | cmp $64, LEN | ||
802 | jge .Lecb_dec_loop4 | ||
803 | cmp $16, LEN | ||
804 | jb .Lecb_dec_ret | ||
805 | .align 4 | ||
806 | .Lecb_dec_loop1: | ||
807 | movups (INP), STATE1 | ||
808 | call _aesni_dec1 | ||
809 | movups STATE1, (OUTP) | ||
810 | sub $16, LEN | ||
811 | add $16, INP | ||
812 | add $16, OUTP | ||
813 | cmp $16, LEN | ||
814 | jge .Lecb_dec_loop1 | ||
815 | .Lecb_dec_ret: | ||
816 | ret | ||
817 | |||
818 | /* | ||
819 | * void aesni_cbc_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, | ||
820 | * size_t len, u8 *iv) | ||
821 | */ | ||
822 | ENTRY(aesni_cbc_enc) | ||
823 | cmp $16, LEN | ||
824 | jb .Lcbc_enc_ret | ||
825 | mov 480(KEYP), KLEN | ||
826 | movups (IVP), STATE # load iv as initial state | ||
827 | .align 4 | ||
828 | .Lcbc_enc_loop: | ||
829 | movups (INP), IN # load input | ||
830 | pxor IN, STATE | ||
831 | call _aesni_enc1 | ||
832 | movups STATE, (OUTP) # store output | ||
833 | sub $16, LEN | ||
834 | add $16, INP | ||
835 | add $16, OUTP | ||
836 | cmp $16, LEN | ||
837 | jge .Lcbc_enc_loop | ||
838 | movups STATE, (IVP) | ||
839 | .Lcbc_enc_ret: | ||
840 | ret | ||
841 | |||
842 | /* | ||
843 | * void aesni_cbc_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, | ||
844 | * size_t len, u8 *iv) | ||
845 | */ | ||
846 | ENTRY(aesni_cbc_dec) | ||
847 | cmp $16, LEN | ||
848 | jb .Lcbc_dec_ret | ||
849 | mov 480(KEYP), KLEN | ||
850 | add $240, KEYP | ||
851 | movups (IVP), IV | ||
852 | cmp $64, LEN | ||
853 | jb .Lcbc_dec_loop1 | ||
854 | .align 4 | ||
855 | .Lcbc_dec_loop4: | ||
856 | movups (INP), IN1 | ||
857 | movaps IN1, STATE1 | ||
858 | movups 0x10(INP), IN2 | ||
859 | movaps IN2, STATE2 | ||
860 | movups 0x20(INP), IN3 | ||
861 | movaps IN3, STATE3 | ||
862 | movups 0x30(INP), IN4 | ||
863 | movaps IN4, STATE4 | ||
864 | call _aesni_dec4 | ||
865 | pxor IV, STATE1 | ||
866 | pxor IN1, STATE2 | ||
867 | pxor IN2, STATE3 | ||
868 | pxor IN3, STATE4 | ||
869 | movaps IN4, IV | ||
870 | movups STATE1, (OUTP) | ||
871 | movups STATE2, 0x10(OUTP) | ||
872 | movups STATE3, 0x20(OUTP) | ||
873 | movups STATE4, 0x30(OUTP) | ||
874 | sub $64, LEN | ||
875 | add $64, INP | ||
876 | add $64, OUTP | ||
877 | cmp $64, LEN | ||
878 | jge .Lcbc_dec_loop4 | ||
879 | cmp $16, LEN | ||
880 | jb .Lcbc_dec_ret | ||
881 | .align 4 | ||
882 | .Lcbc_dec_loop1: | ||
883 | movups (INP), IN | ||
884 | movaps IN, STATE | ||
885 | call _aesni_dec1 | ||
886 | pxor IV, STATE | ||
887 | movups STATE, (OUTP) | ||
888 | movaps IN, IV | ||
889 | sub $16, LEN | ||
890 | add $16, INP | ||
891 | add $16, OUTP | ||
892 | cmp $16, LEN | ||
893 | jge .Lcbc_dec_loop1 | ||
894 | movups IV, (IVP) | ||
895 | .Lcbc_dec_ret: | ||
896 | ret | ||
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c new file mode 100644 index 000000000000..02af0af65497 --- /dev/null +++ b/arch/x86/crypto/aesni-intel_glue.c | |||
@@ -0,0 +1,461 @@ | |||
1 | /* | ||
2 | * Support for Intel AES-NI instructions. This file contains glue | ||
3 | * code, the real AES implementation is in intel-aes_asm.S. | ||
4 | * | ||
5 | * Copyright (C) 2008, Intel Corp. | ||
6 | * Author: Huang Ying <ying.huang@intel.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/hardirq.h> | ||
15 | #include <linux/types.h> | ||
16 | #include <linux/crypto.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <crypto/algapi.h> | ||
19 | #include <crypto/aes.h> | ||
20 | #include <crypto/cryptd.h> | ||
21 | #include <asm/i387.h> | ||
22 | #include <asm/aes.h> | ||
23 | |||
24 | struct async_aes_ctx { | ||
25 | struct cryptd_ablkcipher *cryptd_tfm; | ||
26 | }; | ||
27 | |||
28 | #define AESNI_ALIGN 16 | ||
29 | #define AES_BLOCK_MASK (~(AES_BLOCK_SIZE-1)) | ||
30 | |||
31 | asmlinkage int aesni_set_key(struct crypto_aes_ctx *ctx, const u8 *in_key, | ||
32 | unsigned int key_len); | ||
33 | asmlinkage void aesni_enc(struct crypto_aes_ctx *ctx, u8 *out, | ||
34 | const u8 *in); | ||
35 | asmlinkage void aesni_dec(struct crypto_aes_ctx *ctx, u8 *out, | ||
36 | const u8 *in); | ||
37 | asmlinkage void aesni_ecb_enc(struct crypto_aes_ctx *ctx, u8 *out, | ||
38 | const u8 *in, unsigned int len); | ||
39 | asmlinkage void aesni_ecb_dec(struct crypto_aes_ctx *ctx, u8 *out, | ||
40 | const u8 *in, unsigned int len); | ||
41 | asmlinkage void aesni_cbc_enc(struct crypto_aes_ctx *ctx, u8 *out, | ||
42 | const u8 *in, unsigned int len, u8 *iv); | ||
43 | asmlinkage void aesni_cbc_dec(struct crypto_aes_ctx *ctx, u8 *out, | ||
44 | const u8 *in, unsigned int len, u8 *iv); | ||
45 | |||
46 | static inline int kernel_fpu_using(void) | ||
47 | { | ||
48 | if (in_interrupt() && !(read_cr0() & X86_CR0_TS)) | ||
49 | return 1; | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static inline struct crypto_aes_ctx *aes_ctx(void *raw_ctx) | ||
54 | { | ||
55 | unsigned long addr = (unsigned long)raw_ctx; | ||
56 | unsigned long align = AESNI_ALIGN; | ||
57 | |||
58 | if (align <= crypto_tfm_ctx_alignment()) | ||
59 | align = 1; | ||
60 | return (struct crypto_aes_ctx *)ALIGN(addr, align); | ||
61 | } | ||
62 | |||
63 | static int aes_set_key_common(struct crypto_tfm *tfm, void *raw_ctx, | ||
64 | const u8 *in_key, unsigned int key_len) | ||
65 | { | ||
66 | struct crypto_aes_ctx *ctx = aes_ctx(raw_ctx); | ||
67 | u32 *flags = &tfm->crt_flags; | ||
68 | int err; | ||
69 | |||
70 | if (key_len != AES_KEYSIZE_128 && key_len != AES_KEYSIZE_192 && | ||
71 | key_len != AES_KEYSIZE_256) { | ||
72 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
73 | return -EINVAL; | ||
74 | } | ||
75 | |||
76 | if (kernel_fpu_using()) | ||
77 | err = crypto_aes_expand_key(ctx, in_key, key_len); | ||
78 | else { | ||
79 | kernel_fpu_begin(); | ||
80 | err = aesni_set_key(ctx, in_key, key_len); | ||
81 | kernel_fpu_end(); | ||
82 | } | ||
83 | |||
84 | return err; | ||
85 | } | ||
86 | |||
87 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
88 | unsigned int key_len) | ||
89 | { | ||
90 | return aes_set_key_common(tfm, crypto_tfm_ctx(tfm), in_key, key_len); | ||
91 | } | ||
92 | |||
93 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
94 | { | ||
95 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_tfm_ctx(tfm)); | ||
96 | |||
97 | if (kernel_fpu_using()) | ||
98 | crypto_aes_encrypt_x86(ctx, dst, src); | ||
99 | else { | ||
100 | kernel_fpu_begin(); | ||
101 | aesni_enc(ctx, dst, src); | ||
102 | kernel_fpu_end(); | ||
103 | } | ||
104 | } | ||
105 | |||
106 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
107 | { | ||
108 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_tfm_ctx(tfm)); | ||
109 | |||
110 | if (kernel_fpu_using()) | ||
111 | crypto_aes_decrypt_x86(ctx, dst, src); | ||
112 | else { | ||
113 | kernel_fpu_begin(); | ||
114 | aesni_dec(ctx, dst, src); | ||
115 | kernel_fpu_end(); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | static struct crypto_alg aesni_alg = { | ||
120 | .cra_name = "aes", | ||
121 | .cra_driver_name = "aes-aesni", | ||
122 | .cra_priority = 300, | ||
123 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
124 | .cra_blocksize = AES_BLOCK_SIZE, | ||
125 | .cra_ctxsize = sizeof(struct crypto_aes_ctx)+AESNI_ALIGN-1, | ||
126 | .cra_alignmask = 0, | ||
127 | .cra_module = THIS_MODULE, | ||
128 | .cra_list = LIST_HEAD_INIT(aesni_alg.cra_list), | ||
129 | .cra_u = { | ||
130 | .cipher = { | ||
131 | .cia_min_keysize = AES_MIN_KEY_SIZE, | ||
132 | .cia_max_keysize = AES_MAX_KEY_SIZE, | ||
133 | .cia_setkey = aes_set_key, | ||
134 | .cia_encrypt = aes_encrypt, | ||
135 | .cia_decrypt = aes_decrypt | ||
136 | } | ||
137 | } | ||
138 | }; | ||
139 | |||
140 | static int ecb_encrypt(struct blkcipher_desc *desc, | ||
141 | struct scatterlist *dst, struct scatterlist *src, | ||
142 | unsigned int nbytes) | ||
143 | { | ||
144 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_blkcipher_ctx(desc->tfm)); | ||
145 | struct blkcipher_walk walk; | ||
146 | int err; | ||
147 | |||
148 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
149 | err = blkcipher_walk_virt(desc, &walk); | ||
150 | |||
151 | kernel_fpu_begin(); | ||
152 | while ((nbytes = walk.nbytes)) { | ||
153 | aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, | ||
154 | nbytes & AES_BLOCK_MASK); | ||
155 | nbytes &= AES_BLOCK_SIZE - 1; | ||
156 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
157 | } | ||
158 | kernel_fpu_end(); | ||
159 | |||
160 | return err; | ||
161 | } | ||
162 | |||
163 | static int ecb_decrypt(struct blkcipher_desc *desc, | ||
164 | struct scatterlist *dst, struct scatterlist *src, | ||
165 | unsigned int nbytes) | ||
166 | { | ||
167 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_blkcipher_ctx(desc->tfm)); | ||
168 | struct blkcipher_walk walk; | ||
169 | int err; | ||
170 | |||
171 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
172 | err = blkcipher_walk_virt(desc, &walk); | ||
173 | |||
174 | kernel_fpu_begin(); | ||
175 | while ((nbytes = walk.nbytes)) { | ||
176 | aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, | ||
177 | nbytes & AES_BLOCK_MASK); | ||
178 | nbytes &= AES_BLOCK_SIZE - 1; | ||
179 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
180 | } | ||
181 | kernel_fpu_end(); | ||
182 | |||
183 | return err; | ||
184 | } | ||
185 | |||
186 | static struct crypto_alg blk_ecb_alg = { | ||
187 | .cra_name = "__ecb-aes-aesni", | ||
188 | .cra_driver_name = "__driver-ecb-aes-aesni", | ||
189 | .cra_priority = 0, | ||
190 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
191 | .cra_blocksize = AES_BLOCK_SIZE, | ||
192 | .cra_ctxsize = sizeof(struct crypto_aes_ctx)+AESNI_ALIGN-1, | ||
193 | .cra_alignmask = 0, | ||
194 | .cra_type = &crypto_blkcipher_type, | ||
195 | .cra_module = THIS_MODULE, | ||
196 | .cra_list = LIST_HEAD_INIT(blk_ecb_alg.cra_list), | ||
197 | .cra_u = { | ||
198 | .blkcipher = { | ||
199 | .min_keysize = AES_MIN_KEY_SIZE, | ||
200 | .max_keysize = AES_MAX_KEY_SIZE, | ||
201 | .setkey = aes_set_key, | ||
202 | .encrypt = ecb_encrypt, | ||
203 | .decrypt = ecb_decrypt, | ||
204 | }, | ||
205 | }, | ||
206 | }; | ||
207 | |||
208 | static int cbc_encrypt(struct blkcipher_desc *desc, | ||
209 | struct scatterlist *dst, struct scatterlist *src, | ||
210 | unsigned int nbytes) | ||
211 | { | ||
212 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_blkcipher_ctx(desc->tfm)); | ||
213 | struct blkcipher_walk walk; | ||
214 | int err; | ||
215 | |||
216 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
217 | err = blkcipher_walk_virt(desc, &walk); | ||
218 | |||
219 | kernel_fpu_begin(); | ||
220 | while ((nbytes = walk.nbytes)) { | ||
221 | aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, | ||
222 | nbytes & AES_BLOCK_MASK, walk.iv); | ||
223 | nbytes &= AES_BLOCK_SIZE - 1; | ||
224 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
225 | } | ||
226 | kernel_fpu_end(); | ||
227 | |||
228 | return err; | ||
229 | } | ||
230 | |||
231 | static int cbc_decrypt(struct blkcipher_desc *desc, | ||
232 | struct scatterlist *dst, struct scatterlist *src, | ||
233 | unsigned int nbytes) | ||
234 | { | ||
235 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_blkcipher_ctx(desc->tfm)); | ||
236 | struct blkcipher_walk walk; | ||
237 | int err; | ||
238 | |||
239 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
240 | err = blkcipher_walk_virt(desc, &walk); | ||
241 | |||
242 | kernel_fpu_begin(); | ||
243 | while ((nbytes = walk.nbytes)) { | ||
244 | aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, | ||
245 | nbytes & AES_BLOCK_MASK, walk.iv); | ||
246 | nbytes &= AES_BLOCK_SIZE - 1; | ||
247 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
248 | } | ||
249 | kernel_fpu_end(); | ||
250 | |||
251 | return err; | ||
252 | } | ||
253 | |||
254 | static struct crypto_alg blk_cbc_alg = { | ||
255 | .cra_name = "__cbc-aes-aesni", | ||
256 | .cra_driver_name = "__driver-cbc-aes-aesni", | ||
257 | .cra_priority = 0, | ||
258 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
259 | .cra_blocksize = AES_BLOCK_SIZE, | ||
260 | .cra_ctxsize = sizeof(struct crypto_aes_ctx)+AESNI_ALIGN-1, | ||
261 | .cra_alignmask = 0, | ||
262 | .cra_type = &crypto_blkcipher_type, | ||
263 | .cra_module = THIS_MODULE, | ||
264 | .cra_list = LIST_HEAD_INIT(blk_cbc_alg.cra_list), | ||
265 | .cra_u = { | ||
266 | .blkcipher = { | ||
267 | .min_keysize = AES_MIN_KEY_SIZE, | ||
268 | .max_keysize = AES_MAX_KEY_SIZE, | ||
269 | .setkey = aes_set_key, | ||
270 | .encrypt = cbc_encrypt, | ||
271 | .decrypt = cbc_decrypt, | ||
272 | }, | ||
273 | }, | ||
274 | }; | ||
275 | |||
276 | static int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key, | ||
277 | unsigned int key_len) | ||
278 | { | ||
279 | struct async_aes_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
280 | |||
281 | return crypto_ablkcipher_setkey(&ctx->cryptd_tfm->base, key, key_len); | ||
282 | } | ||
283 | |||
284 | static int ablk_encrypt(struct ablkcipher_request *req) | ||
285 | { | ||
286 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
287 | struct async_aes_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
288 | |||
289 | if (kernel_fpu_using()) { | ||
290 | struct ablkcipher_request *cryptd_req = | ||
291 | ablkcipher_request_ctx(req); | ||
292 | memcpy(cryptd_req, req, sizeof(*req)); | ||
293 | ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base); | ||
294 | return crypto_ablkcipher_encrypt(cryptd_req); | ||
295 | } else { | ||
296 | struct blkcipher_desc desc; | ||
297 | desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm); | ||
298 | desc.info = req->info; | ||
299 | desc.flags = 0; | ||
300 | return crypto_blkcipher_crt(desc.tfm)->encrypt( | ||
301 | &desc, req->dst, req->src, req->nbytes); | ||
302 | } | ||
303 | } | ||
304 | |||
305 | static int ablk_decrypt(struct ablkcipher_request *req) | ||
306 | { | ||
307 | struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); | ||
308 | struct async_aes_ctx *ctx = crypto_ablkcipher_ctx(tfm); | ||
309 | |||
310 | if (kernel_fpu_using()) { | ||
311 | struct ablkcipher_request *cryptd_req = | ||
312 | ablkcipher_request_ctx(req); | ||
313 | memcpy(cryptd_req, req, sizeof(*req)); | ||
314 | ablkcipher_request_set_tfm(cryptd_req, &ctx->cryptd_tfm->base); | ||
315 | return crypto_ablkcipher_decrypt(cryptd_req); | ||
316 | } else { | ||
317 | struct blkcipher_desc desc; | ||
318 | desc.tfm = cryptd_ablkcipher_child(ctx->cryptd_tfm); | ||
319 | desc.info = req->info; | ||
320 | desc.flags = 0; | ||
321 | return crypto_blkcipher_crt(desc.tfm)->decrypt( | ||
322 | &desc, req->dst, req->src, req->nbytes); | ||
323 | } | ||
324 | } | ||
325 | |||
326 | static void ablk_exit(struct crypto_tfm *tfm) | ||
327 | { | ||
328 | struct async_aes_ctx *ctx = crypto_tfm_ctx(tfm); | ||
329 | |||
330 | cryptd_free_ablkcipher(ctx->cryptd_tfm); | ||
331 | } | ||
332 | |||
333 | static void ablk_init_common(struct crypto_tfm *tfm, | ||
334 | struct cryptd_ablkcipher *cryptd_tfm) | ||
335 | { | ||
336 | struct async_aes_ctx *ctx = crypto_tfm_ctx(tfm); | ||
337 | |||
338 | ctx->cryptd_tfm = cryptd_tfm; | ||
339 | tfm->crt_ablkcipher.reqsize = sizeof(struct ablkcipher_request) + | ||
340 | crypto_ablkcipher_reqsize(&cryptd_tfm->base); | ||
341 | } | ||
342 | |||
343 | static int ablk_ecb_init(struct crypto_tfm *tfm) | ||
344 | { | ||
345 | struct cryptd_ablkcipher *cryptd_tfm; | ||
346 | |||
347 | cryptd_tfm = cryptd_alloc_ablkcipher("__driver-ecb-aes-aesni", 0, 0); | ||
348 | if (IS_ERR(cryptd_tfm)) | ||
349 | return PTR_ERR(cryptd_tfm); | ||
350 | ablk_init_common(tfm, cryptd_tfm); | ||
351 | return 0; | ||
352 | } | ||
353 | |||
354 | static struct crypto_alg ablk_ecb_alg = { | ||
355 | .cra_name = "ecb(aes)", | ||
356 | .cra_driver_name = "ecb-aes-aesni", | ||
357 | .cra_priority = 400, | ||
358 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC, | ||
359 | .cra_blocksize = AES_BLOCK_SIZE, | ||
360 | .cra_ctxsize = sizeof(struct async_aes_ctx), | ||
361 | .cra_alignmask = 0, | ||
362 | .cra_type = &crypto_ablkcipher_type, | ||
363 | .cra_module = THIS_MODULE, | ||
364 | .cra_list = LIST_HEAD_INIT(ablk_ecb_alg.cra_list), | ||
365 | .cra_init = ablk_ecb_init, | ||
366 | .cra_exit = ablk_exit, | ||
367 | .cra_u = { | ||
368 | .ablkcipher = { | ||
369 | .min_keysize = AES_MIN_KEY_SIZE, | ||
370 | .max_keysize = AES_MAX_KEY_SIZE, | ||
371 | .setkey = ablk_set_key, | ||
372 | .encrypt = ablk_encrypt, | ||
373 | .decrypt = ablk_decrypt, | ||
374 | }, | ||
375 | }, | ||
376 | }; | ||
377 | |||
378 | static int ablk_cbc_init(struct crypto_tfm *tfm) | ||
379 | { | ||
380 | struct cryptd_ablkcipher *cryptd_tfm; | ||
381 | |||
382 | cryptd_tfm = cryptd_alloc_ablkcipher("__driver-cbc-aes-aesni", 0, 0); | ||
383 | if (IS_ERR(cryptd_tfm)) | ||
384 | return PTR_ERR(cryptd_tfm); | ||
385 | ablk_init_common(tfm, cryptd_tfm); | ||
386 | return 0; | ||
387 | } | ||
388 | |||
389 | static struct crypto_alg ablk_cbc_alg = { | ||
390 | .cra_name = "cbc(aes)", | ||
391 | .cra_driver_name = "cbc-aes-aesni", | ||
392 | .cra_priority = 400, | ||
393 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC, | ||
394 | .cra_blocksize = AES_BLOCK_SIZE, | ||
395 | .cra_ctxsize = sizeof(struct async_aes_ctx), | ||
396 | .cra_alignmask = 0, | ||
397 | .cra_type = &crypto_ablkcipher_type, | ||
398 | .cra_module = THIS_MODULE, | ||
399 | .cra_list = LIST_HEAD_INIT(ablk_cbc_alg.cra_list), | ||
400 | .cra_init = ablk_cbc_init, | ||
401 | .cra_exit = ablk_exit, | ||
402 | .cra_u = { | ||
403 | .ablkcipher = { | ||
404 | .min_keysize = AES_MIN_KEY_SIZE, | ||
405 | .max_keysize = AES_MAX_KEY_SIZE, | ||
406 | .ivsize = AES_BLOCK_SIZE, | ||
407 | .setkey = ablk_set_key, | ||
408 | .encrypt = ablk_encrypt, | ||
409 | .decrypt = ablk_decrypt, | ||
410 | }, | ||
411 | }, | ||
412 | }; | ||
413 | |||
414 | static int __init aesni_init(void) | ||
415 | { | ||
416 | int err; | ||
417 | |||
418 | if (!cpu_has_aes) { | ||
419 | printk(KERN_ERR "Intel AES-NI instructions are not detected.\n"); | ||
420 | return -ENODEV; | ||
421 | } | ||
422 | if ((err = crypto_register_alg(&aesni_alg))) | ||
423 | goto aes_err; | ||
424 | if ((err = crypto_register_alg(&blk_ecb_alg))) | ||
425 | goto blk_ecb_err; | ||
426 | if ((err = crypto_register_alg(&blk_cbc_alg))) | ||
427 | goto blk_cbc_err; | ||
428 | if ((err = crypto_register_alg(&ablk_ecb_alg))) | ||
429 | goto ablk_ecb_err; | ||
430 | if ((err = crypto_register_alg(&ablk_cbc_alg))) | ||
431 | goto ablk_cbc_err; | ||
432 | |||
433 | return err; | ||
434 | |||
435 | ablk_cbc_err: | ||
436 | crypto_unregister_alg(&ablk_ecb_alg); | ||
437 | ablk_ecb_err: | ||
438 | crypto_unregister_alg(&blk_cbc_alg); | ||
439 | blk_cbc_err: | ||
440 | crypto_unregister_alg(&blk_ecb_alg); | ||
441 | blk_ecb_err: | ||
442 | crypto_unregister_alg(&aesni_alg); | ||
443 | aes_err: | ||
444 | return err; | ||
445 | } | ||
446 | |||
447 | static void __exit aesni_exit(void) | ||
448 | { | ||
449 | crypto_unregister_alg(&ablk_cbc_alg); | ||
450 | crypto_unregister_alg(&ablk_ecb_alg); | ||
451 | crypto_unregister_alg(&blk_cbc_alg); | ||
452 | crypto_unregister_alg(&blk_ecb_alg); | ||
453 | crypto_unregister_alg(&aesni_alg); | ||
454 | } | ||
455 | |||
456 | module_init(aesni_init); | ||
457 | module_exit(aesni_exit); | ||
458 | |||
459 | MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm, Intel AES-NI instructions optimized"); | ||
460 | MODULE_LICENSE("GPL"); | ||
461 | MODULE_ALIAS("aes"); | ||
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 097a6b64c24d..db0c803170ab 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -557,7 +557,7 @@ ia32_sys_call_table: | |||
557 | .quad sys32_olduname | 557 | .quad sys32_olduname |
558 | .quad sys_umask /* 60 */ | 558 | .quad sys_umask /* 60 */ |
559 | .quad sys_chroot | 559 | .quad sys_chroot |
560 | .quad sys32_ustat | 560 | .quad compat_sys_ustat |
561 | .quad sys_dup2 | 561 | .quad sys_dup2 |
562 | .quad sys_getppid | 562 | .quad sys_getppid |
563 | .quad sys_getpgrp /* 65 */ | 563 | .quad sys_getpgrp /* 65 */ |
diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index 6c0d7f6231af..efac92fd1efb 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c | |||
@@ -638,28 +638,6 @@ long sys32_uname(struct old_utsname __user *name) | |||
638 | return err ? -EFAULT : 0; | 638 | return err ? -EFAULT : 0; |
639 | } | 639 | } |
640 | 640 | ||
641 | long sys32_ustat(unsigned dev, struct ustat32 __user *u32p) | ||
642 | { | ||
643 | struct ustat u; | ||
644 | mm_segment_t seg; | ||
645 | int ret; | ||
646 | |||
647 | seg = get_fs(); | ||
648 | set_fs(KERNEL_DS); | ||
649 | ret = sys_ustat(dev, (struct ustat __user *)&u); | ||
650 | set_fs(seg); | ||
651 | if (ret < 0) | ||
652 | return ret; | ||
653 | |||
654 | if (!access_ok(VERIFY_WRITE, u32p, sizeof(struct ustat32)) || | ||
655 | __put_user((__u32) u.f_tfree, &u32p->f_tfree) || | ||
656 | __put_user((__u32) u.f_tinode, &u32p->f_tfree) || | ||
657 | __copy_to_user(&u32p->f_fname, u.f_fname, sizeof(u.f_fname)) || | ||
658 | __copy_to_user(&u32p->f_fpack, u.f_fpack, sizeof(u.f_fpack))) | ||
659 | ret = -EFAULT; | ||
660 | return ret; | ||
661 | } | ||
662 | |||
663 | asmlinkage long sys32_execve(char __user *name, compat_uptr_t __user *argv, | 641 | asmlinkage long sys32_execve(char __user *name, compat_uptr_t __user *argv, |
664 | compat_uptr_t __user *envp, struct pt_regs *regs) | 642 | compat_uptr_t __user *envp, struct pt_regs *regs) |
665 | { | 643 | { |
diff --git a/arch/x86/include/asm/aes.h b/arch/x86/include/asm/aes.h new file mode 100644 index 000000000000..80545a1cbe39 --- /dev/null +++ b/arch/x86/include/asm/aes.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef ASM_X86_AES_H | ||
2 | #define ASM_X86_AES_H | ||
3 | |||
4 | #include <linux/crypto.h> | ||
5 | #include <crypto/aes.h> | ||
6 | |||
7 | void crypto_aes_encrypt_x86(struct crypto_aes_ctx *ctx, u8 *dst, | ||
8 | const u8 *src); | ||
9 | void crypto_aes_decrypt_x86(struct crypto_aes_ctx *ctx, u8 *dst, | ||
10 | const u8 *src); | ||
11 | #endif | ||
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 7301e60dc4a8..0beba0d1468d 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -213,6 +213,7 @@ extern const char * const x86_power_flags[32]; | |||
213 | #define cpu_has_xmm boot_cpu_has(X86_FEATURE_XMM) | 213 | #define cpu_has_xmm boot_cpu_has(X86_FEATURE_XMM) |
214 | #define cpu_has_xmm2 boot_cpu_has(X86_FEATURE_XMM2) | 214 | #define cpu_has_xmm2 boot_cpu_has(X86_FEATURE_XMM2) |
215 | #define cpu_has_xmm3 boot_cpu_has(X86_FEATURE_XMM3) | 215 | #define cpu_has_xmm3 boot_cpu_has(X86_FEATURE_XMM3) |
216 | #define cpu_has_aes boot_cpu_has(X86_FEATURE_AES) | ||
216 | #define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) | 217 | #define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) |
217 | #define cpu_has_mp boot_cpu_has(X86_FEATURE_MP) | 218 | #define cpu_has_mp boot_cpu_has(X86_FEATURE_MP) |
218 | #define cpu_has_nx boot_cpu_has(X86_FEATURE_NX) | 219 | #define cpu_has_nx boot_cpu_has(X86_FEATURE_NX) |
diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h index 50ca486fd88c..1f7e62517284 100644 --- a/arch/x86/include/asm/ia32.h +++ b/arch/x86/include/asm/ia32.h | |||
@@ -129,13 +129,6 @@ typedef struct compat_siginfo { | |||
129 | } _sifields; | 129 | } _sifields; |
130 | } compat_siginfo_t; | 130 | } compat_siginfo_t; |
131 | 131 | ||
132 | struct ustat32 { | ||
133 | __u32 f_tfree; | ||
134 | compat_ino_t f_tinode; | ||
135 | char f_fname[6]; | ||
136 | char f_fpack[6]; | ||
137 | }; | ||
138 | |||
139 | #define IA32_STACK_TOP IA32_PAGE_OFFSET | 132 | #define IA32_STACK_TOP IA32_PAGE_OFFSET |
140 | 133 | ||
141 | #ifdef __KERNEL__ | 134 | #ifdef __KERNEL__ |
diff --git a/arch/x86/include/asm/kvm.h b/arch/x86/include/asm/kvm.h index 886c9402ec45..dc3f6cf11704 100644 --- a/arch/x86/include/asm/kvm.h +++ b/arch/x86/include/asm/kvm.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define __KVM_HAVE_DEVICE_ASSIGNMENT | 15 | #define __KVM_HAVE_DEVICE_ASSIGNMENT |
16 | #define __KVM_HAVE_MSI | 16 | #define __KVM_HAVE_MSI |
17 | #define __KVM_HAVE_USER_NMI | 17 | #define __KVM_HAVE_USER_NMI |
18 | #define __KVM_HAVE_GUEST_DEBUG | ||
18 | 19 | ||
19 | /* Architectural interrupt line count. */ | 20 | /* Architectural interrupt line count. */ |
20 | #define KVM_NR_INTERRUPTS 256 | 21 | #define KVM_NR_INTERRUPTS 256 |
@@ -212,7 +213,30 @@ struct kvm_pit_channel_state { | |||
212 | __s64 count_load_time; | 213 | __s64 count_load_time; |
213 | }; | 214 | }; |
214 | 215 | ||
216 | struct kvm_debug_exit_arch { | ||
217 | __u32 exception; | ||
218 | __u32 pad; | ||
219 | __u64 pc; | ||
220 | __u64 dr6; | ||
221 | __u64 dr7; | ||
222 | }; | ||
223 | |||
224 | #define KVM_GUESTDBG_USE_SW_BP 0x00010000 | ||
225 | #define KVM_GUESTDBG_USE_HW_BP 0x00020000 | ||
226 | #define KVM_GUESTDBG_INJECT_DB 0x00040000 | ||
227 | #define KVM_GUESTDBG_INJECT_BP 0x00080000 | ||
228 | |||
229 | /* for KVM_SET_GUEST_DEBUG */ | ||
230 | struct kvm_guest_debug_arch { | ||
231 | __u64 debugreg[8]; | ||
232 | }; | ||
233 | |||
215 | struct kvm_pit_state { | 234 | struct kvm_pit_state { |
216 | struct kvm_pit_channel_state channels[3]; | 235 | struct kvm_pit_channel_state channels[3]; |
217 | }; | 236 | }; |
237 | |||
238 | struct kvm_reinject_control { | ||
239 | __u8 pit_reinject; | ||
240 | __u8 reserved[31]; | ||
241 | }; | ||
218 | #endif /* _ASM_X86_KVM_H */ | 242 | #endif /* _ASM_X86_KVM_H */ |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 730843d1d2fb..f0faf58044ff 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/pvclock-abi.h> | 22 | #include <asm/pvclock-abi.h> |
23 | #include <asm/desc.h> | 23 | #include <asm/desc.h> |
24 | #include <asm/mtrr.h> | 24 | #include <asm/mtrr.h> |
25 | #include <asm/msr-index.h> | ||
25 | 26 | ||
26 | #define KVM_MAX_VCPUS 16 | 27 | #define KVM_MAX_VCPUS 16 |
27 | #define KVM_MEMORY_SLOTS 32 | 28 | #define KVM_MEMORY_SLOTS 32 |
@@ -134,11 +135,18 @@ enum { | |||
134 | 135 | ||
135 | #define KVM_NR_MEM_OBJS 40 | 136 | #define KVM_NR_MEM_OBJS 40 |
136 | 137 | ||
137 | struct kvm_guest_debug { | 138 | #define KVM_NR_DB_REGS 4 |
138 | int enabled; | 139 | |
139 | unsigned long bp[4]; | 140 | #define DR6_BD (1 << 13) |
140 | int singlestep; | 141 | #define DR6_BS (1 << 14) |
141 | }; | 142 | #define DR6_FIXED_1 0xffff0ff0 |
143 | #define DR6_VOLATILE 0x0000e00f | ||
144 | |||
145 | #define DR7_BP_EN_MASK 0x000000ff | ||
146 | #define DR7_GE (1 << 9) | ||
147 | #define DR7_GD (1 << 13) | ||
148 | #define DR7_FIXED_1 0x00000400 | ||
149 | #define DR7_VOLATILE 0xffff23ff | ||
142 | 150 | ||
143 | /* | 151 | /* |
144 | * We don't want allocation failures within the mmu code, so we preallocate | 152 | * We don't want allocation failures within the mmu code, so we preallocate |
@@ -162,7 +170,8 @@ struct kvm_pte_chain { | |||
162 | * bits 0:3 - total guest paging levels (2-4, or zero for real mode) | 170 | * bits 0:3 - total guest paging levels (2-4, or zero for real mode) |
163 | * bits 4:7 - page table level for this shadow (1-4) | 171 | * bits 4:7 - page table level for this shadow (1-4) |
164 | * bits 8:9 - page table quadrant for 2-level guests | 172 | * bits 8:9 - page table quadrant for 2-level guests |
165 | * bit 16 - "metaphysical" - gfn is not a real page (huge page/real mode) | 173 | * bit 16 - direct mapping of virtual to physical mapping at gfn |
174 | * used for real mode and two-dimensional paging | ||
166 | * bits 17:19 - common access permissions for all ptes in this shadow page | 175 | * bits 17:19 - common access permissions for all ptes in this shadow page |
167 | */ | 176 | */ |
168 | union kvm_mmu_page_role { | 177 | union kvm_mmu_page_role { |
@@ -172,9 +181,10 @@ union kvm_mmu_page_role { | |||
172 | unsigned level:4; | 181 | unsigned level:4; |
173 | unsigned quadrant:2; | 182 | unsigned quadrant:2; |
174 | unsigned pad_for_nice_hex_output:6; | 183 | unsigned pad_for_nice_hex_output:6; |
175 | unsigned metaphysical:1; | 184 | unsigned direct:1; |
176 | unsigned access:3; | 185 | unsigned access:3; |
177 | unsigned invalid:1; | 186 | unsigned invalid:1; |
187 | unsigned cr4_pge:1; | ||
178 | }; | 188 | }; |
179 | }; | 189 | }; |
180 | 190 | ||
@@ -218,6 +228,18 @@ struct kvm_pv_mmu_op_buffer { | |||
218 | char buf[512] __aligned(sizeof(long)); | 228 | char buf[512] __aligned(sizeof(long)); |
219 | }; | 229 | }; |
220 | 230 | ||
231 | struct kvm_pio_request { | ||
232 | unsigned long count; | ||
233 | int cur_count; | ||
234 | gva_t guest_gva; | ||
235 | int in; | ||
236 | int port; | ||
237 | int size; | ||
238 | int string; | ||
239 | int down; | ||
240 | int rep; | ||
241 | }; | ||
242 | |||
221 | /* | 243 | /* |
222 | * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level | 244 | * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level |
223 | * 32-bit). The kvm_mmu structure abstracts the details of the current mmu | 245 | * 32-bit). The kvm_mmu structure abstracts the details of the current mmu |
@@ -236,6 +258,7 @@ struct kvm_mmu { | |||
236 | hpa_t root_hpa; | 258 | hpa_t root_hpa; |
237 | int root_level; | 259 | int root_level; |
238 | int shadow_root_level; | 260 | int shadow_root_level; |
261 | union kvm_mmu_page_role base_role; | ||
239 | 262 | ||
240 | u64 *pae_root; | 263 | u64 *pae_root; |
241 | }; | 264 | }; |
@@ -258,6 +281,7 @@ struct kvm_vcpu_arch { | |||
258 | unsigned long cr3; | 281 | unsigned long cr3; |
259 | unsigned long cr4; | 282 | unsigned long cr4; |
260 | unsigned long cr8; | 283 | unsigned long cr8; |
284 | u32 hflags; | ||
261 | u64 pdptrs[4]; /* pae */ | 285 | u64 pdptrs[4]; /* pae */ |
262 | u64 shadow_efer; | 286 | u64 shadow_efer; |
263 | u64 apic_base; | 287 | u64 apic_base; |
@@ -338,6 +362,15 @@ struct kvm_vcpu_arch { | |||
338 | 362 | ||
339 | struct mtrr_state_type mtrr_state; | 363 | struct mtrr_state_type mtrr_state; |
340 | u32 pat; | 364 | u32 pat; |
365 | |||
366 | int switch_db_regs; | ||
367 | unsigned long host_db[KVM_NR_DB_REGS]; | ||
368 | unsigned long host_dr6; | ||
369 | unsigned long host_dr7; | ||
370 | unsigned long db[KVM_NR_DB_REGS]; | ||
371 | unsigned long dr6; | ||
372 | unsigned long dr7; | ||
373 | unsigned long eff_db[KVM_NR_DB_REGS]; | ||
341 | }; | 374 | }; |
342 | 375 | ||
343 | struct kvm_mem_alias { | 376 | struct kvm_mem_alias { |
@@ -378,6 +411,7 @@ struct kvm_arch{ | |||
378 | 411 | ||
379 | unsigned long irq_sources_bitmap; | 412 | unsigned long irq_sources_bitmap; |
380 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; | 413 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; |
414 | u64 vm_init_tsc; | ||
381 | }; | 415 | }; |
382 | 416 | ||
383 | struct kvm_vm_stat { | 417 | struct kvm_vm_stat { |
@@ -446,8 +480,7 @@ struct kvm_x86_ops { | |||
446 | void (*vcpu_put)(struct kvm_vcpu *vcpu); | 480 | void (*vcpu_put)(struct kvm_vcpu *vcpu); |
447 | 481 | ||
448 | int (*set_guest_debug)(struct kvm_vcpu *vcpu, | 482 | int (*set_guest_debug)(struct kvm_vcpu *vcpu, |
449 | struct kvm_debug_guest *dbg); | 483 | struct kvm_guest_debug *dbg); |
450 | void (*guest_debug_pre)(struct kvm_vcpu *vcpu); | ||
451 | int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); | 484 | int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); |
452 | int (*set_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); | 485 | int (*set_msr)(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); |
453 | u64 (*get_segment_base)(struct kvm_vcpu *vcpu, int seg); | 486 | u64 (*get_segment_base)(struct kvm_vcpu *vcpu, int seg); |
@@ -583,16 +616,12 @@ void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code); | |||
583 | void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, | 616 | void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long cr2, |
584 | u32 error_code); | 617 | u32 error_code); |
585 | 618 | ||
586 | void kvm_pic_set_irq(void *opaque, int irq, int level); | 619 | int kvm_pic_set_irq(void *opaque, int irq, int level); |
587 | 620 | ||
588 | void kvm_inject_nmi(struct kvm_vcpu *vcpu); | 621 | void kvm_inject_nmi(struct kvm_vcpu *vcpu); |
589 | 622 | ||
590 | void fx_init(struct kvm_vcpu *vcpu); | 623 | void fx_init(struct kvm_vcpu *vcpu); |
591 | 624 | ||
592 | int emulator_read_std(unsigned long addr, | ||
593 | void *val, | ||
594 | unsigned int bytes, | ||
595 | struct kvm_vcpu *vcpu); | ||
596 | int emulator_write_emulated(unsigned long addr, | 625 | int emulator_write_emulated(unsigned long addr, |
597 | const void *val, | 626 | const void *val, |
598 | unsigned int bytes, | 627 | unsigned int bytes, |
@@ -737,6 +766,10 @@ enum { | |||
737 | TASK_SWITCH_GATE = 3, | 766 | TASK_SWITCH_GATE = 3, |
738 | }; | 767 | }; |
739 | 768 | ||
769 | #define HF_GIF_MASK (1 << 0) | ||
770 | #define HF_HIF_MASK (1 << 1) | ||
771 | #define HF_VINTR_MASK (1 << 2) | ||
772 | |||
740 | /* | 773 | /* |
741 | * Hardware virtualization extension instructions may fault if a | 774 | * Hardware virtualization extension instructions may fault if a |
742 | * reboot turns off virtualization while processes are running. | 775 | * reboot turns off virtualization while processes are running. |
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 2dbd2314139e..ec41fc16c167 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
@@ -18,11 +18,15 @@ | |||
18 | #define _EFER_LME 8 /* Long mode enable */ | 18 | #define _EFER_LME 8 /* Long mode enable */ |
19 | #define _EFER_LMA 10 /* Long mode active (read-only) */ | 19 | #define _EFER_LMA 10 /* Long mode active (read-only) */ |
20 | #define _EFER_NX 11 /* No execute enable */ | 20 | #define _EFER_NX 11 /* No execute enable */ |
21 | #define _EFER_SVME 12 /* Enable virtualization */ | ||
22 | #define _EFER_FFXSR 14 /* Enable Fast FXSAVE/FXRSTOR */ | ||
21 | 23 | ||
22 | #define EFER_SCE (1<<_EFER_SCE) | 24 | #define EFER_SCE (1<<_EFER_SCE) |
23 | #define EFER_LME (1<<_EFER_LME) | 25 | #define EFER_LME (1<<_EFER_LME) |
24 | #define EFER_LMA (1<<_EFER_LMA) | 26 | #define EFER_LMA (1<<_EFER_LMA) |
25 | #define EFER_NX (1<<_EFER_NX) | 27 | #define EFER_NX (1<<_EFER_NX) |
28 | #define EFER_SVME (1<<_EFER_SVME) | ||
29 | #define EFER_FFXSR (1<<_EFER_FFXSR) | ||
26 | 30 | ||
27 | /* Intel MSRs. Some also available on other CPUs */ | 31 | /* Intel MSRs. Some also available on other CPUs */ |
28 | #define MSR_IA32_PERFCTR0 0x000000c1 | 32 | #define MSR_IA32_PERFCTR0 0x000000c1 |
@@ -365,4 +369,9 @@ | |||
365 | #define MSR_IA32_VMX_PROCBASED_CTLS2 0x0000048b | 369 | #define MSR_IA32_VMX_PROCBASED_CTLS2 0x0000048b |
366 | #define MSR_IA32_VMX_EPT_VPID_CAP 0x0000048c | 370 | #define MSR_IA32_VMX_EPT_VPID_CAP 0x0000048c |
367 | 371 | ||
372 | /* AMD-V MSRs */ | ||
373 | |||
374 | #define MSR_VM_CR 0xc0010114 | ||
375 | #define MSR_VM_HSAVE_PA 0xc0010117 | ||
376 | |||
368 | #endif /* _ASM_X86_MSR_INDEX_H */ | 377 | #endif /* _ASM_X86_MSR_INDEX_H */ |
diff --git a/arch/x86/include/asm/socket.h b/arch/x86/include/asm/socket.h index 8ab9cc8b2ecc..ca8bf2cd0ba9 100644 --- a/arch/x86/include/asm/socket.h +++ b/arch/x86/include/asm/socket.h | |||
@@ -54,4 +54,7 @@ | |||
54 | 54 | ||
55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 |
56 | 56 | ||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
57 | #endif /* _ASM_X86_SOCKET_H */ | 60 | #endif /* _ASM_X86_SOCKET_H */ |
diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 1b8afa78e869..82ada75f3ebf 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h | |||
@@ -174,10 +174,6 @@ struct __attribute__ ((__packed__)) vmcb { | |||
174 | #define SVM_CPUID_FEATURE_SHIFT 2 | 174 | #define SVM_CPUID_FEATURE_SHIFT 2 |
175 | #define SVM_CPUID_FUNC 0x8000000a | 175 | #define SVM_CPUID_FUNC 0x8000000a |
176 | 176 | ||
177 | #define MSR_EFER_SVME_MASK (1ULL << 12) | ||
178 | #define MSR_VM_CR 0xc0010114 | ||
179 | #define MSR_VM_HSAVE_PA 0xc0010117ULL | ||
180 | |||
181 | #define SVM_VM_CR_SVM_DISABLE 4 | 177 | #define SVM_VM_CR_SVM_DISABLE 4 |
182 | 178 | ||
183 | #define SVM_SELECTOR_S_SHIFT 4 | 179 | #define SVM_SELECTOR_S_SHIFT 4 |
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index ffb08be2a530..72a6dcd1299b 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h | |||
@@ -70,8 +70,6 @@ struct old_utsname; | |||
70 | asmlinkage long sys32_olduname(struct oldold_utsname __user *); | 70 | asmlinkage long sys32_olduname(struct oldold_utsname __user *); |
71 | long sys32_uname(struct old_utsname __user *); | 71 | long sys32_uname(struct old_utsname __user *); |
72 | 72 | ||
73 | long sys32_ustat(unsigned, struct ustat32 __user *); | ||
74 | |||
75 | asmlinkage long sys32_execve(char __user *, compat_uptr_t __user *, | 73 | asmlinkage long sys32_execve(char __user *, compat_uptr_t __user *, |
76 | compat_uptr_t __user *, struct pt_regs *); | 74 | compat_uptr_t __user *, struct pt_regs *); |
77 | asmlinkage long sys32_clone(unsigned int, unsigned int, struct pt_regs *); | 75 | asmlinkage long sys32_clone(unsigned int, unsigned int, struct pt_regs *); |
diff --git a/arch/x86/include/asm/virtext.h b/arch/x86/include/asm/virtext.h index 593636275238..e0f9aa16358b 100644 --- a/arch/x86/include/asm/virtext.h +++ b/arch/x86/include/asm/virtext.h | |||
@@ -118,7 +118,7 @@ static inline void cpu_svm_disable(void) | |||
118 | 118 | ||
119 | wrmsrl(MSR_VM_HSAVE_PA, 0); | 119 | wrmsrl(MSR_VM_HSAVE_PA, 0); |
120 | rdmsrl(MSR_EFER, efer); | 120 | rdmsrl(MSR_EFER, efer); |
121 | wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK); | 121 | wrmsrl(MSR_EFER, efer & ~EFER_SVME); |
122 | } | 122 | } |
123 | 123 | ||
124 | /** Makes sure SVM is disabled, if it is supported on the CPU | 124 | /** Makes sure SVM is disabled, if it is supported on the CPU |
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index d0238e6151d8..498f944010b9 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h | |||
@@ -270,8 +270,9 @@ enum vmcs_field { | |||
270 | 270 | ||
271 | #define INTR_TYPE_EXT_INTR (0 << 8) /* external interrupt */ | 271 | #define INTR_TYPE_EXT_INTR (0 << 8) /* external interrupt */ |
272 | #define INTR_TYPE_NMI_INTR (2 << 8) /* NMI */ | 272 | #define INTR_TYPE_NMI_INTR (2 << 8) /* NMI */ |
273 | #define INTR_TYPE_EXCEPTION (3 << 8) /* processor exception */ | 273 | #define INTR_TYPE_HARD_EXCEPTION (3 << 8) /* processor exception */ |
274 | #define INTR_TYPE_SOFT_INTR (4 << 8) /* software interrupt */ | 274 | #define INTR_TYPE_SOFT_INTR (4 << 8) /* software interrupt */ |
275 | #define INTR_TYPE_SOFT_EXCEPTION (6 << 8) /* software exception */ | ||
275 | 276 | ||
276 | /* GUEST_INTERRUPTIBILITY_INFO flags. */ | 277 | /* GUEST_INTERRUPTIBILITY_INFO flags. */ |
277 | #define GUEST_INTR_STATE_STI 0x00000001 | 278 | #define GUEST_INTR_STATE_STI 0x00000001 |
@@ -311,7 +312,7 @@ enum vmcs_field { | |||
311 | #define DEBUG_REG_ACCESS_TYPE 0x10 /* 4, direction of access */ | 312 | #define DEBUG_REG_ACCESS_TYPE 0x10 /* 4, direction of access */ |
312 | #define TYPE_MOV_TO_DR (0 << 4) | 313 | #define TYPE_MOV_TO_DR (0 << 4) |
313 | #define TYPE_MOV_FROM_DR (1 << 4) | 314 | #define TYPE_MOV_FROM_DR (1 << 4) |
314 | #define DEBUG_REG_ACCESS_REG 0xf00 /* 11:8, general purpose reg. */ | 315 | #define DEBUG_REG_ACCESS_REG(eq) (((eq) >> 8) & 0xf) /* 11:8, general purpose reg. */ |
315 | 316 | ||
316 | 317 | ||
317 | /* segment AR */ | 318 | /* segment AR */ |
diff --git a/arch/x86/kernel/cpu/cpufreq/Kconfig b/arch/x86/kernel/cpu/cpufreq/Kconfig index 65792c2cc462..52c839875478 100644 --- a/arch/x86/kernel/cpu/cpufreq/Kconfig +++ b/arch/x86/kernel/cpu/cpufreq/Kconfig | |||
@@ -87,30 +87,15 @@ config X86_POWERNOW_K7_ACPI | |||
87 | config X86_POWERNOW_K8 | 87 | config X86_POWERNOW_K8 |
88 | tristate "AMD Opteron/Athlon64 PowerNow!" | 88 | tristate "AMD Opteron/Athlon64 PowerNow!" |
89 | select CPU_FREQ_TABLE | 89 | select CPU_FREQ_TABLE |
90 | depends on ACPI && ACPI_PROCESSOR | ||
90 | help | 91 | help |
91 | This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors. | 92 | This adds the CPUFreq driver for K8/K10 Opteron/Athlon64 processors. |
92 | 93 | ||
93 | To compile this driver as a module, choose M here: the | 94 | To compile this driver as a module, choose M here: the |
94 | module will be called powernow-k8. | 95 | module will be called powernow-k8. |
95 | 96 | ||
96 | For details, take a look at <file:Documentation/cpu-freq/>. | 97 | For details, take a look at <file:Documentation/cpu-freq/>. |
97 | 98 | ||
98 | If in doubt, say N. | ||
99 | |||
100 | config X86_POWERNOW_K8_ACPI | ||
101 | bool | ||
102 | prompt "ACPI Support" if X86_32 | ||
103 | depends on ACPI && X86_POWERNOW_K8 && ACPI_PROCESSOR | ||
104 | depends on !(X86_POWERNOW_K8 = y && ACPI_PROCESSOR = m) | ||
105 | default y | ||
106 | help | ||
107 | This provides access to the K8s Processor Performance States via ACPI. | ||
108 | This driver is probably required for CPUFreq to work with multi-socket and | ||
109 | SMP systems. It is not required on at least some single-socket yet | ||
110 | multi-core systems, even if SMP is enabled. | ||
111 | |||
112 | It is safe to say Y here. | ||
113 | |||
114 | config X86_GX_SUSPMOD | 99 | config X86_GX_SUSPMOD |
115 | tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation" | 100 | tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation" |
116 | depends on X86_32 && PCI | 101 | depends on X86_32 && PCI |
diff --git a/arch/x86/kernel/cpu/cpufreq/Makefile b/arch/x86/kernel/cpu/cpufreq/Makefile index 560f7760dae5..509296df294d 100644 --- a/arch/x86/kernel/cpu/cpufreq/Makefile +++ b/arch/x86/kernel/cpu/cpufreq/Makefile | |||
@@ -1,6 +1,11 @@ | |||
1 | # Link order matters. K8 is preferred to ACPI because of firmware bugs in early | ||
2 | # K8 systems. ACPI is preferred to all other hardware-specific drivers. | ||
3 | # speedstep-* is preferred over p4-clockmod. | ||
4 | |||
5 | obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o | ||
6 | obj-$(CONFIG_X86_ACPI_CPUFREQ) += acpi-cpufreq.o | ||
1 | obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o | 7 | obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o |
2 | obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o | 8 | obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o |
3 | obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o | ||
4 | obj-$(CONFIG_X86_LONGHAUL) += longhaul.o | 9 | obj-$(CONFIG_X86_LONGHAUL) += longhaul.o |
5 | obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o | 10 | obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o |
6 | obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o | 11 | obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o |
@@ -10,7 +15,6 @@ obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o | |||
10 | obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o | 15 | obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o |
11 | obj-$(CONFIG_X86_SPEEDSTEP_LIB) += speedstep-lib.o | 16 | obj-$(CONFIG_X86_SPEEDSTEP_LIB) += speedstep-lib.o |
12 | obj-$(CONFIG_X86_SPEEDSTEP_SMI) += speedstep-smi.o | 17 | obj-$(CONFIG_X86_SPEEDSTEP_SMI) += speedstep-smi.o |
13 | obj-$(CONFIG_X86_ACPI_CPUFREQ) += acpi-cpufreq.o | ||
14 | obj-$(CONFIG_X86_SPEEDSTEP_CENTRINO) += speedstep-centrino.o | 18 | obj-$(CONFIG_X86_SPEEDSTEP_CENTRINO) += speedstep-centrino.o |
15 | obj-$(CONFIG_X86_P4_CLOCKMOD) += p4-clockmod.o | 19 | obj-$(CONFIG_X86_P4_CLOCKMOD) += p4-clockmod.o |
16 | obj-$(CONFIG_X86_CPUFREQ_NFORCE2) += cpufreq-nforce2.o | 20 | obj-$(CONFIG_X86_CPUFREQ_NFORCE2) += cpufreq-nforce2.o |
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 22590cf688ae..23da96e57b17 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * acpi-cpufreq.c - ACPI Processor P-States Driver ($Revision: 1.4 $) | 2 | * acpi-cpufreq.c - ACPI Processor P-States Driver |
3 | * | 3 | * |
4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> | 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> |
5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
@@ -36,16 +36,18 @@ | |||
36 | #include <linux/ftrace.h> | 36 | #include <linux/ftrace.h> |
37 | 37 | ||
38 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
39 | #include <linux/io.h> | ||
40 | #include <linux/delay.h> | ||
41 | #include <linux/uaccess.h> | ||
42 | |||
39 | #include <acpi/processor.h> | 43 | #include <acpi/processor.h> |
40 | 44 | ||
41 | #include <asm/io.h> | ||
42 | #include <asm/msr.h> | 45 | #include <asm/msr.h> |
43 | #include <asm/processor.h> | 46 | #include <asm/processor.h> |
44 | #include <asm/cpufeature.h> | 47 | #include <asm/cpufeature.h> |
45 | #include <asm/delay.h> | ||
46 | #include <asm/uaccess.h> | ||
47 | 48 | ||
48 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "acpi-cpufreq", msg) | 49 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
50 | "acpi-cpufreq", msg) | ||
49 | 51 | ||
50 | MODULE_AUTHOR("Paul Diefenbaugh, Dominik Brodowski"); | 52 | MODULE_AUTHOR("Paul Diefenbaugh, Dominik Brodowski"); |
51 | MODULE_DESCRIPTION("ACPI Processor P-States Driver"); | 53 | MODULE_DESCRIPTION("ACPI Processor P-States Driver"); |
@@ -95,7 +97,7 @@ static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data) | |||
95 | 97 | ||
96 | perf = data->acpi_data; | 98 | perf = data->acpi_data; |
97 | 99 | ||
98 | for (i=0; i<perf->state_count; i++) { | 100 | for (i = 0; i < perf->state_count; i++) { |
99 | if (value == perf->states[i].status) | 101 | if (value == perf->states[i].status) |
100 | return data->freq_table[i].frequency; | 102 | return data->freq_table[i].frequency; |
101 | } | 103 | } |
@@ -110,7 +112,7 @@ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data) | |||
110 | msr &= INTEL_MSR_RANGE; | 112 | msr &= INTEL_MSR_RANGE; |
111 | perf = data->acpi_data; | 113 | perf = data->acpi_data; |
112 | 114 | ||
113 | for (i=0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) { | 115 | for (i = 0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) { |
114 | if (msr == perf->states[data->freq_table[i].index].status) | 116 | if (msr == perf->states[data->freq_table[i].index].status) |
115 | return data->freq_table[i].frequency; | 117 | return data->freq_table[i].frequency; |
116 | } | 118 | } |
@@ -138,15 +140,13 @@ struct io_addr { | |||
138 | u8 bit_width; | 140 | u8 bit_width; |
139 | }; | 141 | }; |
140 | 142 | ||
141 | typedef union { | ||
142 | struct msr_addr msr; | ||
143 | struct io_addr io; | ||
144 | } drv_addr_union; | ||
145 | |||
146 | struct drv_cmd { | 143 | struct drv_cmd { |
147 | unsigned int type; | 144 | unsigned int type; |
148 | const struct cpumask *mask; | 145 | const struct cpumask *mask; |
149 | drv_addr_union addr; | 146 | union { |
147 | struct msr_addr msr; | ||
148 | struct io_addr io; | ||
149 | } addr; | ||
150 | u32 val; | 150 | u32 val; |
151 | }; | 151 | }; |
152 | 152 | ||
@@ -369,7 +369,7 @@ static unsigned int check_freqs(const struct cpumask *mask, unsigned int freq, | |||
369 | unsigned int cur_freq; | 369 | unsigned int cur_freq; |
370 | unsigned int i; | 370 | unsigned int i; |
371 | 371 | ||
372 | for (i=0; i<100; i++) { | 372 | for (i = 0; i < 100; i++) { |
373 | cur_freq = extract_freq(get_cur_val(mask), data); | 373 | cur_freq = extract_freq(get_cur_val(mask), data); |
374 | if (cur_freq == freq) | 374 | if (cur_freq == freq) |
375 | return 1; | 375 | return 1; |
@@ -494,7 +494,7 @@ acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu) | |||
494 | unsigned long freq; | 494 | unsigned long freq; |
495 | unsigned long freqn = perf->states[0].core_frequency * 1000; | 495 | unsigned long freqn = perf->states[0].core_frequency * 1000; |
496 | 496 | ||
497 | for (i=0; i<(perf->state_count-1); i++) { | 497 | for (i = 0; i < (perf->state_count-1); i++) { |
498 | freq = freqn; | 498 | freq = freqn; |
499 | freqn = perf->states[i+1].core_frequency * 1000; | 499 | freqn = perf->states[i+1].core_frequency * 1000; |
500 | if ((2 * cpu_khz) > (freqn + freq)) { | 500 | if ((2 * cpu_khz) > (freqn + freq)) { |
@@ -673,7 +673,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
673 | 673 | ||
674 | /* detect transition latency */ | 674 | /* detect transition latency */ |
675 | policy->cpuinfo.transition_latency = 0; | 675 | policy->cpuinfo.transition_latency = 0; |
676 | for (i=0; i<perf->state_count; i++) { | 676 | for (i = 0; i < perf->state_count; i++) { |
677 | if ((perf->states[i].transition_latency * 1000) > | 677 | if ((perf->states[i].transition_latency * 1000) > |
678 | policy->cpuinfo.transition_latency) | 678 | policy->cpuinfo.transition_latency) |
679 | policy->cpuinfo.transition_latency = | 679 | policy->cpuinfo.transition_latency = |
@@ -682,8 +682,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
682 | 682 | ||
683 | data->max_freq = perf->states[0].core_frequency * 1000; | 683 | data->max_freq = perf->states[0].core_frequency * 1000; |
684 | /* table init */ | 684 | /* table init */ |
685 | for (i=0; i<perf->state_count; i++) { | 685 | for (i = 0; i < perf->state_count; i++) { |
686 | if (i>0 && perf->states[i].core_frequency >= | 686 | if (i > 0 && perf->states[i].core_frequency >= |
687 | data->freq_table[valid_states-1].frequency / 1000) | 687 | data->freq_table[valid_states-1].frequency / 1000) |
688 | continue; | 688 | continue; |
689 | 689 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/cpufreq-nforce2.c b/arch/x86/kernel/cpu/cpufreq/cpufreq-nforce2.c index 965ea52767ac..733093d60436 100644 --- a/arch/x86/kernel/cpu/cpufreq/cpufreq-nforce2.c +++ b/arch/x86/kernel/cpu/cpufreq/cpufreq-nforce2.c | |||
@@ -32,7 +32,7 @@ | |||
32 | * nforce2_chipset: | 32 | * nforce2_chipset: |
33 | * FSB is changed using the chipset | 33 | * FSB is changed using the chipset |
34 | */ | 34 | */ |
35 | static struct pci_dev *nforce2_chipset_dev; | 35 | static struct pci_dev *nforce2_dev; |
36 | 36 | ||
37 | /* fid: | 37 | /* fid: |
38 | * multiplier * 10 | 38 | * multiplier * 10 |
@@ -56,7 +56,9 @@ MODULE_PARM_DESC(fid, "CPU multiplier to use (11.5 = 115)"); | |||
56 | MODULE_PARM_DESC(min_fsb, | 56 | MODULE_PARM_DESC(min_fsb, |
57 | "Minimum FSB to use, if not defined: current FSB - 50"); | 57 | "Minimum FSB to use, if not defined: current FSB - 50"); |
58 | 58 | ||
59 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "cpufreq-nforce2", msg) | 59 | #define PFX "cpufreq-nforce2: " |
60 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ | ||
61 | "cpufreq-nforce2", msg) | ||
60 | 62 | ||
61 | /** | 63 | /** |
62 | * nforce2_calc_fsb - calculate FSB | 64 | * nforce2_calc_fsb - calculate FSB |
@@ -118,11 +120,11 @@ static void nforce2_write_pll(int pll) | |||
118 | int temp; | 120 | int temp; |
119 | 121 | ||
120 | /* Set the pll addr. to 0x00 */ | 122 | /* Set the pll addr. to 0x00 */ |
121 | pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLADR, 0); | 123 | pci_write_config_dword(nforce2_dev, NFORCE2_PLLADR, 0); |
122 | 124 | ||
123 | /* Now write the value in all 64 registers */ | 125 | /* Now write the value in all 64 registers */ |
124 | for (temp = 0; temp <= 0x3f; temp++) | 126 | for (temp = 0; temp <= 0x3f; temp++) |
125 | pci_write_config_dword(nforce2_chipset_dev, NFORCE2_PLLREG, pll); | 127 | pci_write_config_dword(nforce2_dev, NFORCE2_PLLREG, pll); |
126 | 128 | ||
127 | return; | 129 | return; |
128 | } | 130 | } |
@@ -139,8 +141,8 @@ static unsigned int nforce2_fsb_read(int bootfsb) | |||
139 | u32 fsb, temp = 0; | 141 | u32 fsb, temp = 0; |
140 | 142 | ||
141 | /* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */ | 143 | /* Get chipset boot FSB from subdevice 5 (FSB at boot-time) */ |
142 | nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, | 144 | nforce2_sub5 = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, 0x01EF, |
143 | 0x01EF, PCI_ANY_ID, PCI_ANY_ID, NULL); | 145 | PCI_ANY_ID, PCI_ANY_ID, NULL); |
144 | if (!nforce2_sub5) | 146 | if (!nforce2_sub5) |
145 | return 0; | 147 | return 0; |
146 | 148 | ||
@@ -148,13 +150,13 @@ static unsigned int nforce2_fsb_read(int bootfsb) | |||
148 | fsb /= 1000000; | 150 | fsb /= 1000000; |
149 | 151 | ||
150 | /* Check if PLL register is already set */ | 152 | /* Check if PLL register is already set */ |
151 | pci_read_config_byte(nforce2_chipset_dev, NFORCE2_PLLENABLE, (u8 *)&temp); | 153 | pci_read_config_byte(nforce2_dev, NFORCE2_PLLENABLE, (u8 *)&temp); |
152 | 154 | ||
153 | if (bootfsb || !temp) | 155 | if (bootfsb || !temp) |
154 | return fsb; | 156 | return fsb; |
155 | 157 | ||
156 | /* Use PLL register FSB value */ | 158 | /* Use PLL register FSB value */ |
157 | pci_read_config_dword(nforce2_chipset_dev, NFORCE2_PLLREG, &temp); | 159 | pci_read_config_dword(nforce2_dev, NFORCE2_PLLREG, &temp); |
158 | fsb = nforce2_calc_fsb(temp); | 160 | fsb = nforce2_calc_fsb(temp); |
159 | 161 | ||
160 | return fsb; | 162 | return fsb; |
@@ -174,18 +176,18 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
174 | int pll = 0; | 176 | int pll = 0; |
175 | 177 | ||
176 | if ((fsb > max_fsb) || (fsb < NFORCE2_MIN_FSB)) { | 178 | if ((fsb > max_fsb) || (fsb < NFORCE2_MIN_FSB)) { |
177 | printk(KERN_ERR "cpufreq: FSB %d is out of range!\n", fsb); | 179 | printk(KERN_ERR PFX "FSB %d is out of range!\n", fsb); |
178 | return -EINVAL; | 180 | return -EINVAL; |
179 | } | 181 | } |
180 | 182 | ||
181 | tfsb = nforce2_fsb_read(0); | 183 | tfsb = nforce2_fsb_read(0); |
182 | if (!tfsb) { | 184 | if (!tfsb) { |
183 | printk(KERN_ERR "cpufreq: Error while reading the FSB\n"); | 185 | printk(KERN_ERR PFX "Error while reading the FSB\n"); |
184 | return -EINVAL; | 186 | return -EINVAL; |
185 | } | 187 | } |
186 | 188 | ||
187 | /* First write? Then set actual value */ | 189 | /* First write? Then set actual value */ |
188 | pci_read_config_byte(nforce2_chipset_dev, NFORCE2_PLLENABLE, (u8 *)&temp); | 190 | pci_read_config_byte(nforce2_dev, NFORCE2_PLLENABLE, (u8 *)&temp); |
189 | if (!temp) { | 191 | if (!temp) { |
190 | pll = nforce2_calc_pll(tfsb); | 192 | pll = nforce2_calc_pll(tfsb); |
191 | 193 | ||
@@ -197,7 +199,7 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
197 | 199 | ||
198 | /* Enable write access */ | 200 | /* Enable write access */ |
199 | temp = 0x01; | 201 | temp = 0x01; |
200 | pci_write_config_byte(nforce2_chipset_dev, NFORCE2_PLLENABLE, (u8)temp); | 202 | pci_write_config_byte(nforce2_dev, NFORCE2_PLLENABLE, (u8)temp); |
201 | 203 | ||
202 | diff = tfsb - fsb; | 204 | diff = tfsb - fsb; |
203 | 205 | ||
@@ -222,7 +224,7 @@ static int nforce2_set_fsb(unsigned int fsb) | |||
222 | } | 224 | } |
223 | 225 | ||
224 | temp = 0x40; | 226 | temp = 0x40; |
225 | pci_write_config_byte(nforce2_chipset_dev, NFORCE2_PLLADR, (u8)temp); | 227 | pci_write_config_byte(nforce2_dev, NFORCE2_PLLADR, (u8)temp); |
226 | 228 | ||
227 | return 0; | 229 | return 0; |
228 | } | 230 | } |
@@ -244,7 +246,8 @@ static unsigned int nforce2_get(unsigned int cpu) | |||
244 | * nforce2_target - set a new CPUFreq policy | 246 | * nforce2_target - set a new CPUFreq policy |
245 | * @policy: new policy | 247 | * @policy: new policy |
246 | * @target_freq: the target frequency | 248 | * @target_freq: the target frequency |
247 | * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | 249 | * @relation: how that frequency relates to achieved frequency |
250 | * (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | ||
248 | * | 251 | * |
249 | * Sets a new CPUFreq policy. | 252 | * Sets a new CPUFreq policy. |
250 | */ | 253 | */ |
@@ -276,7 +279,7 @@ static int nforce2_target(struct cpufreq_policy *policy, | |||
276 | /* local_irq_save(flags); */ | 279 | /* local_irq_save(flags); */ |
277 | 280 | ||
278 | if (nforce2_set_fsb(target_fsb) < 0) | 281 | if (nforce2_set_fsb(target_fsb) < 0) |
279 | printk(KERN_ERR "cpufreq: Changing FSB to %d failed\n", | 282 | printk(KERN_ERR PFX "Changing FSB to %d failed\n", |
280 | target_fsb); | 283 | target_fsb); |
281 | else | 284 | else |
282 | dprintk("Changed FSB successfully to %d\n", | 285 | dprintk("Changed FSB successfully to %d\n", |
@@ -327,8 +330,8 @@ static int nforce2_cpu_init(struct cpufreq_policy *policy) | |||
327 | /* FIX: Get FID from CPU */ | 330 | /* FIX: Get FID from CPU */ |
328 | if (!fid) { | 331 | if (!fid) { |
329 | if (!cpu_khz) { | 332 | if (!cpu_khz) { |
330 | printk(KERN_WARNING | 333 | printk(KERN_WARNING PFX |
331 | "cpufreq: cpu_khz not set, can't calculate multiplier!\n"); | 334 | "cpu_khz not set, can't calculate multiplier!\n"); |
332 | return -ENODEV; | 335 | return -ENODEV; |
333 | } | 336 | } |
334 | 337 | ||
@@ -343,7 +346,7 @@ static int nforce2_cpu_init(struct cpufreq_policy *policy) | |||
343 | } | 346 | } |
344 | } | 347 | } |
345 | 348 | ||
346 | printk(KERN_INFO "cpufreq: FSB currently at %i MHz, FID %d.%d\n", fsb, | 349 | printk(KERN_INFO PFX "FSB currently at %i MHz, FID %d.%d\n", fsb, |
347 | fid / 10, fid % 10); | 350 | fid / 10, fid % 10); |
348 | 351 | ||
349 | /* Set maximum FSB to FSB at boot time */ | 352 | /* Set maximum FSB to FSB at boot time */ |
@@ -392,17 +395,18 @@ static struct cpufreq_driver nforce2_driver = { | |||
392 | */ | 395 | */ |
393 | static unsigned int nforce2_detect_chipset(void) | 396 | static unsigned int nforce2_detect_chipset(void) |
394 | { | 397 | { |
395 | nforce2_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, | 398 | nforce2_dev = pci_get_subsys(PCI_VENDOR_ID_NVIDIA, |
396 | PCI_DEVICE_ID_NVIDIA_NFORCE2, | 399 | PCI_DEVICE_ID_NVIDIA_NFORCE2, |
397 | PCI_ANY_ID, PCI_ANY_ID, NULL); | 400 | PCI_ANY_ID, PCI_ANY_ID, NULL); |
398 | 401 | ||
399 | if (nforce2_chipset_dev == NULL) | 402 | if (nforce2_dev == NULL) |
400 | return -ENODEV; | 403 | return -ENODEV; |
401 | 404 | ||
402 | printk(KERN_INFO "cpufreq: Detected nForce2 chipset revision %X\n", | 405 | printk(KERN_INFO PFX "Detected nForce2 chipset revision %X\n", |
403 | nforce2_chipset_dev->revision); | 406 | nforce2_dev->revision); |
404 | printk(KERN_INFO | 407 | printk(KERN_INFO PFX |
405 | "cpufreq: FSB changing is maybe unstable and can lead to crashes and data loss.\n"); | 408 | "FSB changing is maybe unstable and can lead to " |
409 | "crashes and data loss.\n"); | ||
406 | 410 | ||
407 | return 0; | 411 | return 0; |
408 | } | 412 | } |
@@ -420,7 +424,7 @@ static int __init nforce2_init(void) | |||
420 | 424 | ||
421 | /* detect chipset */ | 425 | /* detect chipset */ |
422 | if (nforce2_detect_chipset()) { | 426 | if (nforce2_detect_chipset()) { |
423 | printk(KERN_ERR "cpufreq: No nForce2 chipset.\n"); | 427 | printk(KERN_INFO PFX "No nForce2 chipset.\n"); |
424 | return -ENODEV; | 428 | return -ENODEV; |
425 | } | 429 | } |
426 | 430 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c index 41ab3f064cb1..35a257dd4bb7 100644 --- a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c +++ b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c | |||
@@ -12,12 +12,12 @@ | |||
12 | #include <linux/cpufreq.h> | 12 | #include <linux/cpufreq.h> |
13 | #include <linux/ioport.h> | 13 | #include <linux/ioport.h> |
14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
15 | #include <linux/timex.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/delay.h> | ||
15 | 18 | ||
16 | #include <asm/msr.h> | 19 | #include <asm/msr.h> |
17 | #include <asm/tsc.h> | 20 | #include <asm/tsc.h> |
18 | #include <asm/timex.h> | ||
19 | #include <asm/io.h> | ||
20 | #include <asm/delay.h> | ||
21 | 21 | ||
22 | #define EPS_BRAND_C7M 0 | 22 | #define EPS_BRAND_C7M 0 |
23 | #define EPS_BRAND_C7 1 | 23 | #define EPS_BRAND_C7 1 |
@@ -184,7 +184,7 @@ static int eps_cpu_init(struct cpufreq_policy *policy) | |||
184 | break; | 184 | break; |
185 | } | 185 | } |
186 | 186 | ||
187 | switch(brand) { | 187 | switch (brand) { |
188 | case EPS_BRAND_C7M: | 188 | case EPS_BRAND_C7M: |
189 | printk(KERN_CONT "C7-M\n"); | 189 | printk(KERN_CONT "C7-M\n"); |
190 | break; | 190 | break; |
@@ -218,17 +218,20 @@ static int eps_cpu_init(struct cpufreq_policy *policy) | |||
218 | /* Print voltage and multiplier */ | 218 | /* Print voltage and multiplier */ |
219 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); | 219 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); |
220 | current_voltage = lo & 0xff; | 220 | current_voltage = lo & 0xff; |
221 | printk(KERN_INFO "eps: Current voltage = %dmV\n", current_voltage * 16 + 700); | 221 | printk(KERN_INFO "eps: Current voltage = %dmV\n", |
222 | current_voltage * 16 + 700); | ||
222 | current_multiplier = (lo >> 8) & 0xff; | 223 | current_multiplier = (lo >> 8) & 0xff; |
223 | printk(KERN_INFO "eps: Current multiplier = %d\n", current_multiplier); | 224 | printk(KERN_INFO "eps: Current multiplier = %d\n", current_multiplier); |
224 | 225 | ||
225 | /* Print limits */ | 226 | /* Print limits */ |
226 | max_voltage = hi & 0xff; | 227 | max_voltage = hi & 0xff; |
227 | printk(KERN_INFO "eps: Highest voltage = %dmV\n", max_voltage * 16 + 700); | 228 | printk(KERN_INFO "eps: Highest voltage = %dmV\n", |
229 | max_voltage * 16 + 700); | ||
228 | max_multiplier = (hi >> 8) & 0xff; | 230 | max_multiplier = (hi >> 8) & 0xff; |
229 | printk(KERN_INFO "eps: Highest multiplier = %d\n", max_multiplier); | 231 | printk(KERN_INFO "eps: Highest multiplier = %d\n", max_multiplier); |
230 | min_voltage = (hi >> 16) & 0xff; | 232 | min_voltage = (hi >> 16) & 0xff; |
231 | printk(KERN_INFO "eps: Lowest voltage = %dmV\n", min_voltage * 16 + 700); | 233 | printk(KERN_INFO "eps: Lowest voltage = %dmV\n", |
234 | min_voltage * 16 + 700); | ||
232 | min_multiplier = (hi >> 24) & 0xff; | 235 | min_multiplier = (hi >> 24) & 0xff; |
233 | printk(KERN_INFO "eps: Lowest multiplier = %d\n", min_multiplier); | 236 | printk(KERN_INFO "eps: Lowest multiplier = %d\n", min_multiplier); |
234 | 237 | ||
@@ -318,7 +321,7 @@ static int eps_cpu_exit(struct cpufreq_policy *policy) | |||
318 | return 0; | 321 | return 0; |
319 | } | 322 | } |
320 | 323 | ||
321 | static struct freq_attr* eps_attr[] = { | 324 | static struct freq_attr *eps_attr[] = { |
322 | &cpufreq_freq_attr_scaling_available_freqs, | 325 | &cpufreq_freq_attr_scaling_available_freqs, |
323 | NULL, | 326 | NULL, |
324 | }; | 327 | }; |
@@ -356,7 +359,7 @@ static void __exit eps_exit(void) | |||
356 | cpufreq_unregister_driver(&eps_driver); | 359 | cpufreq_unregister_driver(&eps_driver); |
357 | } | 360 | } |
358 | 361 | ||
359 | MODULE_AUTHOR("Rafa³ Bilski <rafalbilski@interia.pl>"); | 362 | MODULE_AUTHOR("Rafal Bilski <rafalbilski@interia.pl>"); |
360 | MODULE_DESCRIPTION("Enhanced PowerSaver driver for VIA C7 CPU's."); | 363 | MODULE_DESCRIPTION("Enhanced PowerSaver driver for VIA C7 CPU's."); |
361 | MODULE_LICENSE("GPL"); | 364 | MODULE_LICENSE("GPL"); |
362 | 365 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/elanfreq.c b/arch/x86/kernel/cpu/cpufreq/elanfreq.c index fe613c93b366..006b278b0d5d 100644 --- a/arch/x86/kernel/cpu/cpufreq/elanfreq.c +++ b/arch/x86/kernel/cpu/cpufreq/elanfreq.c | |||
@@ -184,7 +184,8 @@ static int elanfreq_target(struct cpufreq_policy *policy, | |||
184 | { | 184 | { |
185 | unsigned int newstate = 0; | 185 | unsigned int newstate = 0; |
186 | 186 | ||
187 | if (cpufreq_frequency_table_target(policy, &elanfreq_table[0], target_freq, relation, &newstate)) | 187 | if (cpufreq_frequency_table_target(policy, &elanfreq_table[0], |
188 | target_freq, relation, &newstate)) | ||
188 | return -EINVAL; | 189 | return -EINVAL; |
189 | 190 | ||
190 | elanfreq_set_cpu_state(newstate); | 191 | elanfreq_set_cpu_state(newstate); |
@@ -301,7 +302,8 @@ static void __exit elanfreq_exit(void) | |||
301 | module_param(max_freq, int, 0444); | 302 | module_param(max_freq, int, 0444); |
302 | 303 | ||
303 | MODULE_LICENSE("GPL"); | 304 | MODULE_LICENSE("GPL"); |
304 | MODULE_AUTHOR("Robert Schwebel <r.schwebel@pengutronix.de>, Sven Geggus <sven@geggus.net>"); | 305 | MODULE_AUTHOR("Robert Schwebel <r.schwebel@pengutronix.de>, " |
306 | "Sven Geggus <sven@geggus.net>"); | ||
305 | MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs"); | 307 | MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs"); |
306 | 308 | ||
307 | module_init(elanfreq_init); | 309 | module_init(elanfreq_init); |
diff --git a/arch/x86/kernel/cpu/cpufreq/gx-suspmod.c b/arch/x86/kernel/cpu/cpufreq/gx-suspmod.c index 9d9eae82e60f..ac27ec2264d5 100644 --- a/arch/x86/kernel/cpu/cpufreq/gx-suspmod.c +++ b/arch/x86/kernel/cpu/cpufreq/gx-suspmod.c | |||
@@ -79,8 +79,9 @@ | |||
79 | #include <linux/smp.h> | 79 | #include <linux/smp.h> |
80 | #include <linux/cpufreq.h> | 80 | #include <linux/cpufreq.h> |
81 | #include <linux/pci.h> | 81 | #include <linux/pci.h> |
82 | #include <linux/errno.h> | ||
83 | |||
82 | #include <asm/processor-cyrix.h> | 84 | #include <asm/processor-cyrix.h> |
83 | #include <asm/errno.h> | ||
84 | 85 | ||
85 | /* PCI config registers, all at F0 */ | 86 | /* PCI config registers, all at F0 */ |
86 | #define PCI_PMER1 0x80 /* power management enable register 1 */ | 87 | #define PCI_PMER1 0x80 /* power management enable register 1 */ |
@@ -122,8 +123,8 @@ static struct gxfreq_params *gx_params; | |||
122 | static int stock_freq; | 123 | static int stock_freq; |
123 | 124 | ||
124 | /* PCI bus clock - defaults to 30.000 if cpu_khz is not available */ | 125 | /* PCI bus clock - defaults to 30.000 if cpu_khz is not available */ |
125 | static int pci_busclk = 0; | 126 | static int pci_busclk; |
126 | module_param (pci_busclk, int, 0444); | 127 | module_param(pci_busclk, int, 0444); |
127 | 128 | ||
128 | /* maximum duration for which the cpu may be suspended | 129 | /* maximum duration for which the cpu may be suspended |
129 | * (32us * MAX_DURATION). If no parameter is given, this defaults | 130 | * (32us * MAX_DURATION). If no parameter is given, this defaults |
@@ -132,7 +133,7 @@ module_param (pci_busclk, int, 0444); | |||
132 | * is suspended -- processing power is just 0.39% of what it used to be, | 133 | * is suspended -- processing power is just 0.39% of what it used to be, |
133 | * though. 781.25 kHz(!) for a 200 MHz processor -- wow. */ | 134 | * though. 781.25 kHz(!) for a 200 MHz processor -- wow. */ |
134 | static int max_duration = 255; | 135 | static int max_duration = 255; |
135 | module_param (max_duration, int, 0444); | 136 | module_param(max_duration, int, 0444); |
136 | 137 | ||
137 | /* For the default policy, we want at least some processing power | 138 | /* For the default policy, we want at least some processing power |
138 | * - let's say 5%. (min = maxfreq / POLICY_MIN_DIV) | 139 | * - let's say 5%. (min = maxfreq / POLICY_MIN_DIV) |
@@ -140,7 +141,8 @@ module_param (max_duration, int, 0444); | |||
140 | #define POLICY_MIN_DIV 20 | 141 | #define POLICY_MIN_DIV 20 |
141 | 142 | ||
142 | 143 | ||
143 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "gx-suspmod", msg) | 144 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
145 | "gx-suspmod", msg) | ||
144 | 146 | ||
145 | /** | 147 | /** |
146 | * we can detect a core multipiler from dir0_lsb | 148 | * we can detect a core multipiler from dir0_lsb |
@@ -166,12 +168,20 @@ static int gx_freq_mult[16] = { | |||
166 | * Low Level chipset interface * | 168 | * Low Level chipset interface * |
167 | ****************************************************************/ | 169 | ****************************************************************/ |
168 | static struct pci_device_id gx_chipset_tbl[] __initdata = { | 170 | static struct pci_device_id gx_chipset_tbl[] __initdata = { |
169 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, PCI_ANY_ID, PCI_ANY_ID }, | 171 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, |
170 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, PCI_ANY_ID, PCI_ANY_ID }, | 172 | PCI_ANY_ID, PCI_ANY_ID }, |
171 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, PCI_ANY_ID, PCI_ANY_ID }, | 173 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, |
174 | PCI_ANY_ID, PCI_ANY_ID }, | ||
175 | { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, | ||
176 | PCI_ANY_ID, PCI_ANY_ID }, | ||
172 | { 0, }, | 177 | { 0, }, |
173 | }; | 178 | }; |
174 | 179 | ||
180 | static void gx_write_byte(int reg, int value) | ||
181 | { | ||
182 | pci_write_config_byte(gx_params->cs55x0, reg, value); | ||
183 | } | ||
184 | |||
175 | /** | 185 | /** |
176 | * gx_detect_chipset: | 186 | * gx_detect_chipset: |
177 | * | 187 | * |
@@ -200,7 +210,8 @@ static __init struct pci_dev *gx_detect_chipset(void) | |||
200 | /** | 210 | /** |
201 | * gx_get_cpuspeed: | 211 | * gx_get_cpuspeed: |
202 | * | 212 | * |
203 | * Finds out at which efficient frequency the Cyrix MediaGX/NatSemi Geode CPU runs. | 213 | * Finds out at which efficient frequency the Cyrix MediaGX/NatSemi |
214 | * Geode CPU runs. | ||
204 | */ | 215 | */ |
205 | static unsigned int gx_get_cpuspeed(unsigned int cpu) | 216 | static unsigned int gx_get_cpuspeed(unsigned int cpu) |
206 | { | 217 | { |
@@ -217,17 +228,18 @@ static unsigned int gx_get_cpuspeed(unsigned int cpu) | |||
217 | * | 228 | * |
218 | **/ | 229 | **/ |
219 | 230 | ||
220 | static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, u8 *off_duration) | 231 | static unsigned int gx_validate_speed(unsigned int khz, u8 *on_duration, |
232 | u8 *off_duration) | ||
221 | { | 233 | { |
222 | unsigned int i; | 234 | unsigned int i; |
223 | u8 tmp_on, tmp_off; | 235 | u8 tmp_on, tmp_off; |
224 | int old_tmp_freq = stock_freq; | 236 | int old_tmp_freq = stock_freq; |
225 | int tmp_freq; | 237 | int tmp_freq; |
226 | 238 | ||
227 | *off_duration=1; | 239 | *off_duration = 1; |
228 | *on_duration=0; | 240 | *on_duration = 0; |
229 | 241 | ||
230 | for (i=max_duration; i>0; i--) { | 242 | for (i = max_duration; i > 0; i--) { |
231 | tmp_off = ((khz * i) / stock_freq) & 0xff; | 243 | tmp_off = ((khz * i) / stock_freq) & 0xff; |
232 | tmp_on = i - tmp_off; | 244 | tmp_on = i - tmp_off; |
233 | tmp_freq = (stock_freq * tmp_off) / i; | 245 | tmp_freq = (stock_freq * tmp_off) / i; |
@@ -259,26 +271,34 @@ static void gx_set_cpuspeed(unsigned int khz) | |||
259 | freqs.cpu = 0; | 271 | freqs.cpu = 0; |
260 | freqs.old = gx_get_cpuspeed(0); | 272 | freqs.old = gx_get_cpuspeed(0); |
261 | 273 | ||
262 | new_khz = gx_validate_speed(khz, &gx_params->on_duration, &gx_params->off_duration); | 274 | new_khz = gx_validate_speed(khz, &gx_params->on_duration, |
275 | &gx_params->off_duration); | ||
263 | 276 | ||
264 | freqs.new = new_khz; | 277 | freqs.new = new_khz; |
265 | 278 | ||
266 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 279 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
267 | local_irq_save(flags); | 280 | local_irq_save(flags); |
268 | 281 | ||
269 | if (new_khz != stock_freq) { /* if new khz == 100% of CPU speed, it is special case */ | 282 | |
283 | |||
284 | if (new_khz != stock_freq) { | ||
285 | /* if new khz == 100% of CPU speed, it is special case */ | ||
270 | switch (gx_params->cs55x0->device) { | 286 | switch (gx_params->cs55x0->device) { |
271 | case PCI_DEVICE_ID_CYRIX_5530_LEGACY: | 287 | case PCI_DEVICE_ID_CYRIX_5530_LEGACY: |
272 | pmer1 = gx_params->pci_pmer1 | IRQ_SPDUP | VID_SPDUP; | 288 | pmer1 = gx_params->pci_pmer1 | IRQ_SPDUP | VID_SPDUP; |
273 | /* FIXME: need to test other values -- Zwane,Miura */ | 289 | /* FIXME: need to test other values -- Zwane,Miura */ |
274 | pci_write_config_byte(gx_params->cs55x0, PCI_IRQTC, 4); /* typical 2 to 4ms */ | 290 | /* typical 2 to 4ms */ |
275 | pci_write_config_byte(gx_params->cs55x0, PCI_VIDTC, 100);/* typical 50 to 100ms */ | 291 | gx_write_byte(PCI_IRQTC, 4); |
276 | pci_write_config_byte(gx_params->cs55x0, PCI_PMER1, pmer1); | 292 | /* typical 50 to 100ms */ |
277 | 293 | gx_write_byte(PCI_VIDTC, 100); | |
278 | if (gx_params->cs55x0->revision < 0x10) { /* CS5530(rev 1.2, 1.3) */ | 294 | gx_write_byte(PCI_PMER1, pmer1); |
279 | suscfg = gx_params->pci_suscfg | SUSMOD; | 295 | |
280 | } else { /* CS5530A,B.. */ | 296 | if (gx_params->cs55x0->revision < 0x10) { |
281 | suscfg = gx_params->pci_suscfg | SUSMOD | PWRSVE; | 297 | /* CS5530(rev 1.2, 1.3) */ |
298 | suscfg = gx_params->pci_suscfg|SUSMOD; | ||
299 | } else { | ||
300 | /* CS5530A,B.. */ | ||
301 | suscfg = gx_params->pci_suscfg|SUSMOD|PWRSVE; | ||
282 | } | 302 | } |
283 | break; | 303 | break; |
284 | case PCI_DEVICE_ID_CYRIX_5520: | 304 | case PCI_DEVICE_ID_CYRIX_5520: |
@@ -294,13 +314,13 @@ static void gx_set_cpuspeed(unsigned int khz) | |||
294 | suscfg = gx_params->pci_suscfg & ~(SUSMOD); | 314 | suscfg = gx_params->pci_suscfg & ~(SUSMOD); |
295 | gx_params->off_duration = 0; | 315 | gx_params->off_duration = 0; |
296 | gx_params->on_duration = 0; | 316 | gx_params->on_duration = 0; |
297 | dprintk("suspend modulation disabled: cpu runs 100 percent speed.\n"); | 317 | dprintk("suspend modulation disabled: cpu runs 100%% speed.\n"); |
298 | } | 318 | } |
299 | 319 | ||
300 | pci_write_config_byte(gx_params->cs55x0, PCI_MODOFF, gx_params->off_duration); | 320 | gx_write_byte(PCI_MODOFF, gx_params->off_duration); |
301 | pci_write_config_byte(gx_params->cs55x0, PCI_MODON, gx_params->on_duration); | 321 | gx_write_byte(PCI_MODON, gx_params->on_duration); |
302 | 322 | ||
303 | pci_write_config_byte(gx_params->cs55x0, PCI_SUSCFG, suscfg); | 323 | gx_write_byte(PCI_SUSCFG, suscfg); |
304 | pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &suscfg); | 324 | pci_read_config_byte(gx_params->cs55x0, PCI_SUSCFG, &suscfg); |
305 | 325 | ||
306 | local_irq_restore(flags); | 326 | local_irq_restore(flags); |
@@ -334,7 +354,8 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) | |||
334 | return -EINVAL; | 354 | return -EINVAL; |
335 | 355 | ||
336 | policy->cpu = 0; | 356 | policy->cpu = 0; |
337 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); | 357 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), |
358 | stock_freq); | ||
338 | 359 | ||
339 | /* it needs to be assured that at least one supported frequency is | 360 | /* it needs to be assured that at least one supported frequency is |
340 | * within policy->min and policy->max. If it is not, policy->max | 361 | * within policy->min and policy->max. If it is not, policy->max |
@@ -354,7 +375,8 @@ static int cpufreq_gx_verify(struct cpufreq_policy *policy) | |||
354 | policy->max = tmp_freq; | 375 | policy->max = tmp_freq; |
355 | if (policy->max < policy->min) | 376 | if (policy->max < policy->min) |
356 | policy->max = policy->min; | 377 | policy->max = policy->min; |
357 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), stock_freq); | 378 | cpufreq_verify_within_limits(policy, (stock_freq / max_duration), |
379 | stock_freq); | ||
358 | 380 | ||
359 | return 0; | 381 | return 0; |
360 | } | 382 | } |
@@ -398,18 +420,18 @@ static int cpufreq_gx_cpu_init(struct cpufreq_policy *policy) | |||
398 | return -ENODEV; | 420 | return -ENODEV; |
399 | 421 | ||
400 | /* determine maximum frequency */ | 422 | /* determine maximum frequency */ |
401 | if (pci_busclk) { | 423 | if (pci_busclk) |
402 | maxfreq = pci_busclk * gx_freq_mult[getCx86(CX86_DIR1) & 0x0f]; | 424 | maxfreq = pci_busclk * gx_freq_mult[getCx86(CX86_DIR1) & 0x0f]; |
403 | } else if (cpu_khz) { | 425 | else if (cpu_khz) |
404 | maxfreq = cpu_khz; | 426 | maxfreq = cpu_khz; |
405 | } else { | 427 | else |
406 | maxfreq = 30000 * gx_freq_mult[getCx86(CX86_DIR1) & 0x0f]; | 428 | maxfreq = 30000 * gx_freq_mult[getCx86(CX86_DIR1) & 0x0f]; |
407 | } | 429 | |
408 | stock_freq = maxfreq; | 430 | stock_freq = maxfreq; |
409 | curfreq = gx_get_cpuspeed(0); | 431 | curfreq = gx_get_cpuspeed(0); |
410 | 432 | ||
411 | dprintk("cpu max frequency is %d.\n", maxfreq); | 433 | dprintk("cpu max frequency is %d.\n", maxfreq); |
412 | dprintk("cpu current frequency is %dkHz.\n",curfreq); | 434 | dprintk("cpu current frequency is %dkHz.\n", curfreq); |
413 | 435 | ||
414 | /* setup basic struct for cpufreq API */ | 436 | /* setup basic struct for cpufreq API */ |
415 | policy->cpu = 0; | 437 | policy->cpu = 0; |
@@ -447,7 +469,8 @@ static int __init cpufreq_gx_init(void) | |||
447 | struct pci_dev *gx_pci; | 469 | struct pci_dev *gx_pci; |
448 | 470 | ||
449 | /* Test if we have the right hardware */ | 471 | /* Test if we have the right hardware */ |
450 | if ((gx_pci = gx_detect_chipset()) == NULL) | 472 | gx_pci = gx_detect_chipset(); |
473 | if (gx_pci == NULL) | ||
451 | return -ENODEV; | 474 | return -ENODEV; |
452 | 475 | ||
453 | /* check whether module parameters are sane */ | 476 | /* check whether module parameters are sane */ |
@@ -468,9 +491,11 @@ static int __init cpufreq_gx_init(void) | |||
468 | pci_read_config_byte(params->cs55x0, PCI_PMER1, &(params->pci_pmer1)); | 491 | pci_read_config_byte(params->cs55x0, PCI_PMER1, &(params->pci_pmer1)); |
469 | pci_read_config_byte(params->cs55x0, PCI_PMER2, &(params->pci_pmer2)); | 492 | pci_read_config_byte(params->cs55x0, PCI_PMER2, &(params->pci_pmer2)); |
470 | pci_read_config_byte(params->cs55x0, PCI_MODON, &(params->on_duration)); | 493 | pci_read_config_byte(params->cs55x0, PCI_MODON, &(params->on_duration)); |
471 | pci_read_config_byte(params->cs55x0, PCI_MODOFF, &(params->off_duration)); | 494 | pci_read_config_byte(params->cs55x0, PCI_MODOFF, |
495 | &(params->off_duration)); | ||
472 | 496 | ||
473 | if ((ret = cpufreq_register_driver(&gx_suspmod_driver))) { | 497 | ret = cpufreq_register_driver(&gx_suspmod_driver); |
498 | if (ret) { | ||
474 | kfree(params); | 499 | kfree(params); |
475 | return ret; /* register error! */ | 500 | return ret; /* register error! */ |
476 | } | 501 | } |
@@ -485,9 +510,9 @@ static void __exit cpufreq_gx_exit(void) | |||
485 | kfree(gx_params); | 510 | kfree(gx_params); |
486 | } | 511 | } |
487 | 512 | ||
488 | MODULE_AUTHOR ("Hiroshi Miura <miura@da-cha.org>"); | 513 | MODULE_AUTHOR("Hiroshi Miura <miura@da-cha.org>"); |
489 | MODULE_DESCRIPTION ("Cpufreq driver for Cyrix MediaGX and NatSemi Geode"); | 514 | MODULE_DESCRIPTION("Cpufreq driver for Cyrix MediaGX and NatSemi Geode"); |
490 | MODULE_LICENSE ("GPL"); | 515 | MODULE_LICENSE("GPL"); |
491 | 516 | ||
492 | module_init(cpufreq_gx_init); | 517 | module_init(cpufreq_gx_init); |
493 | module_exit(cpufreq_gx_exit); | 518 | module_exit(cpufreq_gx_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index a4cff5d6e380..f1c51aea064d 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c | |||
@@ -30,12 +30,12 @@ | |||
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/timex.h> | ||
34 | #include <linux/io.h> | ||
35 | #include <linux/acpi.h> | ||
36 | #include <linux/kernel.h> | ||
33 | 37 | ||
34 | #include <asm/msr.h> | 38 | #include <asm/msr.h> |
35 | #include <asm/timex.h> | ||
36 | #include <asm/io.h> | ||
37 | #include <asm/acpi.h> | ||
38 | #include <linux/acpi.h> | ||
39 | #include <acpi/processor.h> | 39 | #include <acpi/processor.h> |
40 | 40 | ||
41 | #include "longhaul.h" | 41 | #include "longhaul.h" |
@@ -58,7 +58,7 @@ | |||
58 | #define USE_NORTHBRIDGE (1 << 2) | 58 | #define USE_NORTHBRIDGE (1 << 2) |
59 | 59 | ||
60 | static int cpu_model; | 60 | static int cpu_model; |
61 | static unsigned int numscales=16; | 61 | static unsigned int numscales = 16; |
62 | static unsigned int fsb; | 62 | static unsigned int fsb; |
63 | 63 | ||
64 | static const struct mV_pos *vrm_mV_table; | 64 | static const struct mV_pos *vrm_mV_table; |
@@ -67,8 +67,8 @@ static const unsigned char *mV_vrm_table; | |||
67 | static unsigned int highest_speed, lowest_speed; /* kHz */ | 67 | static unsigned int highest_speed, lowest_speed; /* kHz */ |
68 | static unsigned int minmult, maxmult; | 68 | static unsigned int minmult, maxmult; |
69 | static int can_scale_voltage; | 69 | static int can_scale_voltage; |
70 | static struct acpi_processor *pr = NULL; | 70 | static struct acpi_processor *pr; |
71 | static struct acpi_processor_cx *cx = NULL; | 71 | static struct acpi_processor_cx *cx; |
72 | static u32 acpi_regs_addr; | 72 | static u32 acpi_regs_addr; |
73 | static u8 longhaul_flags; | 73 | static u8 longhaul_flags; |
74 | static unsigned int longhaul_index; | 74 | static unsigned int longhaul_index; |
@@ -78,12 +78,13 @@ static int scale_voltage; | |||
78 | static int disable_acpi_c3; | 78 | static int disable_acpi_c3; |
79 | static int revid_errata; | 79 | static int revid_errata; |
80 | 80 | ||
81 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg) | 81 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
82 | "longhaul", msg) | ||
82 | 83 | ||
83 | 84 | ||
84 | /* Clock ratios multiplied by 10 */ | 85 | /* Clock ratios multiplied by 10 */ |
85 | static int clock_ratio[32]; | 86 | static int mults[32]; |
86 | static int eblcr_table[32]; | 87 | static int eblcr[32]; |
87 | static int longhaul_version; | 88 | static int longhaul_version; |
88 | static struct cpufreq_frequency_table *longhaul_table; | 89 | static struct cpufreq_frequency_table *longhaul_table; |
89 | 90 | ||
@@ -93,7 +94,7 @@ static char speedbuffer[8]; | |||
93 | static char *print_speed(int speed) | 94 | static char *print_speed(int speed) |
94 | { | 95 | { |
95 | if (speed < 1000) { | 96 | if (speed < 1000) { |
96 | snprintf(speedbuffer, sizeof(speedbuffer),"%dMHz", speed); | 97 | snprintf(speedbuffer, sizeof(speedbuffer), "%dMHz", speed); |
97 | return speedbuffer; | 98 | return speedbuffer; |
98 | } | 99 | } |
99 | 100 | ||
@@ -122,27 +123,28 @@ static unsigned int calc_speed(int mult) | |||
122 | 123 | ||
123 | static int longhaul_get_cpu_mult(void) | 124 | static int longhaul_get_cpu_mult(void) |
124 | { | 125 | { |
125 | unsigned long invalue=0,lo, hi; | 126 | unsigned long invalue = 0, lo, hi; |
126 | 127 | ||
127 | rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi); | 128 | rdmsr(MSR_IA32_EBL_CR_POWERON, lo, hi); |
128 | invalue = (lo & (1<<22|1<<23|1<<24|1<<25)) >>22; | 129 | invalue = (lo & (1<<22|1<<23|1<<24|1<<25))>>22; |
129 | if (longhaul_version==TYPE_LONGHAUL_V2 || longhaul_version==TYPE_POWERSAVER) { | 130 | if (longhaul_version == TYPE_LONGHAUL_V2 || |
131 | longhaul_version == TYPE_POWERSAVER) { | ||
130 | if (lo & (1<<27)) | 132 | if (lo & (1<<27)) |
131 | invalue+=16; | 133 | invalue += 16; |
132 | } | 134 | } |
133 | return eblcr_table[invalue]; | 135 | return eblcr[invalue]; |
134 | } | 136 | } |
135 | 137 | ||
136 | /* For processor with BCR2 MSR */ | 138 | /* For processor with BCR2 MSR */ |
137 | 139 | ||
138 | static void do_longhaul1(unsigned int clock_ratio_index) | 140 | static void do_longhaul1(unsigned int mults_index) |
139 | { | 141 | { |
140 | union msr_bcr2 bcr2; | 142 | union msr_bcr2 bcr2; |
141 | 143 | ||
142 | rdmsrl(MSR_VIA_BCR2, bcr2.val); | 144 | rdmsrl(MSR_VIA_BCR2, bcr2.val); |
143 | /* Enable software clock multiplier */ | 145 | /* Enable software clock multiplier */ |
144 | bcr2.bits.ESOFTBF = 1; | 146 | bcr2.bits.ESOFTBF = 1; |
145 | bcr2.bits.CLOCKMUL = clock_ratio_index & 0xff; | 147 | bcr2.bits.CLOCKMUL = mults_index & 0xff; |
146 | 148 | ||
147 | /* Sync to timer tick */ | 149 | /* Sync to timer tick */ |
148 | safe_halt(); | 150 | safe_halt(); |
@@ -161,7 +163,7 @@ static void do_longhaul1(unsigned int clock_ratio_index) | |||
161 | 163 | ||
162 | /* For processor with Longhaul MSR */ | 164 | /* For processor with Longhaul MSR */ |
163 | 165 | ||
164 | static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | 166 | static void do_powersaver(int cx_address, unsigned int mults_index, |
165 | unsigned int dir) | 167 | unsigned int dir) |
166 | { | 168 | { |
167 | union msr_longhaul longhaul; | 169 | union msr_longhaul longhaul; |
@@ -173,11 +175,11 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | |||
173 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; | 175 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; |
174 | else | 176 | else |
175 | longhaul.bits.RevisionKey = 0; | 177 | longhaul.bits.RevisionKey = 0; |
176 | longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf; | 178 | longhaul.bits.SoftBusRatio = mults_index & 0xf; |
177 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; | 179 | longhaul.bits.SoftBusRatio4 = (mults_index & 0x10) >> 4; |
178 | /* Setup new voltage */ | 180 | /* Setup new voltage */ |
179 | if (can_scale_voltage) | 181 | if (can_scale_voltage) |
180 | longhaul.bits.SoftVID = (clock_ratio_index >> 8) & 0x1f; | 182 | longhaul.bits.SoftVID = (mults_index >> 8) & 0x1f; |
181 | /* Sync to timer tick */ | 183 | /* Sync to timer tick */ |
182 | safe_halt(); | 184 | safe_halt(); |
183 | /* Raise voltage if necessary */ | 185 | /* Raise voltage if necessary */ |
@@ -240,14 +242,14 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index, | |||
240 | 242 | ||
241 | /** | 243 | /** |
242 | * longhaul_set_cpu_frequency() | 244 | * longhaul_set_cpu_frequency() |
243 | * @clock_ratio_index : bitpattern of the new multiplier. | 245 | * @mults_index : bitpattern of the new multiplier. |
244 | * | 246 | * |
245 | * Sets a new clock ratio. | 247 | * Sets a new clock ratio. |
246 | */ | 248 | */ |
247 | 249 | ||
248 | static void longhaul_setstate(unsigned int table_index) | 250 | static void longhaul_setstate(unsigned int table_index) |
249 | { | 251 | { |
250 | unsigned int clock_ratio_index; | 252 | unsigned int mults_index; |
251 | int speed, mult; | 253 | int speed, mult; |
252 | struct cpufreq_freqs freqs; | 254 | struct cpufreq_freqs freqs; |
253 | unsigned long flags; | 255 | unsigned long flags; |
@@ -256,9 +258,9 @@ static void longhaul_setstate(unsigned int table_index) | |||
256 | u32 bm_timeout = 1000; | 258 | u32 bm_timeout = 1000; |
257 | unsigned int dir = 0; | 259 | unsigned int dir = 0; |
258 | 260 | ||
259 | clock_ratio_index = longhaul_table[table_index].index; | 261 | mults_index = longhaul_table[table_index].index; |
260 | /* Safety precautions */ | 262 | /* Safety precautions */ |
261 | mult = clock_ratio[clock_ratio_index & 0x1f]; | 263 | mult = mults[mults_index & 0x1f]; |
262 | if (mult == -1) | 264 | if (mult == -1) |
263 | return; | 265 | return; |
264 | speed = calc_speed(mult); | 266 | speed = calc_speed(mult); |
@@ -274,7 +276,7 @@ static void longhaul_setstate(unsigned int table_index) | |||
274 | 276 | ||
275 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 277 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
276 | 278 | ||
277 | dprintk ("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", | 279 | dprintk("Setting to FSB:%dMHz Mult:%d.%dx (%s)\n", |
278 | fsb, mult/10, mult%10, print_speed(speed/1000)); | 280 | fsb, mult/10, mult%10, print_speed(speed/1000)); |
279 | retry_loop: | 281 | retry_loop: |
280 | preempt_disable(); | 282 | preempt_disable(); |
@@ -282,8 +284,8 @@ retry_loop: | |||
282 | 284 | ||
283 | pic2_mask = inb(0xA1); | 285 | pic2_mask = inb(0xA1); |
284 | pic1_mask = inb(0x21); /* works on C3. save mask. */ | 286 | pic1_mask = inb(0x21); /* works on C3. save mask. */ |
285 | outb(0xFF,0xA1); /* Overkill */ | 287 | outb(0xFF, 0xA1); /* Overkill */ |
286 | outb(0xFE,0x21); /* TMR0 only */ | 288 | outb(0xFE, 0x21); /* TMR0 only */ |
287 | 289 | ||
288 | /* Wait while PCI bus is busy. */ | 290 | /* Wait while PCI bus is busy. */ |
289 | if (acpi_regs_addr && (longhaul_flags & USE_NORTHBRIDGE | 291 | if (acpi_regs_addr && (longhaul_flags & USE_NORTHBRIDGE |
@@ -312,7 +314,7 @@ retry_loop: | |||
312 | * Software controlled multipliers only. | 314 | * Software controlled multipliers only. |
313 | */ | 315 | */ |
314 | case TYPE_LONGHAUL_V1: | 316 | case TYPE_LONGHAUL_V1: |
315 | do_longhaul1(clock_ratio_index); | 317 | do_longhaul1(mults_index); |
316 | break; | 318 | break; |
317 | 319 | ||
318 | /* | 320 | /* |
@@ -327,9 +329,9 @@ retry_loop: | |||
327 | if (longhaul_flags & USE_ACPI_C3) { | 329 | if (longhaul_flags & USE_ACPI_C3) { |
328 | /* Don't allow wakeup */ | 330 | /* Don't allow wakeup */ |
329 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); | 331 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); |
330 | do_powersaver(cx->address, clock_ratio_index, dir); | 332 | do_powersaver(cx->address, mults_index, dir); |
331 | } else { | 333 | } else { |
332 | do_powersaver(0, clock_ratio_index, dir); | 334 | do_powersaver(0, mults_index, dir); |
333 | } | 335 | } |
334 | break; | 336 | break; |
335 | } | 337 | } |
@@ -341,8 +343,8 @@ retry_loop: | |||
341 | /* Enable bus master arbitration */ | 343 | /* Enable bus master arbitration */ |
342 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); | 344 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); |
343 | } | 345 | } |
344 | outb(pic2_mask,0xA1); /* restore mask */ | 346 | outb(pic2_mask, 0xA1); /* restore mask */ |
345 | outb(pic1_mask,0x21); | 347 | outb(pic1_mask, 0x21); |
346 | 348 | ||
347 | local_irq_restore(flags); | 349 | local_irq_restore(flags); |
348 | preempt_enable(); | 350 | preempt_enable(); |
@@ -392,7 +394,8 @@ retry_loop: | |||
392 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 394 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
393 | 395 | ||
394 | if (!bm_timeout) | 396 | if (!bm_timeout) |
395 | printk(KERN_INFO PFX "Warning: Timeout while waiting for idle PCI bus.\n"); | 397 | printk(KERN_INFO PFX "Warning: Timeout while waiting for " |
398 | "idle PCI bus.\n"); | ||
396 | } | 399 | } |
397 | 400 | ||
398 | /* | 401 | /* |
@@ -458,31 +461,32 @@ static int __init longhaul_get_ranges(void) | |||
458 | break; | 461 | break; |
459 | } | 462 | } |
460 | 463 | ||
461 | dprintk ("MinMult:%d.%dx MaxMult:%d.%dx\n", | 464 | dprintk("MinMult:%d.%dx MaxMult:%d.%dx\n", |
462 | minmult/10, minmult%10, maxmult/10, maxmult%10); | 465 | minmult/10, minmult%10, maxmult/10, maxmult%10); |
463 | 466 | ||
464 | highest_speed = calc_speed(maxmult); | 467 | highest_speed = calc_speed(maxmult); |
465 | lowest_speed = calc_speed(minmult); | 468 | lowest_speed = calc_speed(minmult); |
466 | dprintk ("FSB:%dMHz Lowest speed: %s Highest speed:%s\n", fsb, | 469 | dprintk("FSB:%dMHz Lowest speed: %s Highest speed:%s\n", fsb, |
467 | print_speed(lowest_speed/1000), | 470 | print_speed(lowest_speed/1000), |
468 | print_speed(highest_speed/1000)); | 471 | print_speed(highest_speed/1000)); |
469 | 472 | ||
470 | if (lowest_speed == highest_speed) { | 473 | if (lowest_speed == highest_speed) { |
471 | printk (KERN_INFO PFX "highestspeed == lowest, aborting.\n"); | 474 | printk(KERN_INFO PFX "highestspeed == lowest, aborting.\n"); |
472 | return -EINVAL; | 475 | return -EINVAL; |
473 | } | 476 | } |
474 | if (lowest_speed > highest_speed) { | 477 | if (lowest_speed > highest_speed) { |
475 | printk (KERN_INFO PFX "nonsense! lowest (%d > %d) !\n", | 478 | printk(KERN_INFO PFX "nonsense! lowest (%d > %d) !\n", |
476 | lowest_speed, highest_speed); | 479 | lowest_speed, highest_speed); |
477 | return -EINVAL; | 480 | return -EINVAL; |
478 | } | 481 | } |
479 | 482 | ||
480 | longhaul_table = kmalloc((numscales + 1) * sizeof(struct cpufreq_frequency_table), GFP_KERNEL); | 483 | longhaul_table = kmalloc((numscales + 1) * sizeof(*longhaul_table), |
481 | if(!longhaul_table) | 484 | GFP_KERNEL); |
485 | if (!longhaul_table) | ||
482 | return -ENOMEM; | 486 | return -ENOMEM; |
483 | 487 | ||
484 | for (j = 0; j < numscales; j++) { | 488 | for (j = 0; j < numscales; j++) { |
485 | ratio = clock_ratio[j]; | 489 | ratio = mults[j]; |
486 | if (ratio == -1) | 490 | if (ratio == -1) |
487 | continue; | 491 | continue; |
488 | if (ratio > maxmult || ratio < minmult) | 492 | if (ratio > maxmult || ratio < minmult) |
@@ -507,13 +511,10 @@ static int __init longhaul_get_ranges(void) | |||
507 | } | 511 | } |
508 | } | 512 | } |
509 | if (min_i != j) { | 513 | if (min_i != j) { |
510 | unsigned int temp; | 514 | swap(longhaul_table[j].frequency, |
511 | temp = longhaul_table[j].frequency; | 515 | longhaul_table[min_i].frequency); |
512 | longhaul_table[j].frequency = longhaul_table[min_i].frequency; | 516 | swap(longhaul_table[j].index, |
513 | longhaul_table[min_i].frequency = temp; | 517 | longhaul_table[min_i].index); |
514 | temp = longhaul_table[j].index; | ||
515 | longhaul_table[j].index = longhaul_table[min_i].index; | ||
516 | longhaul_table[min_i].index = temp; | ||
517 | } | 518 | } |
518 | } | 519 | } |
519 | 520 | ||
@@ -521,7 +522,7 @@ static int __init longhaul_get_ranges(void) | |||
521 | 522 | ||
522 | /* Find index we are running on */ | 523 | /* Find index we are running on */ |
523 | for (j = 0; j < k; j++) { | 524 | for (j = 0; j < k; j++) { |
524 | if (clock_ratio[longhaul_table[j].index & 0x1f] == mult) { | 525 | if (mults[longhaul_table[j].index & 0x1f] == mult) { |
525 | longhaul_index = j; | 526 | longhaul_index = j; |
526 | break; | 527 | break; |
527 | } | 528 | } |
@@ -559,20 +560,22 @@ static void __init longhaul_setup_voltagescaling(void) | |||
559 | maxvid = vrm_mV_table[longhaul.bits.MaximumVID]; | 560 | maxvid = vrm_mV_table[longhaul.bits.MaximumVID]; |
560 | 561 | ||
561 | if (minvid.mV == 0 || maxvid.mV == 0 || minvid.mV > maxvid.mV) { | 562 | if (minvid.mV == 0 || maxvid.mV == 0 || minvid.mV > maxvid.mV) { |
562 | printk (KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. " | 563 | printk(KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. " |
563 | "Voltage scaling disabled.\n", | 564 | "Voltage scaling disabled.\n", |
564 | minvid.mV/1000, minvid.mV%1000, maxvid.mV/1000, maxvid.mV%1000); | 565 | minvid.mV/1000, minvid.mV%1000, |
566 | maxvid.mV/1000, maxvid.mV%1000); | ||
565 | return; | 567 | return; |
566 | } | 568 | } |
567 | 569 | ||
568 | if (minvid.mV == maxvid.mV) { | 570 | if (minvid.mV == maxvid.mV) { |
569 | printk (KERN_INFO PFX "Claims to support voltage scaling but min & max are " | 571 | printk(KERN_INFO PFX "Claims to support voltage scaling but " |
570 | "both %d.%03d. Voltage scaling disabled\n", | 572 | "min & max are both %d.%03d. " |
573 | "Voltage scaling disabled\n", | ||
571 | maxvid.mV/1000, maxvid.mV%1000); | 574 | maxvid.mV/1000, maxvid.mV%1000); |
572 | return; | 575 | return; |
573 | } | 576 | } |
574 | 577 | ||
575 | /* How many voltage steps */ | 578 | /* How many voltage steps*/ |
576 | numvscales = maxvid.pos - minvid.pos + 1; | 579 | numvscales = maxvid.pos - minvid.pos + 1; |
577 | printk(KERN_INFO PFX | 580 | printk(KERN_INFO PFX |
578 | "Max VID=%d.%03d " | 581 | "Max VID=%d.%03d " |
@@ -586,7 +589,7 @@ static void __init longhaul_setup_voltagescaling(void) | |||
586 | j = longhaul.bits.MinMHzBR; | 589 | j = longhaul.bits.MinMHzBR; |
587 | if (longhaul.bits.MinMHzBR4) | 590 | if (longhaul.bits.MinMHzBR4) |
588 | j += 16; | 591 | j += 16; |
589 | min_vid_speed = eblcr_table[j]; | 592 | min_vid_speed = eblcr[j]; |
590 | if (min_vid_speed == -1) | 593 | if (min_vid_speed == -1) |
591 | return; | 594 | return; |
592 | switch (longhaul.bits.MinMHzFSB) { | 595 | switch (longhaul.bits.MinMHzFSB) { |
@@ -617,7 +620,8 @@ static void __init longhaul_setup_voltagescaling(void) | |||
617 | pos = minvid.pos; | 620 | pos = minvid.pos; |
618 | longhaul_table[j].index |= mV_vrm_table[pos] << 8; | 621 | longhaul_table[j].index |= mV_vrm_table[pos] << 8; |
619 | vid = vrm_mV_table[mV_vrm_table[pos]]; | 622 | vid = vrm_mV_table[mV_vrm_table[pos]]; |
620 | printk(KERN_INFO PFX "f: %d kHz, index: %d, vid: %d mV\n", speed, j, vid.mV); | 623 | printk(KERN_INFO PFX "f: %d kHz, index: %d, vid: %d mV\n", |
624 | speed, j, vid.mV); | ||
621 | j++; | 625 | j++; |
622 | } | 626 | } |
623 | 627 | ||
@@ -640,7 +644,8 @@ static int longhaul_target(struct cpufreq_policy *policy, | |||
640 | unsigned int dir = 0; | 644 | unsigned int dir = 0; |
641 | u8 vid, current_vid; | 645 | u8 vid, current_vid; |
642 | 646 | ||
643 | if (cpufreq_frequency_table_target(policy, longhaul_table, target_freq, relation, &table_index)) | 647 | if (cpufreq_frequency_table_target(policy, longhaul_table, target_freq, |
648 | relation, &table_index)) | ||
644 | return -EINVAL; | 649 | return -EINVAL; |
645 | 650 | ||
646 | /* Don't set same frequency again */ | 651 | /* Don't set same frequency again */ |
@@ -656,7 +661,8 @@ static int longhaul_target(struct cpufreq_policy *policy, | |||
656 | * this in hardware, C3 is old and we need to do this | 661 | * this in hardware, C3 is old and we need to do this |
657 | * in software. */ | 662 | * in software. */ |
658 | i = longhaul_index; | 663 | i = longhaul_index; |
659 | current_vid = (longhaul_table[longhaul_index].index >> 8) & 0x1f; | 664 | current_vid = (longhaul_table[longhaul_index].index >> 8); |
665 | current_vid &= 0x1f; | ||
660 | if (table_index > longhaul_index) | 666 | if (table_index > longhaul_index) |
661 | dir = 1; | 667 | dir = 1; |
662 | while (i != table_index) { | 668 | while (i != table_index) { |
@@ -691,9 +697,9 @@ static acpi_status longhaul_walk_callback(acpi_handle obj_handle, | |||
691 | { | 697 | { |
692 | struct acpi_device *d; | 698 | struct acpi_device *d; |
693 | 699 | ||
694 | if ( acpi_bus_get_device(obj_handle, &d) ) { | 700 | if (acpi_bus_get_device(obj_handle, &d)) |
695 | return 0; | 701 | return 0; |
696 | } | 702 | |
697 | *return_value = acpi_driver_data(d); | 703 | *return_value = acpi_driver_data(d); |
698 | return 1; | 704 | return 1; |
699 | } | 705 | } |
@@ -750,7 +756,7 @@ static int longhaul_setup_southbridge(void) | |||
750 | /* Find VT8235 southbridge */ | 756 | /* Find VT8235 southbridge */ |
751 | dev = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL); | 757 | dev = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL); |
752 | if (dev == NULL) | 758 | if (dev == NULL) |
753 | /* Find VT8237 southbridge */ | 759 | /* Find VT8237 southbridge */ |
754 | dev = pci_get_device(PCI_VENDOR_ID_VIA, | 760 | dev = pci_get_device(PCI_VENDOR_ID_VIA, |
755 | PCI_DEVICE_ID_VIA_8237, NULL); | 761 | PCI_DEVICE_ID_VIA_8237, NULL); |
756 | if (dev != NULL) { | 762 | if (dev != NULL) { |
@@ -769,7 +775,8 @@ static int longhaul_setup_southbridge(void) | |||
769 | if (pci_cmd & 1 << 7) { | 775 | if (pci_cmd & 1 << 7) { |
770 | pci_read_config_dword(dev, 0x88, &acpi_regs_addr); | 776 | pci_read_config_dword(dev, 0x88, &acpi_regs_addr); |
771 | acpi_regs_addr &= 0xff00; | 777 | acpi_regs_addr &= 0xff00; |
772 | printk(KERN_INFO PFX "ACPI I/O at 0x%x\n", acpi_regs_addr); | 778 | printk(KERN_INFO PFX "ACPI I/O at 0x%x\n", |
779 | acpi_regs_addr); | ||
773 | } | 780 | } |
774 | 781 | ||
775 | pci_dev_put(dev); | 782 | pci_dev_put(dev); |
@@ -781,7 +788,7 @@ static int longhaul_setup_southbridge(void) | |||
781 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | 788 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) |
782 | { | 789 | { |
783 | struct cpuinfo_x86 *c = &cpu_data(0); | 790 | struct cpuinfo_x86 *c = &cpu_data(0); |
784 | char *cpuname=NULL; | 791 | char *cpuname = NULL; |
785 | int ret; | 792 | int ret; |
786 | u32 lo, hi; | 793 | u32 lo, hi; |
787 | 794 | ||
@@ -791,8 +798,8 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
791 | cpu_model = CPU_SAMUEL; | 798 | cpu_model = CPU_SAMUEL; |
792 | cpuname = "C3 'Samuel' [C5A]"; | 799 | cpuname = "C3 'Samuel' [C5A]"; |
793 | longhaul_version = TYPE_LONGHAUL_V1; | 800 | longhaul_version = TYPE_LONGHAUL_V1; |
794 | memcpy (clock_ratio, samuel1_clock_ratio, sizeof(samuel1_clock_ratio)); | 801 | memcpy(mults, samuel1_mults, sizeof(samuel1_mults)); |
795 | memcpy (eblcr_table, samuel1_eblcr, sizeof(samuel1_eblcr)); | 802 | memcpy(eblcr, samuel1_eblcr, sizeof(samuel1_eblcr)); |
796 | break; | 803 | break; |
797 | 804 | ||
798 | case 7: | 805 | case 7: |
@@ -803,10 +810,8 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
803 | cpuname = "C3 'Samuel 2' [C5B]"; | 810 | cpuname = "C3 'Samuel 2' [C5B]"; |
804 | /* Note, this is not a typo, early Samuel2's had | 811 | /* Note, this is not a typo, early Samuel2's had |
805 | * Samuel1 ratios. */ | 812 | * Samuel1 ratios. */ |
806 | memcpy(clock_ratio, samuel1_clock_ratio, | 813 | memcpy(mults, samuel1_mults, sizeof(samuel1_mults)); |
807 | sizeof(samuel1_clock_ratio)); | 814 | memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); |
808 | memcpy(eblcr_table, samuel2_eblcr, | ||
809 | sizeof(samuel2_eblcr)); | ||
810 | break; | 815 | break; |
811 | case 1 ... 15: | 816 | case 1 ... 15: |
812 | longhaul_version = TYPE_LONGHAUL_V1; | 817 | longhaul_version = TYPE_LONGHAUL_V1; |
@@ -817,10 +822,8 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
817 | cpu_model = CPU_EZRA; | 822 | cpu_model = CPU_EZRA; |
818 | cpuname = "C3 'Ezra' [C5C]"; | 823 | cpuname = "C3 'Ezra' [C5C]"; |
819 | } | 824 | } |
820 | memcpy(clock_ratio, ezra_clock_ratio, | 825 | memcpy(mults, ezra_mults, sizeof(ezra_mults)); |
821 | sizeof(ezra_clock_ratio)); | 826 | memcpy(eblcr, ezra_eblcr, sizeof(ezra_eblcr)); |
822 | memcpy(eblcr_table, ezra_eblcr, | ||
823 | sizeof(ezra_eblcr)); | ||
824 | break; | 827 | break; |
825 | } | 828 | } |
826 | break; | 829 | break; |
@@ -829,18 +832,16 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
829 | cpu_model = CPU_EZRA_T; | 832 | cpu_model = CPU_EZRA_T; |
830 | cpuname = "C3 'Ezra-T' [C5M]"; | 833 | cpuname = "C3 'Ezra-T' [C5M]"; |
831 | longhaul_version = TYPE_POWERSAVER; | 834 | longhaul_version = TYPE_POWERSAVER; |
832 | numscales=32; | 835 | numscales = 32; |
833 | memcpy (clock_ratio, ezrat_clock_ratio, sizeof(ezrat_clock_ratio)); | 836 | memcpy(mults, ezrat_mults, sizeof(ezrat_mults)); |
834 | memcpy (eblcr_table, ezrat_eblcr, sizeof(ezrat_eblcr)); | 837 | memcpy(eblcr, ezrat_eblcr, sizeof(ezrat_eblcr)); |
835 | break; | 838 | break; |
836 | 839 | ||
837 | case 9: | 840 | case 9: |
838 | longhaul_version = TYPE_POWERSAVER; | 841 | longhaul_version = TYPE_POWERSAVER; |
839 | numscales = 32; | 842 | numscales = 32; |
840 | memcpy(clock_ratio, | 843 | memcpy(mults, nehemiah_mults, sizeof(nehemiah_mults)); |
841 | nehemiah_clock_ratio, | 844 | memcpy(eblcr, nehemiah_eblcr, sizeof(nehemiah_eblcr)); |
842 | sizeof(nehemiah_clock_ratio)); | ||
843 | memcpy(eblcr_table, nehemiah_eblcr, sizeof(nehemiah_eblcr)); | ||
844 | switch (c->x86_mask) { | 845 | switch (c->x86_mask) { |
845 | case 0 ... 1: | 846 | case 0 ... 1: |
846 | cpu_model = CPU_NEHEMIAH; | 847 | cpu_model = CPU_NEHEMIAH; |
@@ -869,14 +870,14 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
869 | longhaul_version = TYPE_LONGHAUL_V1; | 870 | longhaul_version = TYPE_LONGHAUL_V1; |
870 | } | 871 | } |
871 | 872 | ||
872 | printk (KERN_INFO PFX "VIA %s CPU detected. ", cpuname); | 873 | printk(KERN_INFO PFX "VIA %s CPU detected. ", cpuname); |
873 | switch (longhaul_version) { | 874 | switch (longhaul_version) { |
874 | case TYPE_LONGHAUL_V1: | 875 | case TYPE_LONGHAUL_V1: |
875 | case TYPE_LONGHAUL_V2: | 876 | case TYPE_LONGHAUL_V2: |
876 | printk ("Longhaul v%d supported.\n", longhaul_version); | 877 | printk(KERN_CONT "Longhaul v%d supported.\n", longhaul_version); |
877 | break; | 878 | break; |
878 | case TYPE_POWERSAVER: | 879 | case TYPE_POWERSAVER: |
879 | printk ("Powersaver supported.\n"); | 880 | printk(KERN_CONT "Powersaver supported.\n"); |
880 | break; | 881 | break; |
881 | }; | 882 | }; |
882 | 883 | ||
@@ -940,7 +941,7 @@ static int __devexit longhaul_cpu_exit(struct cpufreq_policy *policy) | |||
940 | return 0; | 941 | return 0; |
941 | } | 942 | } |
942 | 943 | ||
943 | static struct freq_attr* longhaul_attr[] = { | 944 | static struct freq_attr *longhaul_attr[] = { |
944 | &cpufreq_freq_attr_scaling_available_freqs, | 945 | &cpufreq_freq_attr_scaling_available_freqs, |
945 | NULL, | 946 | NULL, |
946 | }; | 947 | }; |
@@ -966,13 +967,15 @@ static int __init longhaul_init(void) | |||
966 | 967 | ||
967 | #ifdef CONFIG_SMP | 968 | #ifdef CONFIG_SMP |
968 | if (num_online_cpus() > 1) { | 969 | if (num_online_cpus() > 1) { |
969 | printk(KERN_ERR PFX "More than 1 CPU detected, longhaul disabled.\n"); | 970 | printk(KERN_ERR PFX "More than 1 CPU detected, " |
971 | "longhaul disabled.\n"); | ||
970 | return -ENODEV; | 972 | return -ENODEV; |
971 | } | 973 | } |
972 | #endif | 974 | #endif |
973 | #ifdef CONFIG_X86_IO_APIC | 975 | #ifdef CONFIG_X86_IO_APIC |
974 | if (cpu_has_apic) { | 976 | if (cpu_has_apic) { |
975 | printk(KERN_ERR PFX "APIC detected. Longhaul is currently broken in this configuration.\n"); | 977 | printk(KERN_ERR PFX "APIC detected. Longhaul is currently " |
978 | "broken in this configuration.\n"); | ||
976 | return -ENODEV; | 979 | return -ENODEV; |
977 | } | 980 | } |
978 | #endif | 981 | #endif |
@@ -993,8 +996,8 @@ static void __exit longhaul_exit(void) | |||
993 | { | 996 | { |
994 | int i; | 997 | int i; |
995 | 998 | ||
996 | for (i=0; i < numscales; i++) { | 999 | for (i = 0; i < numscales; i++) { |
997 | if (clock_ratio[i] == maxmult) { | 1000 | if (mults[i] == maxmult) { |
998 | longhaul_setstate(i); | 1001 | longhaul_setstate(i); |
999 | break; | 1002 | break; |
1000 | } | 1003 | } |
@@ -1007,11 +1010,11 @@ static void __exit longhaul_exit(void) | |||
1007 | /* Even if BIOS is exporting ACPI C3 state, and it is used | 1010 | /* Even if BIOS is exporting ACPI C3 state, and it is used |
1008 | * with success when CPU is idle, this state doesn't | 1011 | * with success when CPU is idle, this state doesn't |
1009 | * trigger frequency transition in some cases. */ | 1012 | * trigger frequency transition in some cases. */ |
1010 | module_param (disable_acpi_c3, int, 0644); | 1013 | module_param(disable_acpi_c3, int, 0644); |
1011 | MODULE_PARM_DESC(disable_acpi_c3, "Don't use ACPI C3 support"); | 1014 | MODULE_PARM_DESC(disable_acpi_c3, "Don't use ACPI C3 support"); |
1012 | /* Change CPU voltage with frequency. Very usefull to save | 1015 | /* Change CPU voltage with frequency. Very usefull to save |
1013 | * power, but most VIA C3 processors aren't supporting it. */ | 1016 | * power, but most VIA C3 processors aren't supporting it. */ |
1014 | module_param (scale_voltage, int, 0644); | 1017 | module_param(scale_voltage, int, 0644); |
1015 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | 1018 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); |
1016 | /* Force revision key to 0 for processors which doesn't | 1019 | /* Force revision key to 0 for processors which doesn't |
1017 | * support voltage scaling, but are introducing itself as | 1020 | * support voltage scaling, but are introducing itself as |
@@ -1019,9 +1022,9 @@ MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); | |||
1019 | module_param(revid_errata, int, 0644); | 1022 | module_param(revid_errata, int, 0644); |
1020 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); | 1023 | MODULE_PARM_DESC(revid_errata, "Ignore CPU Revision ID"); |
1021 | 1024 | ||
1022 | MODULE_AUTHOR ("Dave Jones <davej@redhat.com>"); | 1025 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); |
1023 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); | 1026 | MODULE_DESCRIPTION("Longhaul driver for VIA Cyrix processors."); |
1024 | MODULE_LICENSE ("GPL"); | 1027 | MODULE_LICENSE("GPL"); |
1025 | 1028 | ||
1026 | late_initcall(longhaul_init); | 1029 | late_initcall(longhaul_init); |
1027 | module_exit(longhaul_exit); | 1030 | module_exit(longhaul_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.h b/arch/x86/kernel/cpu/cpufreq/longhaul.h index 4fcc320997df..e2360a469f79 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.h +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.h | |||
@@ -49,14 +49,14 @@ union msr_longhaul { | |||
49 | 49 | ||
50 | /* | 50 | /* |
51 | * Clock ratio tables. Div/Mod by 10 to get ratio. | 51 | * Clock ratio tables. Div/Mod by 10 to get ratio. |
52 | * The eblcr ones specify the ratio read from the CPU. | 52 | * The eblcr values specify the ratio read from the CPU. |
53 | * The clock_ratio ones specify what to write to the CPU. | 53 | * The mults values specify what to write to the CPU. |
54 | */ | 54 | */ |
55 | 55 | ||
56 | /* | 56 | /* |
57 | * VIA C3 Samuel 1 & Samuel 2 (stepping 0) | 57 | * VIA C3 Samuel 1 & Samuel 2 (stepping 0) |
58 | */ | 58 | */ |
59 | static const int __initdata samuel1_clock_ratio[16] = { | 59 | static const int __initdata samuel1_mults[16] = { |
60 | -1, /* 0000 -> RESERVED */ | 60 | -1, /* 0000 -> RESERVED */ |
61 | 30, /* 0001 -> 3.0x */ | 61 | 30, /* 0001 -> 3.0x */ |
62 | 40, /* 0010 -> 4.0x */ | 62 | 40, /* 0010 -> 4.0x */ |
@@ -119,7 +119,7 @@ static const int __initdata samuel2_eblcr[16] = { | |||
119 | /* | 119 | /* |
120 | * VIA C3 Ezra | 120 | * VIA C3 Ezra |
121 | */ | 121 | */ |
122 | static const int __initdata ezra_clock_ratio[16] = { | 122 | static const int __initdata ezra_mults[16] = { |
123 | 100, /* 0000 -> 10.0x */ | 123 | 100, /* 0000 -> 10.0x */ |
124 | 30, /* 0001 -> 3.0x */ | 124 | 30, /* 0001 -> 3.0x */ |
125 | 40, /* 0010 -> 4.0x */ | 125 | 40, /* 0010 -> 4.0x */ |
@@ -160,7 +160,7 @@ static const int __initdata ezra_eblcr[16] = { | |||
160 | /* | 160 | /* |
161 | * VIA C3 (Ezra-T) [C5M]. | 161 | * VIA C3 (Ezra-T) [C5M]. |
162 | */ | 162 | */ |
163 | static const int __initdata ezrat_clock_ratio[32] = { | 163 | static const int __initdata ezrat_mults[32] = { |
164 | 100, /* 0000 -> 10.0x */ | 164 | 100, /* 0000 -> 10.0x */ |
165 | 30, /* 0001 -> 3.0x */ | 165 | 30, /* 0001 -> 3.0x */ |
166 | 40, /* 0010 -> 4.0x */ | 166 | 40, /* 0010 -> 4.0x */ |
@@ -235,7 +235,7 @@ static const int __initdata ezrat_eblcr[32] = { | |||
235 | /* | 235 | /* |
236 | * VIA C3 Nehemiah */ | 236 | * VIA C3 Nehemiah */ |
237 | 237 | ||
238 | static const int __initdata nehemiah_clock_ratio[32] = { | 238 | static const int __initdata nehemiah_mults[32] = { |
239 | 100, /* 0000 -> 10.0x */ | 239 | 100, /* 0000 -> 10.0x */ |
240 | -1, /* 0001 -> 16.0x */ | 240 | -1, /* 0001 -> 16.0x */ |
241 | 40, /* 0010 -> 4.0x */ | 241 | 40, /* 0010 -> 4.0x */ |
diff --git a/arch/x86/kernel/cpu/cpufreq/longrun.c b/arch/x86/kernel/cpu/cpufreq/longrun.c index 777a7ff075de..da5f70fcb766 100644 --- a/arch/x86/kernel/cpu/cpufreq/longrun.c +++ b/arch/x86/kernel/cpu/cpufreq/longrun.c | |||
@@ -11,12 +11,13 @@ | |||
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/cpufreq.h> | 13 | #include <linux/cpufreq.h> |
14 | #include <linux/timex.h> | ||
14 | 15 | ||
15 | #include <asm/msr.h> | 16 | #include <asm/msr.h> |
16 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
17 | #include <asm/timex.h> | ||
18 | 18 | ||
19 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longrun", msg) | 19 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
20 | "longrun", msg) | ||
20 | 21 | ||
21 | static struct cpufreq_driver longrun_driver; | 22 | static struct cpufreq_driver longrun_driver; |
22 | 23 | ||
@@ -51,7 +52,7 @@ static void __init longrun_get_policy(struct cpufreq_policy *policy) | |||
51 | msr_lo &= 0x0000007F; | 52 | msr_lo &= 0x0000007F; |
52 | msr_hi &= 0x0000007F; | 53 | msr_hi &= 0x0000007F; |
53 | 54 | ||
54 | if ( longrun_high_freq <= longrun_low_freq ) { | 55 | if (longrun_high_freq <= longrun_low_freq) { |
55 | /* Assume degenerate Longrun table */ | 56 | /* Assume degenerate Longrun table */ |
56 | policy->min = policy->max = longrun_high_freq; | 57 | policy->min = policy->max = longrun_high_freq; |
57 | } else { | 58 | } else { |
@@ -79,7 +80,7 @@ static int longrun_set_policy(struct cpufreq_policy *policy) | |||
79 | if (!policy) | 80 | if (!policy) |
80 | return -EINVAL; | 81 | return -EINVAL; |
81 | 82 | ||
82 | if ( longrun_high_freq <= longrun_low_freq ) { | 83 | if (longrun_high_freq <= longrun_low_freq) { |
83 | /* Assume degenerate Longrun table */ | 84 | /* Assume degenerate Longrun table */ |
84 | pctg_lo = pctg_hi = 100; | 85 | pctg_lo = pctg_hi = 100; |
85 | } else { | 86 | } else { |
@@ -152,7 +153,7 @@ static unsigned int longrun_get(unsigned int cpu) | |||
152 | cpuid(0x80860007, &eax, &ebx, &ecx, &edx); | 153 | cpuid(0x80860007, &eax, &ebx, &ecx, &edx); |
153 | dprintk("cpuid eax is %u\n", eax); | 154 | dprintk("cpuid eax is %u\n", eax); |
154 | 155 | ||
155 | return (eax * 1000); | 156 | return eax * 1000; |
156 | } | 157 | } |
157 | 158 | ||
158 | /** | 159 | /** |
@@ -196,7 +197,8 @@ static unsigned int __init longrun_determine_freqs(unsigned int *low_freq, | |||
196 | rdmsr(MSR_TMTA_LRTI_VOLT_MHZ, msr_lo, msr_hi); | 197 | rdmsr(MSR_TMTA_LRTI_VOLT_MHZ, msr_lo, msr_hi); |
197 | *high_freq = msr_lo * 1000; /* to kHz */ | 198 | *high_freq = msr_lo * 1000; /* to kHz */ |
198 | 199 | ||
199 | dprintk("longrun table interface told %u - %u kHz\n", *low_freq, *high_freq); | 200 | dprintk("longrun table interface told %u - %u kHz\n", |
201 | *low_freq, *high_freq); | ||
200 | 202 | ||
201 | if (*low_freq > *high_freq) | 203 | if (*low_freq > *high_freq) |
202 | *low_freq = *high_freq; | 204 | *low_freq = *high_freq; |
@@ -219,7 +221,7 @@ static unsigned int __init longrun_determine_freqs(unsigned int *low_freq, | |||
219 | cpuid(0x80860007, &eax, &ebx, &ecx, &edx); | 221 | cpuid(0x80860007, &eax, &ebx, &ecx, &edx); |
220 | /* try decreasing in 10% steps, some processors react only | 222 | /* try decreasing in 10% steps, some processors react only |
221 | * on some barrier values */ | 223 | * on some barrier values */ |
222 | for (try_hi = 80; try_hi > 0 && ecx > 90; try_hi -=10) { | 224 | for (try_hi = 80; try_hi > 0 && ecx > 90; try_hi -= 10) { |
223 | /* set to 0 to try_hi perf_pctg */ | 225 | /* set to 0 to try_hi perf_pctg */ |
224 | msr_lo &= 0xFFFFFF80; | 226 | msr_lo &= 0xFFFFFF80; |
225 | msr_hi &= 0xFFFFFF80; | 227 | msr_hi &= 0xFFFFFF80; |
@@ -236,7 +238,7 @@ static unsigned int __init longrun_determine_freqs(unsigned int *low_freq, | |||
236 | 238 | ||
237 | /* performance_pctg = (current_freq - low_freq)/(high_freq - low_freq) | 239 | /* performance_pctg = (current_freq - low_freq)/(high_freq - low_freq) |
238 | * eqals | 240 | * eqals |
239 | * low_freq * ( 1 - perf_pctg) = (cur_freq - high_freq * perf_pctg) | 241 | * low_freq * (1 - perf_pctg) = (cur_freq - high_freq * perf_pctg) |
240 | * | 242 | * |
241 | * high_freq * perf_pctg is stored tempoarily into "ebx". | 243 | * high_freq * perf_pctg is stored tempoarily into "ebx". |
242 | */ | 244 | */ |
@@ -317,9 +319,10 @@ static void __exit longrun_exit(void) | |||
317 | } | 319 | } |
318 | 320 | ||
319 | 321 | ||
320 | MODULE_AUTHOR ("Dominik Brodowski <linux@brodo.de>"); | 322 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); |
321 | MODULE_DESCRIPTION ("LongRun driver for Transmeta Crusoe and Efficeon processors."); | 323 | MODULE_DESCRIPTION("LongRun driver for Transmeta Crusoe and " |
322 | MODULE_LICENSE ("GPL"); | 324 | "Efficeon processors."); |
325 | MODULE_LICENSE("GPL"); | ||
323 | 326 | ||
324 | module_init(longrun_init); | 327 | module_init(longrun_init); |
325 | module_exit(longrun_exit); | 328 | module_exit(longrun_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c index 3178c3acd97e..41ed94915f97 100644 --- a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c | |||
@@ -27,15 +27,17 @@ | |||
27 | #include <linux/cpufreq.h> | 27 | #include <linux/cpufreq.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/cpumask.h> | 29 | #include <linux/cpumask.h> |
30 | #include <linux/timex.h> | ||
30 | 31 | ||
31 | #include <asm/processor.h> | 32 | #include <asm/processor.h> |
32 | #include <asm/msr.h> | 33 | #include <asm/msr.h> |
33 | #include <asm/timex.h> | 34 | #include <asm/timer.h> |
34 | 35 | ||
35 | #include "speedstep-lib.h" | 36 | #include "speedstep-lib.h" |
36 | 37 | ||
37 | #define PFX "p4-clockmod: " | 38 | #define PFX "p4-clockmod: " |
38 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "p4-clockmod", msg) | 39 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
40 | "p4-clockmod", msg) | ||
39 | 41 | ||
40 | /* | 42 | /* |
41 | * Duty Cycle (3bits), note DC_DISABLE is not specified in | 43 | * Duty Cycle (3bits), note DC_DISABLE is not specified in |
@@ -58,7 +60,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) | |||
58 | { | 60 | { |
59 | u32 l, h; | 61 | u32 l, h; |
60 | 62 | ||
61 | if (!cpu_online(cpu) || (newstate > DC_DISABLE) || (newstate == DC_RESV)) | 63 | if (!cpu_online(cpu) || |
64 | (newstate > DC_DISABLE) || (newstate == DC_RESV)) | ||
62 | return -EINVAL; | 65 | return -EINVAL; |
63 | 66 | ||
64 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h); | 67 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_STATUS, &l, &h); |
@@ -66,7 +69,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate) | |||
66 | if (l & 0x01) | 69 | if (l & 0x01) |
67 | dprintk("CPU#%d currently thermal throttled\n", cpu); | 70 | dprintk("CPU#%d currently thermal throttled\n", cpu); |
68 | 71 | ||
69 | if (has_N44_O17_errata[cpu] && (newstate == DC_25PT || newstate == DC_DFLT)) | 72 | if (has_N44_O17_errata[cpu] && |
73 | (newstate == DC_25PT || newstate == DC_DFLT)) | ||
70 | newstate = DC_38PT; | 74 | newstate = DC_38PT; |
71 | 75 | ||
72 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h); | 76 | rdmsr_on_cpu(cpu, MSR_IA32_THERM_CONTROL, &l, &h); |
@@ -112,7 +116,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
112 | struct cpufreq_freqs freqs; | 116 | struct cpufreq_freqs freqs; |
113 | int i; | 117 | int i; |
114 | 118 | ||
115 | if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], target_freq, relation, &newstate)) | 119 | if (cpufreq_frequency_table_target(policy, &p4clockmod_table[0], |
120 | target_freq, relation, &newstate)) | ||
116 | return -EINVAL; | 121 | return -EINVAL; |
117 | 122 | ||
118 | freqs.old = cpufreq_p4_get(policy->cpu); | 123 | freqs.old = cpufreq_p4_get(policy->cpu); |
@@ -127,7 +132,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy, | |||
127 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 132 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
128 | } | 133 | } |
129 | 134 | ||
130 | /* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software | 135 | /* run on each logical CPU, |
136 | * see section 13.15.3 of IA32 Intel Architecture Software | ||
131 | * Developer's Manual, Volume 3 | 137 | * Developer's Manual, Volume 3 |
132 | */ | 138 | */ |
133 | for_each_cpu(i, policy->cpus) | 139 | for_each_cpu(i, policy->cpus) |
@@ -153,28 +159,30 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | |||
153 | { | 159 | { |
154 | if (c->x86 == 0x06) { | 160 | if (c->x86 == 0x06) { |
155 | if (cpu_has(c, X86_FEATURE_EST)) | 161 | if (cpu_has(c, X86_FEATURE_EST)) |
156 | printk(KERN_WARNING PFX "Warning: EST-capable CPU detected. " | 162 | printk(KERN_WARNING PFX "Warning: EST-capable CPU " |
157 | "The acpi-cpufreq module offers voltage scaling" | 163 | "detected. The acpi-cpufreq module offers " |
158 | " in addition of frequency scaling. You should use " | 164 | "voltage scaling in addition of frequency " |
159 | "that instead of p4-clockmod, if possible.\n"); | 165 | "scaling. You should use that instead of " |
166 | "p4-clockmod, if possible.\n"); | ||
160 | switch (c->x86_model) { | 167 | switch (c->x86_model) { |
161 | case 0x0E: /* Core */ | 168 | case 0x0E: /* Core */ |
162 | case 0x0F: /* Core Duo */ | 169 | case 0x0F: /* Core Duo */ |
163 | case 0x16: /* Celeron Core */ | 170 | case 0x16: /* Celeron Core */ |
164 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | 171 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
165 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PCORE); | 172 | return speedstep_get_frequency(SPEEDSTEP_CPU_PCORE); |
166 | case 0x0D: /* Pentium M (Dothan) */ | 173 | case 0x0D: /* Pentium M (Dothan) */ |
167 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | 174 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
168 | /* fall through */ | 175 | /* fall through */ |
169 | case 0x09: /* Pentium M (Banias) */ | 176 | case 0x09: /* Pentium M (Banias) */ |
170 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM); | 177 | return speedstep_get_frequency(SPEEDSTEP_CPU_PM); |
171 | } | 178 | } |
172 | } | 179 | } |
173 | 180 | ||
174 | if (c->x86 != 0xF) { | 181 | if (c->x86 != 0xF) { |
175 | if (!cpu_has(c, X86_FEATURE_EST)) | 182 | if (!cpu_has(c, X86_FEATURE_EST)) |
176 | printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. " | 183 | printk(KERN_WARNING PFX "Unknown CPU. " |
177 | "Please send an e-mail to <cpufreq@vger.kernel.org>\n"); | 184 | "Please send an e-mail to " |
185 | "<cpufreq@vger.kernel.org>\n"); | ||
178 | return 0; | 186 | return 0; |
179 | } | 187 | } |
180 | 188 | ||
@@ -182,16 +190,16 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c) | |||
182 | * throttling is active or not. */ | 190 | * throttling is active or not. */ |
183 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; | 191 | p4clockmod_driver.flags |= CPUFREQ_CONST_LOOPS; |
184 | 192 | ||
185 | if (speedstep_detect_processor() == SPEEDSTEP_PROCESSOR_P4M) { | 193 | if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4M) { |
186 | printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " | 194 | printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. " |
187 | "The speedstep-ich or acpi cpufreq modules offer " | 195 | "The speedstep-ich or acpi cpufreq modules offer " |
188 | "voltage scaling in addition of frequency scaling. " | 196 | "voltage scaling in addition of frequency scaling. " |
189 | "You should use either one instead of p4-clockmod, " | 197 | "You should use either one instead of p4-clockmod, " |
190 | "if possible.\n"); | 198 | "if possible.\n"); |
191 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4M); | 199 | return speedstep_get_frequency(SPEEDSTEP_CPU_P4M); |
192 | } | 200 | } |
193 | 201 | ||
194 | return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4D); | 202 | return speedstep_get_frequency(SPEEDSTEP_CPU_P4D); |
195 | } | 203 | } |
196 | 204 | ||
197 | 205 | ||
@@ -217,14 +225,20 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
217 | dprintk("has errata -- disabling low frequencies\n"); | 225 | dprintk("has errata -- disabling low frequencies\n"); |
218 | } | 226 | } |
219 | 227 | ||
228 | if (speedstep_detect_processor() == SPEEDSTEP_CPU_P4D && | ||
229 | c->x86_model < 2) { | ||
230 | /* switch to maximum frequency and measure result */ | ||
231 | cpufreq_p4_setdc(policy->cpu, DC_DISABLE); | ||
232 | recalibrate_cpu_khz(); | ||
233 | } | ||
220 | /* get max frequency */ | 234 | /* get max frequency */ |
221 | stock_freq = cpufreq_p4_get_frequency(c); | 235 | stock_freq = cpufreq_p4_get_frequency(c); |
222 | if (!stock_freq) | 236 | if (!stock_freq) |
223 | return -EINVAL; | 237 | return -EINVAL; |
224 | 238 | ||
225 | /* table init */ | 239 | /* table init */ |
226 | for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { | 240 | for (i = 1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { |
227 | if ((i<2) && (has_N44_O17_errata[policy->cpu])) | 241 | if ((i < 2) && (has_N44_O17_errata[policy->cpu])) |
228 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 242 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
229 | else | 243 | else |
230 | p4clockmod_table[i].frequency = (stock_freq * i)/8; | 244 | p4clockmod_table[i].frequency = (stock_freq * i)/8; |
@@ -232,7 +246,10 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | |||
232 | cpufreq_frequency_table_get_attr(p4clockmod_table, policy->cpu); | 246 | cpufreq_frequency_table_get_attr(p4clockmod_table, policy->cpu); |
233 | 247 | ||
234 | /* cpuinfo and default policy values */ | 248 | /* cpuinfo and default policy values */ |
235 | policy->cpuinfo.transition_latency = 1000000; /* assumed */ | 249 | |
250 | /* the transition latency is set to be 1 higher than the maximum | ||
251 | * transition latency of the ondemand governor */ | ||
252 | policy->cpuinfo.transition_latency = 10000001; | ||
236 | policy->cur = stock_freq; | 253 | policy->cur = stock_freq; |
237 | 254 | ||
238 | return cpufreq_frequency_table_cpuinfo(policy, &p4clockmod_table[0]); | 255 | return cpufreq_frequency_table_cpuinfo(policy, &p4clockmod_table[0]); |
@@ -258,12 +275,12 @@ static unsigned int cpufreq_p4_get(unsigned int cpu) | |||
258 | l = DC_DISABLE; | 275 | l = DC_DISABLE; |
259 | 276 | ||
260 | if (l != DC_DISABLE) | 277 | if (l != DC_DISABLE) |
261 | return (stock_freq * l / 8); | 278 | return stock_freq * l / 8; |
262 | 279 | ||
263 | return stock_freq; | 280 | return stock_freq; |
264 | } | 281 | } |
265 | 282 | ||
266 | static struct freq_attr* p4clockmod_attr[] = { | 283 | static struct freq_attr *p4clockmod_attr[] = { |
267 | &cpufreq_freq_attr_scaling_available_freqs, | 284 | &cpufreq_freq_attr_scaling_available_freqs, |
268 | NULL, | 285 | NULL, |
269 | }; | 286 | }; |
@@ -298,9 +315,10 @@ static int __init cpufreq_p4_init(void) | |||
298 | 315 | ||
299 | ret = cpufreq_register_driver(&p4clockmod_driver); | 316 | ret = cpufreq_register_driver(&p4clockmod_driver); |
300 | if (!ret) | 317 | if (!ret) |
301 | printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock Modulation available\n"); | 318 | printk(KERN_INFO PFX "P4/Xeon(TM) CPU On-Demand Clock " |
319 | "Modulation available\n"); | ||
302 | 320 | ||
303 | return (ret); | 321 | return ret; |
304 | } | 322 | } |
305 | 323 | ||
306 | 324 | ||
@@ -310,9 +328,9 @@ static void __exit cpufreq_p4_exit(void) | |||
310 | } | 328 | } |
311 | 329 | ||
312 | 330 | ||
313 | MODULE_AUTHOR ("Zwane Mwaikambo <zwane@commfireservices.com>"); | 331 | MODULE_AUTHOR("Zwane Mwaikambo <zwane@commfireservices.com>"); |
314 | MODULE_DESCRIPTION ("cpufreq driver for Pentium(TM) 4/Xeon(TM)"); | 332 | MODULE_DESCRIPTION("cpufreq driver for Pentium(TM) 4/Xeon(TM)"); |
315 | MODULE_LICENSE ("GPL"); | 333 | MODULE_LICENSE("GPL"); |
316 | 334 | ||
317 | late_initcall(cpufreq_p4_init); | 335 | late_initcall(cpufreq_p4_init); |
318 | module_exit(cpufreq_p4_exit); | 336 | module_exit(cpufreq_p4_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k6.c b/arch/x86/kernel/cpu/cpufreq/powernow-k6.c index c1ac5790c63e..f10dea409f40 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k6.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k6.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * This file was based upon code in Powertweak Linux (http://powertweak.sf.net) | 2 | * This file was based upon code in Powertweak Linux (http://powertweak.sf.net) |
3 | * (C) 2000-2003 Dave Jones, Arjan van de Ven, Janne Pänkälä, Dominik Brodowski. | 3 | * (C) 2000-2003 Dave Jones, Arjan van de Ven, Janne Pänkälä, |
4 | * Dominik Brodowski. | ||
4 | * | 5 | * |
5 | * Licensed under the terms of the GNU GPL License version 2. | 6 | * Licensed under the terms of the GNU GPL License version 2. |
6 | * | 7 | * |
@@ -13,14 +14,15 @@ | |||
13 | #include <linux/cpufreq.h> | 14 | #include <linux/cpufreq.h> |
14 | #include <linux/ioport.h> | 15 | #include <linux/ioport.h> |
15 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
16 | |||
17 | #include <asm/msr.h> | ||
18 | #include <linux/timex.h> | 17 | #include <linux/timex.h> |
19 | #include <linux/io.h> | 18 | #include <linux/io.h> |
20 | 19 | ||
20 | #include <asm/msr.h> | ||
21 | |||
21 | #define POWERNOW_IOPORT 0xfff0 /* it doesn't matter where, as long | 22 | #define POWERNOW_IOPORT 0xfff0 /* it doesn't matter where, as long |
22 | as it is unused */ | 23 | as it is unused */ |
23 | 24 | ||
25 | #define PFX "powernow-k6: " | ||
24 | static unsigned int busfreq; /* FSB, in 10 kHz */ | 26 | static unsigned int busfreq; /* FSB, in 10 kHz */ |
25 | static unsigned int max_multiplier; | 27 | static unsigned int max_multiplier; |
26 | 28 | ||
@@ -47,8 +49,8 @@ static struct cpufreq_frequency_table clock_ratio[] = { | |||
47 | */ | 49 | */ |
48 | static int powernow_k6_get_cpu_multiplier(void) | 50 | static int powernow_k6_get_cpu_multiplier(void) |
49 | { | 51 | { |
50 | u64 invalue = 0; | 52 | u64 invalue = 0; |
51 | u32 msrval; | 53 | u32 msrval; |
52 | 54 | ||
53 | msrval = POWERNOW_IOPORT + 0x1; | 55 | msrval = POWERNOW_IOPORT + 0x1; |
54 | wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ | 56 | wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */ |
@@ -68,12 +70,12 @@ static int powernow_k6_get_cpu_multiplier(void) | |||
68 | */ | 70 | */ |
69 | static void powernow_k6_set_state(unsigned int best_i) | 71 | static void powernow_k6_set_state(unsigned int best_i) |
70 | { | 72 | { |
71 | unsigned long outvalue = 0, invalue = 0; | 73 | unsigned long outvalue = 0, invalue = 0; |
72 | unsigned long msrval; | 74 | unsigned long msrval; |
73 | struct cpufreq_freqs freqs; | 75 | struct cpufreq_freqs freqs; |
74 | 76 | ||
75 | if (clock_ratio[best_i].index > max_multiplier) { | 77 | if (clock_ratio[best_i].index > max_multiplier) { |
76 | printk(KERN_ERR "cpufreq: invalid target frequency\n"); | 78 | printk(KERN_ERR PFX "invalid target frequency\n"); |
77 | return; | 79 | return; |
78 | } | 80 | } |
79 | 81 | ||
@@ -119,7 +121,8 @@ static int powernow_k6_verify(struct cpufreq_policy *policy) | |||
119 | * powernow_k6_setpolicy - sets a new CPUFreq policy | 121 | * powernow_k6_setpolicy - sets a new CPUFreq policy |
120 | * @policy: new policy | 122 | * @policy: new policy |
121 | * @target_freq: the target frequency | 123 | * @target_freq: the target frequency |
122 | * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | 124 | * @relation: how that frequency relates to achieved frequency |
125 | * (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | ||
123 | * | 126 | * |
124 | * sets a new CPUFreq policy | 127 | * sets a new CPUFreq policy |
125 | */ | 128 | */ |
@@ -127,9 +130,10 @@ static int powernow_k6_target(struct cpufreq_policy *policy, | |||
127 | unsigned int target_freq, | 130 | unsigned int target_freq, |
128 | unsigned int relation) | 131 | unsigned int relation) |
129 | { | 132 | { |
130 | unsigned int newstate = 0; | 133 | unsigned int newstate = 0; |
131 | 134 | ||
132 | if (cpufreq_frequency_table_target(policy, &clock_ratio[0], target_freq, relation, &newstate)) | 135 | if (cpufreq_frequency_table_target(policy, &clock_ratio[0], |
136 | target_freq, relation, &newstate)) | ||
133 | return -EINVAL; | 137 | return -EINVAL; |
134 | 138 | ||
135 | powernow_k6_set_state(newstate); | 139 | powernow_k6_set_state(newstate); |
@@ -140,7 +144,7 @@ static int powernow_k6_target(struct cpufreq_policy *policy, | |||
140 | 144 | ||
141 | static int powernow_k6_cpu_init(struct cpufreq_policy *policy) | 145 | static int powernow_k6_cpu_init(struct cpufreq_policy *policy) |
142 | { | 146 | { |
143 | unsigned int i; | 147 | unsigned int i, f; |
144 | int result; | 148 | int result; |
145 | 149 | ||
146 | if (policy->cpu != 0) | 150 | if (policy->cpu != 0) |
@@ -152,10 +156,11 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy) | |||
152 | 156 | ||
153 | /* table init */ | 157 | /* table init */ |
154 | for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { | 158 | for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) { |
155 | if (clock_ratio[i].index > max_multiplier) | 159 | f = clock_ratio[i].index; |
160 | if (f > max_multiplier) | ||
156 | clock_ratio[i].frequency = CPUFREQ_ENTRY_INVALID; | 161 | clock_ratio[i].frequency = CPUFREQ_ENTRY_INVALID; |
157 | else | 162 | else |
158 | clock_ratio[i].frequency = busfreq * clock_ratio[i].index; | 163 | clock_ratio[i].frequency = busfreq * f; |
159 | } | 164 | } |
160 | 165 | ||
161 | /* cpuinfo and default policy values */ | 166 | /* cpuinfo and default policy values */ |
@@ -185,7 +190,9 @@ static int powernow_k6_cpu_exit(struct cpufreq_policy *policy) | |||
185 | 190 | ||
186 | static unsigned int powernow_k6_get(unsigned int cpu) | 191 | static unsigned int powernow_k6_get(unsigned int cpu) |
187 | { | 192 | { |
188 | return busfreq * powernow_k6_get_cpu_multiplier(); | 193 | unsigned int ret; |
194 | ret = (busfreq * powernow_k6_get_cpu_multiplier()); | ||
195 | return ret; | ||
189 | } | 196 | } |
190 | 197 | ||
191 | static struct freq_attr *powernow_k6_attr[] = { | 198 | static struct freq_attr *powernow_k6_attr[] = { |
@@ -221,7 +228,7 @@ static int __init powernow_k6_init(void) | |||
221 | return -ENODEV; | 228 | return -ENODEV; |
222 | 229 | ||
223 | if (!request_region(POWERNOW_IOPORT, 16, "PowerNow!")) { | 230 | if (!request_region(POWERNOW_IOPORT, 16, "PowerNow!")) { |
224 | printk("cpufreq: PowerNow IOPORT region already used.\n"); | 231 | printk(KERN_INFO PFX "PowerNow IOPORT region already used.\n"); |
225 | return -EIO; | 232 | return -EIO; |
226 | } | 233 | } |
227 | 234 | ||
@@ -246,7 +253,8 @@ static void __exit powernow_k6_exit(void) | |||
246 | } | 253 | } |
247 | 254 | ||
248 | 255 | ||
249 | MODULE_AUTHOR("Arjan van de Ven, Dave Jones <davej@redhat.com>, Dominik Brodowski <linux@brodo.de>"); | 256 | MODULE_AUTHOR("Arjan van de Ven, Dave Jones <davej@redhat.com>, " |
257 | "Dominik Brodowski <linux@brodo.de>"); | ||
250 | MODULE_DESCRIPTION("PowerNow! driver for AMD K6-2+ / K6-3+ processors."); | 258 | MODULE_DESCRIPTION("PowerNow! driver for AMD K6-2+ / K6-3+ processors."); |
251 | MODULE_LICENSE("GPL"); | 259 | MODULE_LICENSE("GPL"); |
252 | 260 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k7.c b/arch/x86/kernel/cpu/cpufreq/powernow-k7.c index 1b446d79a8fd..3c28ccd49742 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k7.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k7.c | |||
@@ -6,10 +6,12 @@ | |||
6 | * Licensed under the terms of the GNU GPL License version 2. | 6 | * Licensed under the terms of the GNU GPL License version 2. |
7 | * Based upon datasheets & sample CPUs kindly provided by AMD. | 7 | * Based upon datasheets & sample CPUs kindly provided by AMD. |
8 | * | 8 | * |
9 | * Errata 5: Processor may fail to execute a FID/VID change in presence of interrupt. | 9 | * Errata 5: |
10 | * - We cli/sti on stepping A0 CPUs around the FID/VID transition. | 10 | * CPU may fail to execute a FID/VID change in presence of interrupt. |
11 | * Errata 15: Processors with half frequency multipliers may hang upon wakeup from disconnect. | 11 | * - We cli/sti on stepping A0 CPUs around the FID/VID transition. |
12 | * - We disable half multipliers if ACPI is used on A0 stepping CPUs. | 12 | * Errata 15: |
13 | * CPU with half frequency multipliers may hang upon wakeup from disconnect. | ||
14 | * - We disable half multipliers if ACPI is used on A0 stepping CPUs. | ||
13 | */ | 15 | */ |
14 | 16 | ||
15 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
@@ -20,11 +22,11 @@ | |||
20 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
21 | #include <linux/string.h> | 23 | #include <linux/string.h> |
22 | #include <linux/dmi.h> | 24 | #include <linux/dmi.h> |
25 | #include <linux/timex.h> | ||
26 | #include <linux/io.h> | ||
23 | 27 | ||
28 | #include <asm/timer.h> /* Needed for recalibrate_cpu_khz() */ | ||
24 | #include <asm/msr.h> | 29 | #include <asm/msr.h> |
25 | #include <asm/timer.h> | ||
26 | #include <asm/timex.h> | ||
27 | #include <asm/io.h> | ||
28 | #include <asm/system.h> | 30 | #include <asm/system.h> |
29 | 31 | ||
30 | #ifdef CONFIG_X86_POWERNOW_K7_ACPI | 32 | #ifdef CONFIG_X86_POWERNOW_K7_ACPI |
@@ -58,9 +60,9 @@ struct pst_s { | |||
58 | union powernow_acpi_control_t { | 60 | union powernow_acpi_control_t { |
59 | struct { | 61 | struct { |
60 | unsigned long fid:5, | 62 | unsigned long fid:5, |
61 | vid:5, | 63 | vid:5, |
62 | sgtc:20, | 64 | sgtc:20, |
63 | res1:2; | 65 | res1:2; |
64 | } bits; | 66 | } bits; |
65 | unsigned long val; | 67 | unsigned long val; |
66 | }; | 68 | }; |
@@ -94,14 +96,15 @@ static struct cpufreq_frequency_table *powernow_table; | |||
94 | 96 | ||
95 | static unsigned int can_scale_bus; | 97 | static unsigned int can_scale_bus; |
96 | static unsigned int can_scale_vid; | 98 | static unsigned int can_scale_vid; |
97 | static unsigned int minimum_speed=-1; | 99 | static unsigned int minimum_speed = -1; |
98 | static unsigned int maximum_speed; | 100 | static unsigned int maximum_speed; |
99 | static unsigned int number_scales; | 101 | static unsigned int number_scales; |
100 | static unsigned int fsb; | 102 | static unsigned int fsb; |
101 | static unsigned int latency; | 103 | static unsigned int latency; |
102 | static char have_a0; | 104 | static char have_a0; |
103 | 105 | ||
104 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "powernow-k7", msg) | 106 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
107 | "powernow-k7", msg) | ||
105 | 108 | ||
106 | static int check_fsb(unsigned int fsbspeed) | 109 | static int check_fsb(unsigned int fsbspeed) |
107 | { | 110 | { |
@@ -109,7 +112,7 @@ static int check_fsb(unsigned int fsbspeed) | |||
109 | unsigned int f = fsb / 1000; | 112 | unsigned int f = fsb / 1000; |
110 | 113 | ||
111 | delta = (fsbspeed > f) ? fsbspeed - f : f - fsbspeed; | 114 | delta = (fsbspeed > f) ? fsbspeed - f : f - fsbspeed; |
112 | return (delta < 5); | 115 | return delta < 5; |
113 | } | 116 | } |
114 | 117 | ||
115 | static int check_powernow(void) | 118 | static int check_powernow(void) |
@@ -117,24 +120,26 @@ static int check_powernow(void) | |||
117 | struct cpuinfo_x86 *c = &cpu_data(0); | 120 | struct cpuinfo_x86 *c = &cpu_data(0); |
118 | unsigned int maxei, eax, ebx, ecx, edx; | 121 | unsigned int maxei, eax, ebx, ecx, edx; |
119 | 122 | ||
120 | if ((c->x86_vendor != X86_VENDOR_AMD) || (c->x86 !=6)) { | 123 | if ((c->x86_vendor != X86_VENDOR_AMD) || (c->x86 != 6)) { |
121 | #ifdef MODULE | 124 | #ifdef MODULE |
122 | printk (KERN_INFO PFX "This module only works with AMD K7 CPUs\n"); | 125 | printk(KERN_INFO PFX "This module only works with " |
126 | "AMD K7 CPUs\n"); | ||
123 | #endif | 127 | #endif |
124 | return 0; | 128 | return 0; |
125 | } | 129 | } |
126 | 130 | ||
127 | /* Get maximum capabilities */ | 131 | /* Get maximum capabilities */ |
128 | maxei = cpuid_eax (0x80000000); | 132 | maxei = cpuid_eax(0x80000000); |
129 | if (maxei < 0x80000007) { /* Any powernow info ? */ | 133 | if (maxei < 0x80000007) { /* Any powernow info ? */ |
130 | #ifdef MODULE | 134 | #ifdef MODULE |
131 | printk (KERN_INFO PFX "No powernow capabilities detected\n"); | 135 | printk(KERN_INFO PFX "No powernow capabilities detected\n"); |
132 | #endif | 136 | #endif |
133 | return 0; | 137 | return 0; |
134 | } | 138 | } |
135 | 139 | ||
136 | if ((c->x86_model == 6) && (c->x86_mask == 0)) { | 140 | if ((c->x86_model == 6) && (c->x86_mask == 0)) { |
137 | printk (KERN_INFO PFX "K7 660[A0] core detected, enabling errata workarounds\n"); | 141 | printk(KERN_INFO PFX "K7 660[A0] core detected, " |
142 | "enabling errata workarounds\n"); | ||
138 | have_a0 = 1; | 143 | have_a0 = 1; |
139 | } | 144 | } |
140 | 145 | ||
@@ -144,37 +149,42 @@ static int check_powernow(void) | |||
144 | if (!(edx & (1 << 1 | 1 << 2))) | 149 | if (!(edx & (1 << 1 | 1 << 2))) |
145 | return 0; | 150 | return 0; |
146 | 151 | ||
147 | printk (KERN_INFO PFX "PowerNOW! Technology present. Can scale: "); | 152 | printk(KERN_INFO PFX "PowerNOW! Technology present. Can scale: "); |
148 | 153 | ||
149 | if (edx & 1 << 1) { | 154 | if (edx & 1 << 1) { |
150 | printk ("frequency"); | 155 | printk("frequency"); |
151 | can_scale_bus=1; | 156 | can_scale_bus = 1; |
152 | } | 157 | } |
153 | 158 | ||
154 | if ((edx & (1 << 1 | 1 << 2)) == 0x6) | 159 | if ((edx & (1 << 1 | 1 << 2)) == 0x6) |
155 | printk (" and "); | 160 | printk(" and "); |
156 | 161 | ||
157 | if (edx & 1 << 2) { | 162 | if (edx & 1 << 2) { |
158 | printk ("voltage"); | 163 | printk("voltage"); |
159 | can_scale_vid=1; | 164 | can_scale_vid = 1; |
160 | } | 165 | } |
161 | 166 | ||
162 | printk (".\n"); | 167 | printk(".\n"); |
163 | return 1; | 168 | return 1; |
164 | } | 169 | } |
165 | 170 | ||
171 | static void invalidate_entry(unsigned int entry) | ||
172 | { | ||
173 | powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID; | ||
174 | } | ||
166 | 175 | ||
167 | static int get_ranges (unsigned char *pst) | 176 | static int get_ranges(unsigned char *pst) |
168 | { | 177 | { |
169 | unsigned int j; | 178 | unsigned int j; |
170 | unsigned int speed; | 179 | unsigned int speed; |
171 | u8 fid, vid; | 180 | u8 fid, vid; |
172 | 181 | ||
173 | powernow_table = kzalloc((sizeof(struct cpufreq_frequency_table) * (number_scales + 1)), GFP_KERNEL); | 182 | powernow_table = kzalloc((sizeof(struct cpufreq_frequency_table) * |
183 | (number_scales + 1)), GFP_KERNEL); | ||
174 | if (!powernow_table) | 184 | if (!powernow_table) |
175 | return -ENOMEM; | 185 | return -ENOMEM; |
176 | 186 | ||
177 | for (j=0 ; j < number_scales; j++) { | 187 | for (j = 0 ; j < number_scales; j++) { |
178 | fid = *pst++; | 188 | fid = *pst++; |
179 | 189 | ||
180 | powernow_table[j].frequency = (fsb * fid_codes[fid]) / 10; | 190 | powernow_table[j].frequency = (fsb * fid_codes[fid]) / 10; |
@@ -182,10 +192,10 @@ static int get_ranges (unsigned char *pst) | |||
182 | 192 | ||
183 | speed = powernow_table[j].frequency; | 193 | speed = powernow_table[j].frequency; |
184 | 194 | ||
185 | if ((fid_codes[fid] % 10)==5) { | 195 | if ((fid_codes[fid] % 10) == 5) { |
186 | #ifdef CONFIG_X86_POWERNOW_K7_ACPI | 196 | #ifdef CONFIG_X86_POWERNOW_K7_ACPI |
187 | if (have_a0 == 1) | 197 | if (have_a0 == 1) |
188 | powernow_table[j].frequency = CPUFREQ_ENTRY_INVALID; | 198 | invalidate_entry(j); |
189 | #endif | 199 | #endif |
190 | } | 200 | } |
191 | 201 | ||
@@ -197,7 +207,7 @@ static int get_ranges (unsigned char *pst) | |||
197 | vid = *pst++; | 207 | vid = *pst++; |
198 | powernow_table[j].index |= (vid << 8); /* upper 8 bits */ | 208 | powernow_table[j].index |= (vid << 8); /* upper 8 bits */ |
199 | 209 | ||
200 | dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " | 210 | dprintk(" FID: 0x%x (%d.%dx [%dMHz]) " |
201 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, | 211 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, |
202 | fid_codes[fid] % 10, speed/1000, vid, | 212 | fid_codes[fid] % 10, speed/1000, vid, |
203 | mobile_vid_table[vid]/1000, | 213 | mobile_vid_table[vid]/1000, |
@@ -214,13 +224,13 @@ static void change_FID(int fid) | |||
214 | { | 224 | { |
215 | union msr_fidvidctl fidvidctl; | 225 | union msr_fidvidctl fidvidctl; |
216 | 226 | ||
217 | rdmsrl (MSR_K7_FID_VID_CTL, fidvidctl.val); | 227 | rdmsrl(MSR_K7_FID_VID_CTL, fidvidctl.val); |
218 | if (fidvidctl.bits.FID != fid) { | 228 | if (fidvidctl.bits.FID != fid) { |
219 | fidvidctl.bits.SGTC = latency; | 229 | fidvidctl.bits.SGTC = latency; |
220 | fidvidctl.bits.FID = fid; | 230 | fidvidctl.bits.FID = fid; |
221 | fidvidctl.bits.VIDC = 0; | 231 | fidvidctl.bits.VIDC = 0; |
222 | fidvidctl.bits.FIDC = 1; | 232 | fidvidctl.bits.FIDC = 1; |
223 | wrmsrl (MSR_K7_FID_VID_CTL, fidvidctl.val); | 233 | wrmsrl(MSR_K7_FID_VID_CTL, fidvidctl.val); |
224 | } | 234 | } |
225 | } | 235 | } |
226 | 236 | ||
@@ -229,18 +239,18 @@ static void change_VID(int vid) | |||
229 | { | 239 | { |
230 | union msr_fidvidctl fidvidctl; | 240 | union msr_fidvidctl fidvidctl; |
231 | 241 | ||
232 | rdmsrl (MSR_K7_FID_VID_CTL, fidvidctl.val); | 242 | rdmsrl(MSR_K7_FID_VID_CTL, fidvidctl.val); |
233 | if (fidvidctl.bits.VID != vid) { | 243 | if (fidvidctl.bits.VID != vid) { |
234 | fidvidctl.bits.SGTC = latency; | 244 | fidvidctl.bits.SGTC = latency; |
235 | fidvidctl.bits.VID = vid; | 245 | fidvidctl.bits.VID = vid; |
236 | fidvidctl.bits.FIDC = 0; | 246 | fidvidctl.bits.FIDC = 0; |
237 | fidvidctl.bits.VIDC = 1; | 247 | fidvidctl.bits.VIDC = 1; |
238 | wrmsrl (MSR_K7_FID_VID_CTL, fidvidctl.val); | 248 | wrmsrl(MSR_K7_FID_VID_CTL, fidvidctl.val); |
239 | } | 249 | } |
240 | } | 250 | } |
241 | 251 | ||
242 | 252 | ||
243 | static void change_speed (unsigned int index) | 253 | static void change_speed(unsigned int index) |
244 | { | 254 | { |
245 | u8 fid, vid; | 255 | u8 fid, vid; |
246 | struct cpufreq_freqs freqs; | 256 | struct cpufreq_freqs freqs; |
@@ -257,7 +267,7 @@ static void change_speed (unsigned int index) | |||
257 | 267 | ||
258 | freqs.cpu = 0; | 268 | freqs.cpu = 0; |
259 | 269 | ||
260 | rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val); | 270 | rdmsrl(MSR_K7_FID_VID_STATUS, fidvidstatus.val); |
261 | cfid = fidvidstatus.bits.CFID; | 271 | cfid = fidvidstatus.bits.CFID; |
262 | freqs.old = fsb * fid_codes[cfid] / 10; | 272 | freqs.old = fsb * fid_codes[cfid] / 10; |
263 | 273 | ||
@@ -321,12 +331,14 @@ static int powernow_acpi_init(void) | |||
321 | goto err1; | 331 | goto err1; |
322 | } | 332 | } |
323 | 333 | ||
324 | if (acpi_processor_perf->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) { | 334 | if (acpi_processor_perf->control_register.space_id != |
335 | ACPI_ADR_SPACE_FIXED_HARDWARE) { | ||
325 | retval = -ENODEV; | 336 | retval = -ENODEV; |
326 | goto err2; | 337 | goto err2; |
327 | } | 338 | } |
328 | 339 | ||
329 | if (acpi_processor_perf->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) { | 340 | if (acpi_processor_perf->status_register.space_id != |
341 | ACPI_ADR_SPACE_FIXED_HARDWARE) { | ||
330 | retval = -ENODEV; | 342 | retval = -ENODEV; |
331 | goto err2; | 343 | goto err2; |
332 | } | 344 | } |
@@ -338,7 +350,8 @@ static int powernow_acpi_init(void) | |||
338 | goto err2; | 350 | goto err2; |
339 | } | 351 | } |
340 | 352 | ||
341 | powernow_table = kzalloc((number_scales + 1) * (sizeof(struct cpufreq_frequency_table)), GFP_KERNEL); | 353 | powernow_table = kzalloc((sizeof(struct cpufreq_frequency_table) * |
354 | (number_scales + 1)), GFP_KERNEL); | ||
342 | if (!powernow_table) { | 355 | if (!powernow_table) { |
343 | retval = -ENOMEM; | 356 | retval = -ENOMEM; |
344 | goto err2; | 357 | goto err2; |
@@ -352,7 +365,7 @@ static int powernow_acpi_init(void) | |||
352 | unsigned int speed, speed_mhz; | 365 | unsigned int speed, speed_mhz; |
353 | 366 | ||
354 | pc.val = (unsigned long) state->control; | 367 | pc.val = (unsigned long) state->control; |
355 | dprintk ("acpi: P%d: %d MHz %d mW %d uS control %08x SGTC %d\n", | 368 | dprintk("acpi: P%d: %d MHz %d mW %d uS control %08x SGTC %d\n", |
356 | i, | 369 | i, |
357 | (u32) state->core_frequency, | 370 | (u32) state->core_frequency, |
358 | (u32) state->power, | 371 | (u32) state->power, |
@@ -381,12 +394,12 @@ static int powernow_acpi_init(void) | |||
381 | if (speed % 1000 > 0) | 394 | if (speed % 1000 > 0) |
382 | speed_mhz++; | 395 | speed_mhz++; |
383 | 396 | ||
384 | if ((fid_codes[fid] % 10)==5) { | 397 | if ((fid_codes[fid] % 10) == 5) { |
385 | if (have_a0 == 1) | 398 | if (have_a0 == 1) |
386 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 399 | invalidate_entry(i); |
387 | } | 400 | } |
388 | 401 | ||
389 | dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " | 402 | dprintk(" FID: 0x%x (%d.%dx [%dMHz]) " |
390 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, | 403 | "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, |
391 | fid_codes[fid] % 10, speed_mhz, vid, | 404 | fid_codes[fid] % 10, speed_mhz, vid, |
392 | mobile_vid_table[vid]/1000, | 405 | mobile_vid_table[vid]/1000, |
@@ -422,7 +435,8 @@ err1: | |||
422 | err05: | 435 | err05: |
423 | kfree(acpi_processor_perf); | 436 | kfree(acpi_processor_perf); |
424 | err0: | 437 | err0: |
425 | printk(KERN_WARNING PFX "ACPI perflib can not be used in this platform\n"); | 438 | printk(KERN_WARNING PFX "ACPI perflib can not be used on " |
439 | "this platform\n"); | ||
426 | acpi_processor_perf = NULL; | 440 | acpi_processor_perf = NULL; |
427 | return retval; | 441 | return retval; |
428 | } | 442 | } |
@@ -435,7 +449,14 @@ static int powernow_acpi_init(void) | |||
435 | } | 449 | } |
436 | #endif | 450 | #endif |
437 | 451 | ||
438 | static int powernow_decode_bios (int maxfid, int startvid) | 452 | static void print_pst_entry(struct pst_s *pst, unsigned int j) |
453 | { | ||
454 | dprintk("PST:%d (@%p)\n", j, pst); | ||
455 | dprintk(" cpuid: 0x%x fsb: %d maxFID: 0x%x startvid: 0x%x\n", | ||
456 | pst->cpuid, pst->fsbspeed, pst->maxfid, pst->startvid); | ||
457 | } | ||
458 | |||
459 | static int powernow_decode_bios(int maxfid, int startvid) | ||
439 | { | 460 | { |
440 | struct psb_s *psb; | 461 | struct psb_s *psb; |
441 | struct pst_s *pst; | 462 | struct pst_s *pst; |
@@ -446,61 +467,67 @@ static int powernow_decode_bios (int maxfid, int startvid) | |||
446 | 467 | ||
447 | etuple = cpuid_eax(0x80000001); | 468 | etuple = cpuid_eax(0x80000001); |
448 | 469 | ||
449 | for (i=0xC0000; i < 0xffff0 ; i+=16) { | 470 | for (i = 0xC0000; i < 0xffff0 ; i += 16) { |
450 | 471 | ||
451 | p = phys_to_virt(i); | 472 | p = phys_to_virt(i); |
452 | 473 | ||
453 | if (memcmp(p, "AMDK7PNOW!", 10) == 0){ | 474 | if (memcmp(p, "AMDK7PNOW!", 10) == 0) { |
454 | dprintk ("Found PSB header at %p\n", p); | 475 | dprintk("Found PSB header at %p\n", p); |
455 | psb = (struct psb_s *) p; | 476 | psb = (struct psb_s *) p; |
456 | dprintk ("Table version: 0x%x\n", psb->tableversion); | 477 | dprintk("Table version: 0x%x\n", psb->tableversion); |
457 | if (psb->tableversion != 0x12) { | 478 | if (psb->tableversion != 0x12) { |
458 | printk (KERN_INFO PFX "Sorry, only v1.2 tables supported right now\n"); | 479 | printk(KERN_INFO PFX "Sorry, only v1.2 tables" |
480 | " supported right now\n"); | ||
459 | return -ENODEV; | 481 | return -ENODEV; |
460 | } | 482 | } |
461 | 483 | ||
462 | dprintk ("Flags: 0x%x\n", psb->flags); | 484 | dprintk("Flags: 0x%x\n", psb->flags); |
463 | if ((psb->flags & 1)==0) { | 485 | if ((psb->flags & 1) == 0) |
464 | dprintk ("Mobile voltage regulator\n"); | 486 | dprintk("Mobile voltage regulator\n"); |
465 | } else { | 487 | else |
466 | dprintk ("Desktop voltage regulator\n"); | 488 | dprintk("Desktop voltage regulator\n"); |
467 | } | ||
468 | 489 | ||
469 | latency = psb->settlingtime; | 490 | latency = psb->settlingtime; |
470 | if (latency < 100) { | 491 | if (latency < 100) { |
471 | printk(KERN_INFO PFX "BIOS set settling time to %d microseconds. " | 492 | printk(KERN_INFO PFX "BIOS set settling time " |
472 | "Should be at least 100. Correcting.\n", latency); | 493 | "to %d microseconds. " |
494 | "Should be at least 100. " | ||
495 | "Correcting.\n", latency); | ||
473 | latency = 100; | 496 | latency = 100; |
474 | } | 497 | } |
475 | dprintk ("Settling Time: %d microseconds.\n", psb->settlingtime); | 498 | dprintk("Settling Time: %d microseconds.\n", |
476 | dprintk ("Has %d PST tables. (Only dumping ones relevant to this CPU).\n", psb->numpst); | 499 | psb->settlingtime); |
500 | dprintk("Has %d PST tables. (Only dumping ones " | ||
501 | "relevant to this CPU).\n", | ||
502 | psb->numpst); | ||
477 | 503 | ||
478 | p += sizeof (struct psb_s); | 504 | p += sizeof(struct psb_s); |
479 | 505 | ||
480 | pst = (struct pst_s *) p; | 506 | pst = (struct pst_s *) p; |
481 | 507 | ||
482 | for (j=0; j<psb->numpst; j++) { | 508 | for (j = 0; j < psb->numpst; j++) { |
483 | pst = (struct pst_s *) p; | 509 | pst = (struct pst_s *) p; |
484 | number_scales = pst->numpstates; | 510 | number_scales = pst->numpstates; |
485 | 511 | ||
486 | if ((etuple == pst->cpuid) && check_fsb(pst->fsbspeed) && | 512 | if ((etuple == pst->cpuid) && |
487 | (maxfid==pst->maxfid) && (startvid==pst->startvid)) | 513 | check_fsb(pst->fsbspeed) && |
488 | { | 514 | (maxfid == pst->maxfid) && |
489 | dprintk ("PST:%d (@%p)\n", j, pst); | 515 | (startvid == pst->startvid)) { |
490 | dprintk (" cpuid: 0x%x fsb: %d maxFID: 0x%x startvid: 0x%x\n", | 516 | print_pst_entry(pst, j); |
491 | pst->cpuid, pst->fsbspeed, pst->maxfid, pst->startvid); | 517 | p = (char *)pst + sizeof(struct pst_s); |
492 | 518 | ret = get_ranges(p); | |
493 | ret = get_ranges ((char *) pst + sizeof (struct pst_s)); | ||
494 | return ret; | 519 | return ret; |
495 | } else { | 520 | } else { |
496 | unsigned int k; | 521 | unsigned int k; |
497 | p = (char *) pst + sizeof (struct pst_s); | 522 | p = (char *)pst + sizeof(struct pst_s); |
498 | for (k=0; k<number_scales; k++) | 523 | for (k = 0; k < number_scales; k++) |
499 | p+=2; | 524 | p += 2; |
500 | } | 525 | } |
501 | } | 526 | } |
502 | printk (KERN_INFO PFX "No PST tables match this cpuid (0x%x)\n", etuple); | 527 | printk(KERN_INFO PFX "No PST tables match this cpuid " |
503 | printk (KERN_INFO PFX "This is indicative of a broken BIOS.\n"); | 528 | "(0x%x)\n", etuple); |
529 | printk(KERN_INFO PFX "This is indicative of a broken " | ||
530 | "BIOS.\n"); | ||
504 | 531 | ||
505 | return -EINVAL; | 532 | return -EINVAL; |
506 | } | 533 | } |
@@ -511,13 +538,14 @@ static int powernow_decode_bios (int maxfid, int startvid) | |||
511 | } | 538 | } |
512 | 539 | ||
513 | 540 | ||
514 | static int powernow_target (struct cpufreq_policy *policy, | 541 | static int powernow_target(struct cpufreq_policy *policy, |
515 | unsigned int target_freq, | 542 | unsigned int target_freq, |
516 | unsigned int relation) | 543 | unsigned int relation) |
517 | { | 544 | { |
518 | unsigned int newstate; | 545 | unsigned int newstate; |
519 | 546 | ||
520 | if (cpufreq_frequency_table_target(policy, powernow_table, target_freq, relation, &newstate)) | 547 | if (cpufreq_frequency_table_target(policy, powernow_table, target_freq, |
548 | relation, &newstate)) | ||
521 | return -EINVAL; | 549 | return -EINVAL; |
522 | 550 | ||
523 | change_speed(newstate); | 551 | change_speed(newstate); |
@@ -526,7 +554,7 @@ static int powernow_target (struct cpufreq_policy *policy, | |||
526 | } | 554 | } |
527 | 555 | ||
528 | 556 | ||
529 | static int powernow_verify (struct cpufreq_policy *policy) | 557 | static int powernow_verify(struct cpufreq_policy *policy) |
530 | { | 558 | { |
531 | return cpufreq_frequency_table_verify(policy, powernow_table); | 559 | return cpufreq_frequency_table_verify(policy, powernow_table); |
532 | } | 560 | } |
@@ -566,18 +594,23 @@ static unsigned int powernow_get(unsigned int cpu) | |||
566 | 594 | ||
567 | if (cpu) | 595 | if (cpu) |
568 | return 0; | 596 | return 0; |
569 | rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val); | 597 | rdmsrl(MSR_K7_FID_VID_STATUS, fidvidstatus.val); |
570 | cfid = fidvidstatus.bits.CFID; | 598 | cfid = fidvidstatus.bits.CFID; |
571 | 599 | ||
572 | return (fsb * fid_codes[cfid] / 10); | 600 | return fsb * fid_codes[cfid] / 10; |
573 | } | 601 | } |
574 | 602 | ||
575 | 603 | ||
576 | static int __init acer_cpufreq_pst(const struct dmi_system_id *d) | 604 | static int __init acer_cpufreq_pst(const struct dmi_system_id *d) |
577 | { | 605 | { |
578 | printk(KERN_WARNING "%s laptop with broken PST tables in BIOS detected.\n", d->ident); | 606 | printk(KERN_WARNING PFX |
579 | printk(KERN_WARNING "You need to downgrade to 3A21 (09/09/2002), or try a newer BIOS than 3A71 (01/20/2003)\n"); | 607 | "%s laptop with broken PST tables in BIOS detected.\n", |
580 | printk(KERN_WARNING "cpufreq scaling has been disabled as a result of this.\n"); | 608 | d->ident); |
609 | printk(KERN_WARNING PFX | ||
610 | "You need to downgrade to 3A21 (09/09/2002), or try a newer " | ||
611 | "BIOS than 3A71 (01/20/2003)\n"); | ||
612 | printk(KERN_WARNING PFX | ||
613 | "cpufreq scaling has been disabled as a result of this.\n"); | ||
581 | return 0; | 614 | return 0; |
582 | } | 615 | } |
583 | 616 | ||
@@ -598,7 +631,7 @@ static struct dmi_system_id __initdata powernow_dmi_table[] = { | |||
598 | { } | 631 | { } |
599 | }; | 632 | }; |
600 | 633 | ||
601 | static int __init powernow_cpu_init (struct cpufreq_policy *policy) | 634 | static int __init powernow_cpu_init(struct cpufreq_policy *policy) |
602 | { | 635 | { |
603 | union msr_fidvidstatus fidvidstatus; | 636 | union msr_fidvidstatus fidvidstatus; |
604 | int result; | 637 | int result; |
@@ -606,7 +639,7 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy) | |||
606 | if (policy->cpu != 0) | 639 | if (policy->cpu != 0) |
607 | return -ENODEV; | 640 | return -ENODEV; |
608 | 641 | ||
609 | rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val); | 642 | rdmsrl(MSR_K7_FID_VID_STATUS, fidvidstatus.val); |
610 | 643 | ||
611 | recalibrate_cpu_khz(); | 644 | recalibrate_cpu_khz(); |
612 | 645 | ||
@@ -618,19 +651,21 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy) | |||
618 | dprintk("FSB: %3dMHz\n", fsb/1000); | 651 | dprintk("FSB: %3dMHz\n", fsb/1000); |
619 | 652 | ||
620 | if (dmi_check_system(powernow_dmi_table) || acpi_force) { | 653 | if (dmi_check_system(powernow_dmi_table) || acpi_force) { |
621 | printk (KERN_INFO PFX "PSB/PST known to be broken. Trying ACPI instead\n"); | 654 | printk(KERN_INFO PFX "PSB/PST known to be broken. " |
655 | "Trying ACPI instead\n"); | ||
622 | result = powernow_acpi_init(); | 656 | result = powernow_acpi_init(); |
623 | } else { | 657 | } else { |
624 | result = powernow_decode_bios(fidvidstatus.bits.MFID, fidvidstatus.bits.SVID); | 658 | result = powernow_decode_bios(fidvidstatus.bits.MFID, |
659 | fidvidstatus.bits.SVID); | ||
625 | if (result) { | 660 | if (result) { |
626 | printk (KERN_INFO PFX "Trying ACPI perflib\n"); | 661 | printk(KERN_INFO PFX "Trying ACPI perflib\n"); |
627 | maximum_speed = 0; | 662 | maximum_speed = 0; |
628 | minimum_speed = -1; | 663 | minimum_speed = -1; |
629 | latency = 0; | 664 | latency = 0; |
630 | result = powernow_acpi_init(); | 665 | result = powernow_acpi_init(); |
631 | if (result) { | 666 | if (result) { |
632 | printk (KERN_INFO PFX "ACPI and legacy methods failed\n"); | 667 | printk(KERN_INFO PFX |
633 | printk (KERN_INFO PFX "See http://www.codemonkey.org.uk/projects/cpufreq/powernow-k7.html\n"); | 668 | "ACPI and legacy methods failed\n"); |
634 | } | 669 | } |
635 | } else { | 670 | } else { |
636 | /* SGTC use the bus clock as timer */ | 671 | /* SGTC use the bus clock as timer */ |
@@ -642,10 +677,11 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy) | |||
642 | if (result) | 677 | if (result) |
643 | return result; | 678 | return result; |
644 | 679 | ||
645 | printk (KERN_INFO PFX "Minimum speed %d MHz. Maximum speed %d MHz.\n", | 680 | printk(KERN_INFO PFX "Minimum speed %d MHz. Maximum speed %d MHz.\n", |
646 | minimum_speed/1000, maximum_speed/1000); | 681 | minimum_speed/1000, maximum_speed/1000); |
647 | 682 | ||
648 | policy->cpuinfo.transition_latency = cpufreq_scale(2000000UL, fsb, latency); | 683 | policy->cpuinfo.transition_latency = |
684 | cpufreq_scale(2000000UL, fsb, latency); | ||
649 | 685 | ||
650 | policy->cur = powernow_get(0); | 686 | policy->cur = powernow_get(0); |
651 | 687 | ||
@@ -654,7 +690,8 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy) | |||
654 | return cpufreq_frequency_table_cpuinfo(policy, powernow_table); | 690 | return cpufreq_frequency_table_cpuinfo(policy, powernow_table); |
655 | } | 691 | } |
656 | 692 | ||
657 | static int powernow_cpu_exit (struct cpufreq_policy *policy) { | 693 | static int powernow_cpu_exit(struct cpufreq_policy *policy) |
694 | { | ||
658 | cpufreq_frequency_table_put_attr(policy->cpu); | 695 | cpufreq_frequency_table_put_attr(policy->cpu); |
659 | 696 | ||
660 | #ifdef CONFIG_X86_POWERNOW_K7_ACPI | 697 | #ifdef CONFIG_X86_POWERNOW_K7_ACPI |
@@ -669,7 +706,7 @@ static int powernow_cpu_exit (struct cpufreq_policy *policy) { | |||
669 | return 0; | 706 | return 0; |
670 | } | 707 | } |
671 | 708 | ||
672 | static struct freq_attr* powernow_table_attr[] = { | 709 | static struct freq_attr *powernow_table_attr[] = { |
673 | &cpufreq_freq_attr_scaling_available_freqs, | 710 | &cpufreq_freq_attr_scaling_available_freqs, |
674 | NULL, | 711 | NULL, |
675 | }; | 712 | }; |
@@ -685,15 +722,15 @@ static struct cpufreq_driver powernow_driver = { | |||
685 | .attr = powernow_table_attr, | 722 | .attr = powernow_table_attr, |
686 | }; | 723 | }; |
687 | 724 | ||
688 | static int __init powernow_init (void) | 725 | static int __init powernow_init(void) |
689 | { | 726 | { |
690 | if (check_powernow()==0) | 727 | if (check_powernow() == 0) |
691 | return -ENODEV; | 728 | return -ENODEV; |
692 | return cpufreq_register_driver(&powernow_driver); | 729 | return cpufreq_register_driver(&powernow_driver); |
693 | } | 730 | } |
694 | 731 | ||
695 | 732 | ||
696 | static void __exit powernow_exit (void) | 733 | static void __exit powernow_exit(void) |
697 | { | 734 | { |
698 | cpufreq_unregister_driver(&powernow_driver); | 735 | cpufreq_unregister_driver(&powernow_driver); |
699 | } | 736 | } |
@@ -701,9 +738,9 @@ static void __exit powernow_exit (void) | |||
701 | module_param(acpi_force, int, 0444); | 738 | module_param(acpi_force, int, 0444); |
702 | MODULE_PARM_DESC(acpi_force, "Force ACPI to be used."); | 739 | MODULE_PARM_DESC(acpi_force, "Force ACPI to be used."); |
703 | 740 | ||
704 | MODULE_AUTHOR ("Dave Jones <davej@redhat.com>"); | 741 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>"); |
705 | MODULE_DESCRIPTION ("Powernow driver for AMD K7 processors."); | 742 | MODULE_DESCRIPTION("Powernow driver for AMD K7 processors."); |
706 | MODULE_LICENSE ("GPL"); | 743 | MODULE_LICENSE("GPL"); |
707 | 744 | ||
708 | late_initcall(powernow_init); | 745 | late_initcall(powernow_init); |
709 | module_exit(powernow_exit); | 746 | module_exit(powernow_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 6428aa17b40e..a15ac94e0b9b 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
@@ -33,16 +33,14 @@ | |||
33 | #include <linux/string.h> | 33 | #include <linux/string.h> |
34 | #include <linux/cpumask.h> | 34 | #include <linux/cpumask.h> |
35 | #include <linux/sched.h> /* for current / set_cpus_allowed() */ | 35 | #include <linux/sched.h> /* for current / set_cpus_allowed() */ |
36 | #include <linux/io.h> | ||
37 | #include <linux/delay.h> | ||
36 | 38 | ||
37 | #include <asm/msr.h> | 39 | #include <asm/msr.h> |
38 | #include <asm/io.h> | ||
39 | #include <asm/delay.h> | ||
40 | 40 | ||
41 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||
42 | #include <linux/acpi.h> | 41 | #include <linux/acpi.h> |
43 | #include <linux/mutex.h> | 42 | #include <linux/mutex.h> |
44 | #include <acpi/processor.h> | 43 | #include <acpi/processor.h> |
45 | #endif | ||
46 | 44 | ||
47 | #define PFX "powernow-k8: " | 45 | #define PFX "powernow-k8: " |
48 | #define VERSION "version 2.20.00" | 46 | #define VERSION "version 2.20.00" |
@@ -71,7 +69,8 @@ static u32 find_khz_freq_from_fid(u32 fid) | |||
71 | return 1000 * find_freq_from_fid(fid); | 69 | return 1000 * find_freq_from_fid(fid); |
72 | } | 70 | } |
73 | 71 | ||
74 | static u32 find_khz_freq_from_pstate(struct cpufreq_frequency_table *data, u32 pstate) | 72 | static u32 find_khz_freq_from_pstate(struct cpufreq_frequency_table *data, |
73 | u32 pstate) | ||
75 | { | 74 | { |
76 | return data[pstate].frequency; | 75 | return data[pstate].frequency; |
77 | } | 76 | } |
@@ -186,7 +185,9 @@ static int write_new_fid(struct powernow_k8_data *data, u32 fid) | |||
186 | return 1; | 185 | return 1; |
187 | } | 186 | } |
188 | 187 | ||
189 | lo = fid | (data->currvid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID; | 188 | lo = fid; |
189 | lo |= (data->currvid << MSR_C_LO_VID_SHIFT); | ||
190 | lo |= MSR_C_LO_INIT_FID_VID; | ||
190 | 191 | ||
191 | dprintk("writing fid 0x%x, lo 0x%x, hi 0x%x\n", | 192 | dprintk("writing fid 0x%x, lo 0x%x, hi 0x%x\n", |
192 | fid, lo, data->plllock * PLL_LOCK_CONVERSION); | 193 | fid, lo, data->plllock * PLL_LOCK_CONVERSION); |
@@ -194,7 +195,9 @@ static int write_new_fid(struct powernow_k8_data *data, u32 fid) | |||
194 | do { | 195 | do { |
195 | wrmsr(MSR_FIDVID_CTL, lo, data->plllock * PLL_LOCK_CONVERSION); | 196 | wrmsr(MSR_FIDVID_CTL, lo, data->plllock * PLL_LOCK_CONVERSION); |
196 | if (i++ > 100) { | 197 | if (i++ > 100) { |
197 | printk(KERN_ERR PFX "Hardware error - pending bit very stuck - no further pstate changes possible\n"); | 198 | printk(KERN_ERR PFX |
199 | "Hardware error - pending bit very stuck - " | ||
200 | "no further pstate changes possible\n"); | ||
198 | return 1; | 201 | return 1; |
199 | } | 202 | } |
200 | } while (query_current_values_with_pending_wait(data)); | 203 | } while (query_current_values_with_pending_wait(data)); |
@@ -202,14 +205,16 @@ static int write_new_fid(struct powernow_k8_data *data, u32 fid) | |||
202 | count_off_irt(data); | 205 | count_off_irt(data); |
203 | 206 | ||
204 | if (savevid != data->currvid) { | 207 | if (savevid != data->currvid) { |
205 | printk(KERN_ERR PFX "vid change on fid trans, old 0x%x, new 0x%x\n", | 208 | printk(KERN_ERR PFX |
206 | savevid, data->currvid); | 209 | "vid change on fid trans, old 0x%x, new 0x%x\n", |
210 | savevid, data->currvid); | ||
207 | return 1; | 211 | return 1; |
208 | } | 212 | } |
209 | 213 | ||
210 | if (fid != data->currfid) { | 214 | if (fid != data->currfid) { |
211 | printk(KERN_ERR PFX "fid trans failed, fid 0x%x, curr 0x%x\n", fid, | 215 | printk(KERN_ERR PFX |
212 | data->currfid); | 216 | "fid trans failed, fid 0x%x, curr 0x%x\n", fid, |
217 | data->currfid); | ||
213 | return 1; | 218 | return 1; |
214 | } | 219 | } |
215 | 220 | ||
@@ -228,7 +233,9 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid) | |||
228 | return 1; | 233 | return 1; |
229 | } | 234 | } |
230 | 235 | ||
231 | lo = data->currfid | (vid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID; | 236 | lo = data->currfid; |
237 | lo |= (vid << MSR_C_LO_VID_SHIFT); | ||
238 | lo |= MSR_C_LO_INIT_FID_VID; | ||
232 | 239 | ||
233 | dprintk("writing vid 0x%x, lo 0x%x, hi 0x%x\n", | 240 | dprintk("writing vid 0x%x, lo 0x%x, hi 0x%x\n", |
234 | vid, lo, STOP_GRANT_5NS); | 241 | vid, lo, STOP_GRANT_5NS); |
@@ -236,20 +243,24 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid) | |||
236 | do { | 243 | do { |
237 | wrmsr(MSR_FIDVID_CTL, lo, STOP_GRANT_5NS); | 244 | wrmsr(MSR_FIDVID_CTL, lo, STOP_GRANT_5NS); |
238 | if (i++ > 100) { | 245 | if (i++ > 100) { |
239 | printk(KERN_ERR PFX "internal error - pending bit very stuck - no further pstate changes possible\n"); | 246 | printk(KERN_ERR PFX "internal error - pending bit " |
247 | "very stuck - no further pstate " | ||
248 | "changes possible\n"); | ||
240 | return 1; | 249 | return 1; |
241 | } | 250 | } |
242 | } while (query_current_values_with_pending_wait(data)); | 251 | } while (query_current_values_with_pending_wait(data)); |
243 | 252 | ||
244 | if (savefid != data->currfid) { | 253 | if (savefid != data->currfid) { |
245 | printk(KERN_ERR PFX "fid changed on vid trans, old 0x%x new 0x%x\n", | 254 | printk(KERN_ERR PFX "fid changed on vid trans, old " |
255 | "0x%x new 0x%x\n", | ||
246 | savefid, data->currfid); | 256 | savefid, data->currfid); |
247 | return 1; | 257 | return 1; |
248 | } | 258 | } |
249 | 259 | ||
250 | if (vid != data->currvid) { | 260 | if (vid != data->currvid) { |
251 | printk(KERN_ERR PFX "vid trans failed, vid 0x%x, curr 0x%x\n", vid, | 261 | printk(KERN_ERR PFX "vid trans failed, vid 0x%x, " |
252 | data->currvid); | 262 | "curr 0x%x\n", |
263 | vid, data->currvid); | ||
253 | return 1; | 264 | return 1; |
254 | } | 265 | } |
255 | 266 | ||
@@ -261,7 +272,8 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid) | |||
261 | * Decreasing vid codes represent increasing voltages: | 272 | * Decreasing vid codes represent increasing voltages: |
262 | * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of VID_OFF is off. | 273 | * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of VID_OFF is off. |
263 | */ | 274 | */ |
264 | static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step) | 275 | static int decrease_vid_code_by_step(struct powernow_k8_data *data, |
276 | u32 reqvid, u32 step) | ||
265 | { | 277 | { |
266 | if ((data->currvid - reqvid) > step) | 278 | if ((data->currvid - reqvid) > step) |
267 | reqvid = data->currvid - step; | 279 | reqvid = data->currvid - step; |
@@ -283,7 +295,8 @@ static int transition_pstate(struct powernow_k8_data *data, u32 pstate) | |||
283 | } | 295 | } |
284 | 296 | ||
285 | /* Change Opteron/Athlon64 fid and vid, by the 3 phases. */ | 297 | /* Change Opteron/Athlon64 fid and vid, by the 3 phases. */ |
286 | static int transition_fid_vid(struct powernow_k8_data *data, u32 reqfid, u32 reqvid) | 298 | static int transition_fid_vid(struct powernow_k8_data *data, |
299 | u32 reqfid, u32 reqvid) | ||
287 | { | 300 | { |
288 | if (core_voltage_pre_transition(data, reqvid)) | 301 | if (core_voltage_pre_transition(data, reqvid)) |
289 | return 1; | 302 | return 1; |
@@ -298,7 +311,8 @@ static int transition_fid_vid(struct powernow_k8_data *data, u32 reqfid, u32 req | |||
298 | return 1; | 311 | return 1; |
299 | 312 | ||
300 | if ((reqfid != data->currfid) || (reqvid != data->currvid)) { | 313 | if ((reqfid != data->currfid) || (reqvid != data->currvid)) { |
301 | printk(KERN_ERR PFX "failed (cpu%d): req 0x%x 0x%x, curr 0x%x 0x%x\n", | 314 | printk(KERN_ERR PFX "failed (cpu%d): req 0x%x 0x%x, " |
315 | "curr 0x%x 0x%x\n", | ||
302 | smp_processor_id(), | 316 | smp_processor_id(), |
303 | reqfid, reqvid, data->currfid, data->currvid); | 317 | reqfid, reqvid, data->currfid, data->currvid); |
304 | return 1; | 318 | return 1; |
@@ -311,13 +325,15 @@ static int transition_fid_vid(struct powernow_k8_data *data, u32 reqfid, u32 req | |||
311 | } | 325 | } |
312 | 326 | ||
313 | /* Phase 1 - core voltage transition ... setup voltage */ | 327 | /* Phase 1 - core voltage transition ... setup voltage */ |
314 | static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid) | 328 | static int core_voltage_pre_transition(struct powernow_k8_data *data, |
329 | u32 reqvid) | ||
315 | { | 330 | { |
316 | u32 rvosteps = data->rvo; | 331 | u32 rvosteps = data->rvo; |
317 | u32 savefid = data->currfid; | 332 | u32 savefid = data->currfid; |
318 | u32 maxvid, lo; | 333 | u32 maxvid, lo; |
319 | 334 | ||
320 | dprintk("ph1 (cpu%d): start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo 0x%x\n", | 335 | dprintk("ph1 (cpu%d): start, currfid 0x%x, currvid 0x%x, " |
336 | "reqvid 0x%x, rvo 0x%x\n", | ||
321 | smp_processor_id(), | 337 | smp_processor_id(), |
322 | data->currfid, data->currvid, reqvid, data->rvo); | 338 | data->currfid, data->currvid, reqvid, data->rvo); |
323 | 339 | ||
@@ -340,7 +356,7 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid | |||
340 | } else { | 356 | } else { |
341 | dprintk("ph1: changing vid for rvo, req 0x%x\n", | 357 | dprintk("ph1: changing vid for rvo, req 0x%x\n", |
342 | data->currvid - 1); | 358 | data->currvid - 1); |
343 | if (decrease_vid_code_by_step(data, data->currvid - 1, 1)) | 359 | if (decrease_vid_code_by_step(data, data->currvid-1, 1)) |
344 | return 1; | 360 | return 1; |
345 | rvosteps--; | 361 | rvosteps--; |
346 | } | 362 | } |
@@ -350,7 +366,8 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid | |||
350 | return 1; | 366 | return 1; |
351 | 367 | ||
352 | if (savefid != data->currfid) { | 368 | if (savefid != data->currfid) { |
353 | printk(KERN_ERR PFX "ph1 err, currfid changed 0x%x\n", data->currfid); | 369 | printk(KERN_ERR PFX "ph1 err, currfid changed 0x%x\n", |
370 | data->currfid); | ||
354 | return 1; | 371 | return 1; |
355 | } | 372 | } |
356 | 373 | ||
@@ -363,20 +380,24 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid | |||
363 | /* Phase 2 - core frequency transition */ | 380 | /* Phase 2 - core frequency transition */ |
364 | static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid) | 381 | static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid) |
365 | { | 382 | { |
366 | u32 vcoreqfid, vcocurrfid, vcofiddiff, fid_interval, savevid = data->currvid; | 383 | u32 vcoreqfid, vcocurrfid, vcofiddiff; |
384 | u32 fid_interval, savevid = data->currvid; | ||
367 | 385 | ||
368 | if ((reqfid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) { | 386 | if ((reqfid < HI_FID_TABLE_BOTTOM) && |
369 | printk(KERN_ERR PFX "ph2: illegal lo-lo transition 0x%x 0x%x\n", | 387 | (data->currfid < HI_FID_TABLE_BOTTOM)) { |
370 | reqfid, data->currfid); | 388 | printk(KERN_ERR PFX "ph2: illegal lo-lo transition " |
389 | "0x%x 0x%x\n", reqfid, data->currfid); | ||
371 | return 1; | 390 | return 1; |
372 | } | 391 | } |
373 | 392 | ||
374 | if (data->currfid == reqfid) { | 393 | if (data->currfid == reqfid) { |
375 | printk(KERN_ERR PFX "ph2 null fid transition 0x%x\n", data->currfid); | 394 | printk(KERN_ERR PFX "ph2 null fid transition 0x%x\n", |
395 | data->currfid); | ||
376 | return 0; | 396 | return 0; |
377 | } | 397 | } |
378 | 398 | ||
379 | dprintk("ph2 (cpu%d): starting, currfid 0x%x, currvid 0x%x, reqfid 0x%x\n", | 399 | dprintk("ph2 (cpu%d): starting, currfid 0x%x, currvid 0x%x, " |
400 | "reqfid 0x%x\n", | ||
380 | smp_processor_id(), | 401 | smp_processor_id(), |
381 | data->currfid, data->currvid, reqfid); | 402 | data->currfid, data->currvid, reqfid); |
382 | 403 | ||
@@ -390,14 +411,14 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid) | |||
390 | 411 | ||
391 | if (reqfid > data->currfid) { | 412 | if (reqfid > data->currfid) { |
392 | if (data->currfid > LO_FID_TABLE_TOP) { | 413 | if (data->currfid > LO_FID_TABLE_TOP) { |
393 | if (write_new_fid(data, data->currfid + fid_interval)) { | 414 | if (write_new_fid(data, |
415 | data->currfid + fid_interval)) | ||
394 | return 1; | 416 | return 1; |
395 | } | ||
396 | } else { | 417 | } else { |
397 | if (write_new_fid | 418 | if (write_new_fid |
398 | (data, 2 + convert_fid_to_vco_fid(data->currfid))) { | 419 | (data, |
420 | 2 + convert_fid_to_vco_fid(data->currfid))) | ||
399 | return 1; | 421 | return 1; |
400 | } | ||
401 | } | 422 | } |
402 | } else { | 423 | } else { |
403 | if (write_new_fid(data, data->currfid - fid_interval)) | 424 | if (write_new_fid(data, data->currfid - fid_interval)) |
@@ -417,7 +438,8 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid) | |||
417 | 438 | ||
418 | if (data->currfid != reqfid) { | 439 | if (data->currfid != reqfid) { |
419 | printk(KERN_ERR PFX | 440 | printk(KERN_ERR PFX |
420 | "ph2: mismatch, failed fid transition, curr 0x%x, req 0x%x\n", | 441 | "ph2: mismatch, failed fid transition, " |
442 | "curr 0x%x, req 0x%x\n", | ||
421 | data->currfid, reqfid); | 443 | data->currfid, reqfid); |
422 | return 1; | 444 | return 1; |
423 | } | 445 | } |
@@ -435,7 +457,8 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid) | |||
435 | } | 457 | } |
436 | 458 | ||
437 | /* Phase 3 - core voltage transition flow ... jump to the final vid. */ | 459 | /* Phase 3 - core voltage transition flow ... jump to the final vid. */ |
438 | static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvid) | 460 | static int core_voltage_post_transition(struct powernow_k8_data *data, |
461 | u32 reqvid) | ||
439 | { | 462 | { |
440 | u32 savefid = data->currfid; | 463 | u32 savefid = data->currfid; |
441 | u32 savereqvid = reqvid; | 464 | u32 savereqvid = reqvid; |
@@ -457,7 +480,8 @@ static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvi | |||
457 | 480 | ||
458 | if (data->currvid != reqvid) { | 481 | if (data->currvid != reqvid) { |
459 | printk(KERN_ERR PFX | 482 | printk(KERN_ERR PFX |
460 | "ph3: failed vid transition\n, req 0x%x, curr 0x%x", | 483 | "ph3: failed vid transition\n, " |
484 | "req 0x%x, curr 0x%x", | ||
461 | reqvid, data->currvid); | 485 | reqvid, data->currvid); |
462 | return 1; | 486 | return 1; |
463 | } | 487 | } |
@@ -508,7 +532,8 @@ static int check_supported_cpu(unsigned int cpu) | |||
508 | if ((eax & CPUID_XFAM) == CPUID_XFAM_K8) { | 532 | if ((eax & CPUID_XFAM) == CPUID_XFAM_K8) { |
509 | if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || | 533 | if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || |
510 | ((eax & CPUID_XMOD) > CPUID_XMOD_REV_MASK)) { | 534 | ((eax & CPUID_XMOD) > CPUID_XMOD_REV_MASK)) { |
511 | printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); | 535 | printk(KERN_INFO PFX |
536 | "Processor cpuid %x not supported\n", eax); | ||
512 | goto out; | 537 | goto out; |
513 | } | 538 | } |
514 | 539 | ||
@@ -520,8 +545,10 @@ static int check_supported_cpu(unsigned int cpu) | |||
520 | } | 545 | } |
521 | 546 | ||
522 | cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); | 547 | cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); |
523 | if ((edx & P_STATE_TRANSITION_CAPABLE) != P_STATE_TRANSITION_CAPABLE) { | 548 | if ((edx & P_STATE_TRANSITION_CAPABLE) |
524 | printk(KERN_INFO PFX "Power state transitions not supported\n"); | 549 | != P_STATE_TRANSITION_CAPABLE) { |
550 | printk(KERN_INFO PFX | ||
551 | "Power state transitions not supported\n"); | ||
525 | goto out; | 552 | goto out; |
526 | } | 553 | } |
527 | } else { /* must be a HW Pstate capable processor */ | 554 | } else { /* must be a HW Pstate capable processor */ |
@@ -539,7 +566,8 @@ out: | |||
539 | return rc; | 566 | return rc; |
540 | } | 567 | } |
541 | 568 | ||
542 | static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 maxvid) | 569 | static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, |
570 | u8 maxvid) | ||
543 | { | 571 | { |
544 | unsigned int j; | 572 | unsigned int j; |
545 | u8 lastfid = 0xff; | 573 | u8 lastfid = 0xff; |
@@ -550,12 +578,14 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 | |||
550 | j, pst[j].vid); | 578 | j, pst[j].vid); |
551 | return -EINVAL; | 579 | return -EINVAL; |
552 | } | 580 | } |
553 | if (pst[j].vid < data->rvo) { /* vid + rvo >= 0 */ | 581 | if (pst[j].vid < data->rvo) { |
582 | /* vid + rvo >= 0 */ | ||
554 | printk(KERN_ERR FW_BUG PFX "0 vid exceeded with pstate" | 583 | printk(KERN_ERR FW_BUG PFX "0 vid exceeded with pstate" |
555 | " %d\n", j); | 584 | " %d\n", j); |
556 | return -ENODEV; | 585 | return -ENODEV; |
557 | } | 586 | } |
558 | if (pst[j].vid < maxvid + data->rvo) { /* vid + rvo >= maxvid */ | 587 | if (pst[j].vid < maxvid + data->rvo) { |
588 | /* vid + rvo >= maxvid */ | ||
559 | printk(KERN_ERR FW_BUG PFX "maxvid exceeded with pstate" | 589 | printk(KERN_ERR FW_BUG PFX "maxvid exceeded with pstate" |
560 | " %d\n", j); | 590 | " %d\n", j); |
561 | return -ENODEV; | 591 | return -ENODEV; |
@@ -579,23 +609,31 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 | |||
579 | return -EINVAL; | 609 | return -EINVAL; |
580 | } | 610 | } |
581 | if (lastfid > LO_FID_TABLE_TOP) | 611 | if (lastfid > LO_FID_TABLE_TOP) |
582 | printk(KERN_INFO FW_BUG PFX "first fid not from lo freq table\n"); | 612 | printk(KERN_INFO FW_BUG PFX |
613 | "first fid not from lo freq table\n"); | ||
583 | 614 | ||
584 | return 0; | 615 | return 0; |
585 | } | 616 | } |
586 | 617 | ||
618 | static void invalidate_entry(struct powernow_k8_data *data, unsigned int entry) | ||
619 | { | ||
620 | data->powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID; | ||
621 | } | ||
622 | |||
587 | static void print_basics(struct powernow_k8_data *data) | 623 | static void print_basics(struct powernow_k8_data *data) |
588 | { | 624 | { |
589 | int j; | 625 | int j; |
590 | for (j = 0; j < data->numps; j++) { | 626 | for (j = 0; j < data->numps; j++) { |
591 | if (data->powernow_table[j].frequency != CPUFREQ_ENTRY_INVALID) { | 627 | if (data->powernow_table[j].frequency != |
628 | CPUFREQ_ENTRY_INVALID) { | ||
592 | if (cpu_family == CPU_HW_PSTATE) { | 629 | if (cpu_family == CPU_HW_PSTATE) { |
593 | printk(KERN_INFO PFX " %d : pstate %d (%d MHz)\n", | 630 | printk(KERN_INFO PFX |
594 | j, | 631 | " %d : pstate %d (%d MHz)\n", j, |
595 | data->powernow_table[j].index, | 632 | data->powernow_table[j].index, |
596 | data->powernow_table[j].frequency/1000); | 633 | data->powernow_table[j].frequency/1000); |
597 | } else { | 634 | } else { |
598 | printk(KERN_INFO PFX " %d : fid 0x%x (%d MHz), vid 0x%x\n", | 635 | printk(KERN_INFO PFX |
636 | " %d : fid 0x%x (%d MHz), vid 0x%x\n", | ||
599 | j, | 637 | j, |
600 | data->powernow_table[j].index & 0xff, | 638 | data->powernow_table[j].index & 0xff, |
601 | data->powernow_table[j].frequency/1000, | 639 | data->powernow_table[j].frequency/1000, |
@@ -604,20 +642,25 @@ static void print_basics(struct powernow_k8_data *data) | |||
604 | } | 642 | } |
605 | } | 643 | } |
606 | if (data->batps) | 644 | if (data->batps) |
607 | printk(KERN_INFO PFX "Only %d pstates on battery\n", data->batps); | 645 | printk(KERN_INFO PFX "Only %d pstates on battery\n", |
646 | data->batps); | ||
608 | } | 647 | } |
609 | 648 | ||
610 | static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst, u8 maxvid) | 649 | static int fill_powernow_table(struct powernow_k8_data *data, |
650 | struct pst_s *pst, u8 maxvid) | ||
611 | { | 651 | { |
612 | struct cpufreq_frequency_table *powernow_table; | 652 | struct cpufreq_frequency_table *powernow_table; |
613 | unsigned int j; | 653 | unsigned int j; |
614 | 654 | ||
615 | if (data->batps) { /* use ACPI support to get full speed on mains power */ | 655 | if (data->batps) { |
616 | printk(KERN_WARNING PFX "Only %d pstates usable (use ACPI driver for full range\n", data->batps); | 656 | /* use ACPI support to get full speed on mains power */ |
657 | printk(KERN_WARNING PFX | ||
658 | "Only %d pstates usable (use ACPI driver for full " | ||
659 | "range\n", data->batps); | ||
617 | data->numps = data->batps; | 660 | data->numps = data->batps; |
618 | } | 661 | } |
619 | 662 | ||
620 | for ( j=1; j<data->numps; j++ ) { | 663 | for (j = 1; j < data->numps; j++) { |
621 | if (pst[j-1].fid >= pst[j].fid) { | 664 | if (pst[j-1].fid >= pst[j].fid) { |
622 | printk(KERN_ERR PFX "PST out of sequence\n"); | 665 | printk(KERN_ERR PFX "PST out of sequence\n"); |
623 | return -EINVAL; | 666 | return -EINVAL; |
@@ -640,9 +683,11 @@ static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst, | |||
640 | } | 683 | } |
641 | 684 | ||
642 | for (j = 0; j < data->numps; j++) { | 685 | for (j = 0; j < data->numps; j++) { |
686 | int freq; | ||
643 | powernow_table[j].index = pst[j].fid; /* lower 8 bits */ | 687 | powernow_table[j].index = pst[j].fid; /* lower 8 bits */ |
644 | powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */ | 688 | powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */ |
645 | powernow_table[j].frequency = find_khz_freq_from_fid(pst[j].fid); | 689 | freq = find_khz_freq_from_fid(pst[j].fid); |
690 | powernow_table[j].frequency = freq; | ||
646 | } | 691 | } |
647 | powernow_table[data->numps].frequency = CPUFREQ_TABLE_END; | 692 | powernow_table[data->numps].frequency = CPUFREQ_TABLE_END; |
648 | powernow_table[data->numps].index = 0; | 693 | powernow_table[data->numps].index = 0; |
@@ -658,7 +703,8 @@ static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst, | |||
658 | print_basics(data); | 703 | print_basics(data); |
659 | 704 | ||
660 | for (j = 0; j < data->numps; j++) | 705 | for (j = 0; j < data->numps; j++) |
661 | if ((pst[j].fid==data->currfid) && (pst[j].vid==data->currvid)) | 706 | if ((pst[j].fid == data->currfid) && |
707 | (pst[j].vid == data->currvid)) | ||
662 | return 0; | 708 | return 0; |
663 | 709 | ||
664 | dprintk("currfid/vid do not match PST, ignoring\n"); | 710 | dprintk("currfid/vid do not match PST, ignoring\n"); |
@@ -698,7 +744,8 @@ static int find_psb_table(struct powernow_k8_data *data) | |||
698 | } | 744 | } |
699 | 745 | ||
700 | data->vstable = psb->vstable; | 746 | data->vstable = psb->vstable; |
701 | dprintk("voltage stabilization time: %d(*20us)\n", data->vstable); | 747 | dprintk("voltage stabilization time: %d(*20us)\n", |
748 | data->vstable); | ||
702 | 749 | ||
703 | dprintk("flags2: 0x%x\n", psb->flags2); | 750 | dprintk("flags2: 0x%x\n", psb->flags2); |
704 | data->rvo = psb->flags2 & 3; | 751 | data->rvo = psb->flags2 & 3; |
@@ -713,11 +760,12 @@ static int find_psb_table(struct powernow_k8_data *data) | |||
713 | 760 | ||
714 | dprintk("numpst: 0x%x\n", psb->num_tables); | 761 | dprintk("numpst: 0x%x\n", psb->num_tables); |
715 | cpst = psb->num_tables; | 762 | cpst = psb->num_tables; |
716 | if ((psb->cpuid == 0x00000fc0) || (psb->cpuid == 0x00000fe0) ){ | 763 | if ((psb->cpuid == 0x00000fc0) || |
764 | (psb->cpuid == 0x00000fe0)) { | ||
717 | thiscpuid = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); | 765 | thiscpuid = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); |
718 | if ((thiscpuid == 0x00000fc0) || (thiscpuid == 0x00000fe0) ) { | 766 | if ((thiscpuid == 0x00000fc0) || |
767 | (thiscpuid == 0x00000fe0)) | ||
719 | cpst = 1; | 768 | cpst = 1; |
720 | } | ||
721 | } | 769 | } |
722 | if (cpst != 1) { | 770 | if (cpst != 1) { |
723 | printk(KERN_ERR FW_BUG PFX "numpst must be 1\n"); | 771 | printk(KERN_ERR FW_BUG PFX "numpst must be 1\n"); |
@@ -732,7 +780,8 @@ static int find_psb_table(struct powernow_k8_data *data) | |||
732 | 780 | ||
733 | data->numps = psb->numps; | 781 | data->numps = psb->numps; |
734 | dprintk("numpstates: 0x%x\n", data->numps); | 782 | dprintk("numpstates: 0x%x\n", data->numps); |
735 | return fill_powernow_table(data, (struct pst_s *)(psb+1), maxvid); | 783 | return fill_powernow_table(data, |
784 | (struct pst_s *)(psb+1), maxvid); | ||
736 | } | 785 | } |
737 | /* | 786 | /* |
738 | * If you see this message, complain to BIOS manufacturer. If | 787 | * If you see this message, complain to BIOS manufacturer. If |
@@ -745,28 +794,31 @@ static int find_psb_table(struct powernow_k8_data *data) | |||
745 | * BIOS and Kernel Developer's Guide, which is available on | 794 | * BIOS and Kernel Developer's Guide, which is available on |
746 | * www.amd.com | 795 | * www.amd.com |
747 | */ | 796 | */ |
748 | printk(KERN_ERR PFX "BIOS error - no PSB or ACPI _PSS objects\n"); | 797 | printk(KERN_ERR FW_BUG PFX "No PSB or ACPI _PSS objects\n"); |
749 | return -ENODEV; | 798 | return -ENODEV; |
750 | } | 799 | } |
751 | 800 | ||
752 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | 801 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, |
753 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) | 802 | unsigned int index) |
754 | { | 803 | { |
804 | acpi_integer control; | ||
805 | |||
755 | if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE)) | 806 | if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE)) |
756 | return; | 807 | return; |
757 | 808 | ||
758 | data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK; | 809 | control = data->acpi_data.states[index].control; data->irt = (control |
759 | data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK; | 810 | >> IRT_SHIFT) & IRT_MASK; data->rvo = (control >> |
760 | data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; | 811 | RVO_SHIFT) & RVO_MASK; data->exttype = (control |
761 | data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; | 812 | >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; |
762 | data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK); | 813 | data->plllock = (control >> PLL_L_SHIFT) & PLL_L_MASK; data->vidmvs = 1 |
763 | data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK; | 814 | << ((control >> MVS_SHIFT) & MVS_MASK); data->vstable = |
764 | } | 815 | (control >> VST_SHIFT) & VST_MASK; } |
765 | 816 | ||
766 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | 817 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) |
767 | { | 818 | { |
768 | struct cpufreq_frequency_table *powernow_table; | 819 | struct cpufreq_frequency_table *powernow_table; |
769 | int ret_val = -ENODEV; | 820 | int ret_val = -ENODEV; |
821 | acpi_integer space_id; | ||
770 | 822 | ||
771 | if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) { | 823 | if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) { |
772 | dprintk("register performance failed: bad ACPI data\n"); | 824 | dprintk("register performance failed: bad ACPI data\n"); |
@@ -779,11 +831,12 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
779 | goto err_out; | 831 | goto err_out; |
780 | } | 832 | } |
781 | 833 | ||
782 | if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || | 834 | space_id = data->acpi_data.control_register.space_id; |
783 | (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { | 835 | if ((space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || |
836 | (space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { | ||
784 | dprintk("Invalid control/status registers (%x - %x)\n", | 837 | dprintk("Invalid control/status registers (%x - %x)\n", |
785 | data->acpi_data.control_register.space_id, | 838 | data->acpi_data.control_register.space_id, |
786 | data->acpi_data.status_register.space_id); | 839 | space_id); |
787 | goto err_out; | 840 | goto err_out; |
788 | } | 841 | } |
789 | 842 | ||
@@ -802,7 +855,8 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
802 | if (ret_val) | 855 | if (ret_val) |
803 | goto err_out_mem; | 856 | goto err_out_mem; |
804 | 857 | ||
805 | powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END; | 858 | powernow_table[data->acpi_data.state_count].frequency = |
859 | CPUFREQ_TABLE_END; | ||
806 | powernow_table[data->acpi_data.state_count].index = 0; | 860 | powernow_table[data->acpi_data.state_count].index = 0; |
807 | data->powernow_table = powernow_table; | 861 | data->powernow_table = powernow_table; |
808 | 862 | ||
@@ -830,13 +884,15 @@ err_out_mem: | |||
830 | err_out: | 884 | err_out: |
831 | acpi_processor_unregister_performance(&data->acpi_data, data->cpu); | 885 | acpi_processor_unregister_performance(&data->acpi_data, data->cpu); |
832 | 886 | ||
833 | /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ | 887 | /* data->acpi_data.state_count informs us at ->exit() |
888 | * whether ACPI was used */ | ||
834 | data->acpi_data.state_count = 0; | 889 | data->acpi_data.state_count = 0; |
835 | 890 | ||
836 | return ret_val; | 891 | return ret_val; |
837 | } | 892 | } |
838 | 893 | ||
839 | static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table) | 894 | static int fill_powernow_table_pstate(struct powernow_k8_data *data, |
895 | struct cpufreq_frequency_table *powernow_table) | ||
840 | { | 896 | { |
841 | int i; | 897 | int i; |
842 | u32 hi = 0, lo = 0; | 898 | u32 hi = 0, lo = 0; |
@@ -848,84 +904,101 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf | |||
848 | 904 | ||
849 | index = data->acpi_data.states[i].control & HW_PSTATE_MASK; | 905 | index = data->acpi_data.states[i].control & HW_PSTATE_MASK; |
850 | if (index > data->max_hw_pstate) { | 906 | if (index > data->max_hw_pstate) { |
851 | printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index); | 907 | printk(KERN_ERR PFX "invalid pstate %d - " |
852 | printk(KERN_ERR PFX "Please report to BIOS manufacturer\n"); | 908 | "bad value %d.\n", i, index); |
853 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 909 | printk(KERN_ERR PFX "Please report to BIOS " |
910 | "manufacturer\n"); | ||
911 | invalidate_entry(data, i); | ||
854 | continue; | 912 | continue; |
855 | } | 913 | } |
856 | rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); | 914 | rdmsr(MSR_PSTATE_DEF_BASE + index, lo, hi); |
857 | if (!(hi & HW_PSTATE_VALID_MASK)) { | 915 | if (!(hi & HW_PSTATE_VALID_MASK)) { |
858 | dprintk("invalid pstate %d, ignoring\n", index); | 916 | dprintk("invalid pstate %d, ignoring\n", index); |
859 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 917 | invalidate_entry(data, i); |
860 | continue; | 918 | continue; |
861 | } | 919 | } |
862 | 920 | ||
863 | powernow_table[i].index = index; | 921 | powernow_table[i].index = index; |
864 | 922 | ||
865 | powernow_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000; | 923 | powernow_table[i].frequency = |
924 | data->acpi_data.states[i].core_frequency * 1000; | ||
866 | } | 925 | } |
867 | return 0; | 926 | return 0; |
868 | } | 927 | } |
869 | 928 | ||
870 | static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table) | 929 | static int fill_powernow_table_fidvid(struct powernow_k8_data *data, |
930 | struct cpufreq_frequency_table *powernow_table) | ||
871 | { | 931 | { |
872 | int i; | 932 | int i; |
873 | int cntlofreq = 0; | 933 | int cntlofreq = 0; |
934 | |||
874 | for (i = 0; i < data->acpi_data.state_count; i++) { | 935 | for (i = 0; i < data->acpi_data.state_count; i++) { |
875 | u32 fid; | 936 | u32 fid; |
876 | u32 vid; | 937 | u32 vid; |
938 | u32 freq, index; | ||
939 | acpi_integer status, control; | ||
877 | 940 | ||
878 | if (data->exttype) { | 941 | if (data->exttype) { |
879 | fid = data->acpi_data.states[i].status & EXT_FID_MASK; | 942 | status = data->acpi_data.states[i].status; |
880 | vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK; | 943 | fid = status & EXT_FID_MASK; |
944 | vid = (status >> VID_SHIFT) & EXT_VID_MASK; | ||
881 | } else { | 945 | } else { |
882 | fid = data->acpi_data.states[i].control & FID_MASK; | 946 | control = data->acpi_data.states[i].control; |
883 | vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK; | 947 | fid = control & FID_MASK; |
948 | vid = (control >> VID_SHIFT) & VID_MASK; | ||
884 | } | 949 | } |
885 | 950 | ||
886 | dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); | 951 | dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); |
887 | 952 | ||
888 | powernow_table[i].index = fid; /* lower 8 bits */ | 953 | index = fid | (vid<<8); |
889 | powernow_table[i].index |= (vid << 8); /* upper 8 bits */ | 954 | powernow_table[i].index = index; |
890 | powernow_table[i].frequency = find_khz_freq_from_fid(fid); | 955 | |
956 | freq = find_khz_freq_from_fid(fid); | ||
957 | powernow_table[i].frequency = freq; | ||
891 | 958 | ||
892 | /* verify frequency is OK */ | 959 | /* verify frequency is OK */ |
893 | if ((powernow_table[i].frequency > (MAX_FREQ * 1000)) || | 960 | if ((freq > (MAX_FREQ * 1000)) || (freq < (MIN_FREQ * 1000))) { |
894 | (powernow_table[i].frequency < (MIN_FREQ * 1000))) { | 961 | dprintk("invalid freq %u kHz, ignoring\n", freq); |
895 | dprintk("invalid freq %u kHz, ignoring\n", powernow_table[i].frequency); | 962 | invalidate_entry(data, i); |
896 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | ||
897 | continue; | 963 | continue; |
898 | } | 964 | } |
899 | 965 | ||
900 | /* verify voltage is OK - BIOSs are using "off" to indicate invalid */ | 966 | /* verify voltage is OK - |
967 | * BIOSs are using "off" to indicate invalid */ | ||
901 | if (vid == VID_OFF) { | 968 | if (vid == VID_OFF) { |
902 | dprintk("invalid vid %u, ignoring\n", vid); | 969 | dprintk("invalid vid %u, ignoring\n", vid); |
903 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 970 | invalidate_entry(data, i); |
904 | continue; | 971 | continue; |
905 | } | 972 | } |
906 | 973 | ||
907 | /* verify only 1 entry from the lo frequency table */ | 974 | /* verify only 1 entry from the lo frequency table */ |
908 | if (fid < HI_FID_TABLE_BOTTOM) { | 975 | if (fid < HI_FID_TABLE_BOTTOM) { |
909 | if (cntlofreq) { | 976 | if (cntlofreq) { |
910 | /* if both entries are the same, ignore this one ... */ | 977 | /* if both entries are the same, |
911 | if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) || | 978 | * ignore this one ... */ |
912 | (powernow_table[i].index != powernow_table[cntlofreq].index)) { | 979 | if ((freq != powernow_table[cntlofreq].frequency) || |
913 | printk(KERN_ERR PFX "Too many lo freq table entries\n"); | 980 | (index != powernow_table[cntlofreq].index)) { |
981 | printk(KERN_ERR PFX | ||
982 | "Too many lo freq table " | ||
983 | "entries\n"); | ||
914 | return 1; | 984 | return 1; |
915 | } | 985 | } |
916 | 986 | ||
917 | dprintk("double low frequency table entry, ignoring it.\n"); | 987 | dprintk("double low frequency table entry, " |
918 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 988 | "ignoring it.\n"); |
989 | invalidate_entry(data, i); | ||
919 | continue; | 990 | continue; |
920 | } else | 991 | } else |
921 | cntlofreq = i; | 992 | cntlofreq = i; |
922 | } | 993 | } |
923 | 994 | ||
924 | if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) { | 995 | if (freq != (data->acpi_data.states[i].core_frequency * 1000)) { |
925 | printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", | 996 | printk(KERN_INFO PFX "invalid freq entries " |
926 | powernow_table[i].frequency, | 997 | "%u kHz vs. %u kHz\n", freq, |
927 | (unsigned int) (data->acpi_data.states[i].core_frequency * 1000)); | 998 | (unsigned int) |
928 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 999 | (data->acpi_data.states[i].core_frequency |
1000 | * 1000)); | ||
1001 | invalidate_entry(data, i); | ||
929 | continue; | 1002 | continue; |
930 | } | 1003 | } |
931 | } | 1004 | } |
@@ -935,7 +1008,8 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | |||
935 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) | 1008 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) |
936 | { | 1009 | { |
937 | if (data->acpi_data.state_count) | 1010 | if (data->acpi_data.state_count) |
938 | acpi_processor_unregister_performance(&data->acpi_data, data->cpu); | 1011 | acpi_processor_unregister_performance(&data->acpi_data, |
1012 | data->cpu); | ||
939 | free_cpumask_var(data->acpi_data.shared_cpu_map); | 1013 | free_cpumask_var(data->acpi_data.shared_cpu_map); |
940 | } | 1014 | } |
941 | 1015 | ||
@@ -953,15 +1027,9 @@ static int get_transition_latency(struct powernow_k8_data *data) | |||
953 | return 1000 * max_latency; | 1027 | return 1000 * max_latency; |
954 | } | 1028 | } |
955 | 1029 | ||
956 | #else | ||
957 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } | ||
958 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } | ||
959 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } | ||
960 | static int get_transition_latency(struct powernow_k8_data *data) { return 0; } | ||
961 | #endif /* CONFIG_X86_POWERNOW_K8_ACPI */ | ||
962 | |||
963 | /* Take a frequency, and issue the fid/vid transition command */ | 1030 | /* Take a frequency, and issue the fid/vid transition command */ |
964 | static int transition_frequency_fidvid(struct powernow_k8_data *data, unsigned int index) | 1031 | static int transition_frequency_fidvid(struct powernow_k8_data *data, |
1032 | unsigned int index) | ||
965 | { | 1033 | { |
966 | u32 fid = 0; | 1034 | u32 fid = 0; |
967 | u32 vid = 0; | 1035 | u32 vid = 0; |
@@ -989,7 +1057,8 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data, unsigned i | |||
989 | return 0; | 1057 | return 0; |
990 | } | 1058 | } |
991 | 1059 | ||
992 | if ((fid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) { | 1060 | if ((fid < HI_FID_TABLE_BOTTOM) && |
1061 | (data->currfid < HI_FID_TABLE_BOTTOM)) { | ||
993 | printk(KERN_ERR PFX | 1062 | printk(KERN_ERR PFX |
994 | "ignoring illegal change in lo freq table-%x to 0x%x\n", | 1063 | "ignoring illegal change in lo freq table-%x to 0x%x\n", |
995 | data->currfid, fid); | 1064 | data->currfid, fid); |
@@ -1017,7 +1086,8 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data, unsigned i | |||
1017 | } | 1086 | } |
1018 | 1087 | ||
1019 | /* Take a frequency, and issue the hardware pstate transition command */ | 1088 | /* Take a frequency, and issue the hardware pstate transition command */ |
1020 | static int transition_frequency_pstate(struct powernow_k8_data *data, unsigned int index) | 1089 | static int transition_frequency_pstate(struct powernow_k8_data *data, |
1090 | unsigned int index) | ||
1021 | { | 1091 | { |
1022 | u32 pstate = 0; | 1092 | u32 pstate = 0; |
1023 | int res, i; | 1093 | int res, i; |
@@ -1029,7 +1099,8 @@ static int transition_frequency_pstate(struct powernow_k8_data *data, unsigned i | |||
1029 | pstate = index & HW_PSTATE_MASK; | 1099 | pstate = index & HW_PSTATE_MASK; |
1030 | if (pstate > data->max_hw_pstate) | 1100 | if (pstate > data->max_hw_pstate) |
1031 | return 0; | 1101 | return 0; |
1032 | freqs.old = find_khz_freq_from_pstate(data->powernow_table, data->currpstate); | 1102 | freqs.old = find_khz_freq_from_pstate(data->powernow_table, |
1103 | data->currpstate); | ||
1033 | freqs.new = find_khz_freq_from_pstate(data->powernow_table, pstate); | 1104 | freqs.new = find_khz_freq_from_pstate(data->powernow_table, pstate); |
1034 | 1105 | ||
1035 | for_each_cpu_mask_nr(i, *(data->available_cores)) { | 1106 | for_each_cpu_mask_nr(i, *(data->available_cores)) { |
@@ -1048,7 +1119,8 @@ static int transition_frequency_pstate(struct powernow_k8_data *data, unsigned i | |||
1048 | } | 1119 | } |
1049 | 1120 | ||
1050 | /* Driver entry point to switch to the target frequency */ | 1121 | /* Driver entry point to switch to the target frequency */ |
1051 | static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsigned relation) | 1122 | static int powernowk8_target(struct cpufreq_policy *pol, |
1123 | unsigned targfreq, unsigned relation) | ||
1052 | { | 1124 | { |
1053 | cpumask_t oldmask; | 1125 | cpumask_t oldmask; |
1054 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); | 1126 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); |
@@ -1087,14 +1159,18 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi | |||
1087 | dprintk("targ: curr fid 0x%x, vid 0x%x\n", | 1159 | dprintk("targ: curr fid 0x%x, vid 0x%x\n", |
1088 | data->currfid, data->currvid); | 1160 | data->currfid, data->currvid); |
1089 | 1161 | ||
1090 | if ((checkvid != data->currvid) || (checkfid != data->currfid)) { | 1162 | if ((checkvid != data->currvid) || |
1163 | (checkfid != data->currfid)) { | ||
1091 | printk(KERN_INFO PFX | 1164 | printk(KERN_INFO PFX |
1092 | "error - out of sync, fix 0x%x 0x%x, vid 0x%x 0x%x\n", | 1165 | "error - out of sync, fix 0x%x 0x%x, " |
1093 | checkfid, data->currfid, checkvid, data->currvid); | 1166 | "vid 0x%x 0x%x\n", |
1167 | checkfid, data->currfid, | ||
1168 | checkvid, data->currvid); | ||
1094 | } | 1169 | } |
1095 | } | 1170 | } |
1096 | 1171 | ||
1097 | if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate)) | 1172 | if (cpufreq_frequency_table_target(pol, data->powernow_table, |
1173 | targfreq, relation, &newstate)) | ||
1098 | goto err_out; | 1174 | goto err_out; |
1099 | 1175 | ||
1100 | mutex_lock(&fidvid_mutex); | 1176 | mutex_lock(&fidvid_mutex); |
@@ -1114,7 +1190,8 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi | |||
1114 | mutex_unlock(&fidvid_mutex); | 1190 | mutex_unlock(&fidvid_mutex); |
1115 | 1191 | ||
1116 | if (cpu_family == CPU_HW_PSTATE) | 1192 | if (cpu_family == CPU_HW_PSTATE) |
1117 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, newstate); | 1193 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, |
1194 | newstate); | ||
1118 | else | 1195 | else |
1119 | pol->cur = find_khz_freq_from_fid(data->currfid); | 1196 | pol->cur = find_khz_freq_from_fid(data->currfid); |
1120 | ret = 0; | 1197 | ret = 0; |
@@ -1141,6 +1218,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1141 | struct powernow_k8_data *data; | 1218 | struct powernow_k8_data *data; |
1142 | cpumask_t oldmask; | 1219 | cpumask_t oldmask; |
1143 | int rc; | 1220 | int rc; |
1221 | static int print_once; | ||
1144 | 1222 | ||
1145 | if (!cpu_online(pol->cpu)) | 1223 | if (!cpu_online(pol->cpu)) |
1146 | return -ENODEV; | 1224 | return -ENODEV; |
@@ -1163,33 +1241,31 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1163 | * an UP version, and is deprecated by AMD. | 1241 | * an UP version, and is deprecated by AMD. |
1164 | */ | 1242 | */ |
1165 | if (num_online_cpus() != 1) { | 1243 | if (num_online_cpus() != 1) { |
1166 | #ifndef CONFIG_ACPI_PROCESSOR | 1244 | /* |
1167 | printk(KERN_ERR PFX "ACPI Processor support is required " | 1245 | * Replace this one with print_once as soon as such a |
1168 | "for SMP systems but is absent. Please load the " | 1246 | * thing gets introduced |
1169 | "ACPI Processor module before starting this " | 1247 | */ |
1170 | "driver.\n"); | 1248 | if (!print_once) { |
1171 | #else | 1249 | WARN_ONCE(1, KERN_ERR FW_BUG PFX "Your BIOS " |
1172 | printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide" | 1250 | "does not provide ACPI _PSS objects " |
1173 | " ACPI _PSS objects in a way that Linux " | 1251 | "in a way that Linux understands. " |
1174 | "understands. Please report this to the Linux " | 1252 | "Please report this to the Linux ACPI" |
1175 | "ACPI maintainers and complain to your BIOS " | 1253 | " maintainers and complain to your " |
1176 | "vendor.\n"); | 1254 | "BIOS vendor.\n"); |
1177 | #endif | 1255 | print_once++; |
1178 | kfree(data); | 1256 | } |
1179 | return -ENODEV; | 1257 | goto err_out; |
1180 | } | 1258 | } |
1181 | if (pol->cpu != 0) { | 1259 | if (pol->cpu != 0) { |
1182 | printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for " | 1260 | printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for " |
1183 | "CPU other than CPU0. Complain to your BIOS " | 1261 | "CPU other than CPU0. Complain to your BIOS " |
1184 | "vendor.\n"); | 1262 | "vendor.\n"); |
1185 | kfree(data); | 1263 | goto err_out; |
1186 | return -ENODEV; | ||
1187 | } | 1264 | } |
1188 | rc = find_psb_table(data); | 1265 | rc = find_psb_table(data); |
1189 | if (rc) { | 1266 | if (rc) |
1190 | kfree(data); | 1267 | goto err_out; |
1191 | return -ENODEV; | 1268 | |
1192 | } | ||
1193 | /* Take a crude guess here. | 1269 | /* Take a crude guess here. |
1194 | * That guess was in microseconds, so multiply with 1000 */ | 1270 | * That guess was in microseconds, so multiply with 1000 */ |
1195 | pol->cpuinfo.transition_latency = ( | 1271 | pol->cpuinfo.transition_latency = ( |
@@ -1204,16 +1280,16 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1204 | 1280 | ||
1205 | if (smp_processor_id() != pol->cpu) { | 1281 | if (smp_processor_id() != pol->cpu) { |
1206 | printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu); | 1282 | printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu); |
1207 | goto err_out; | 1283 | goto err_out_unmask; |
1208 | } | 1284 | } |
1209 | 1285 | ||
1210 | if (pending_bit_stuck()) { | 1286 | if (pending_bit_stuck()) { |
1211 | printk(KERN_ERR PFX "failing init, change pending bit set\n"); | 1287 | printk(KERN_ERR PFX "failing init, change pending bit set\n"); |
1212 | goto err_out; | 1288 | goto err_out_unmask; |
1213 | } | 1289 | } |
1214 | 1290 | ||
1215 | if (query_current_values_with_pending_wait(data)) | 1291 | if (query_current_values_with_pending_wait(data)) |
1216 | goto err_out; | 1292 | goto err_out_unmask; |
1217 | 1293 | ||
1218 | if (cpu_family == CPU_OPTERON) | 1294 | if (cpu_family == CPU_OPTERON) |
1219 | fidvid_msr_init(); | 1295 | fidvid_msr_init(); |
@@ -1228,7 +1304,8 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1228 | data->available_cores = pol->cpus; | 1304 | data->available_cores = pol->cpus; |
1229 | 1305 | ||
1230 | if (cpu_family == CPU_HW_PSTATE) | 1306 | if (cpu_family == CPU_HW_PSTATE) |
1231 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, data->currpstate); | 1307 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, |
1308 | data->currpstate); | ||
1232 | else | 1309 | else |
1233 | pol->cur = find_khz_freq_from_fid(data->currfid); | 1310 | pol->cur = find_khz_freq_from_fid(data->currfid); |
1234 | dprintk("policy current frequency %d kHz\n", pol->cur); | 1311 | dprintk("policy current frequency %d kHz\n", pol->cur); |
@@ -1245,7 +1322,8 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1245 | cpufreq_frequency_table_get_attr(data->powernow_table, pol->cpu); | 1322 | cpufreq_frequency_table_get_attr(data->powernow_table, pol->cpu); |
1246 | 1323 | ||
1247 | if (cpu_family == CPU_HW_PSTATE) | 1324 | if (cpu_family == CPU_HW_PSTATE) |
1248 | dprintk("cpu_init done, current pstate 0x%x\n", data->currpstate); | 1325 | dprintk("cpu_init done, current pstate 0x%x\n", |
1326 | data->currpstate); | ||
1249 | else | 1327 | else |
1250 | dprintk("cpu_init done, current fid 0x%x, vid 0x%x\n", | 1328 | dprintk("cpu_init done, current fid 0x%x, vid 0x%x\n", |
1251 | data->currfid, data->currvid); | 1329 | data->currfid, data->currvid); |
@@ -1254,15 +1332,16 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1254 | 1332 | ||
1255 | return 0; | 1333 | return 0; |
1256 | 1334 | ||
1257 | err_out: | 1335 | err_out_unmask: |
1258 | set_cpus_allowed_ptr(current, &oldmask); | 1336 | set_cpus_allowed_ptr(current, &oldmask); |
1259 | powernow_k8_cpu_exit_acpi(data); | 1337 | powernow_k8_cpu_exit_acpi(data); |
1260 | 1338 | ||
1339 | err_out: | ||
1261 | kfree(data); | 1340 | kfree(data); |
1262 | return -ENODEV; | 1341 | return -ENODEV; |
1263 | } | 1342 | } |
1264 | 1343 | ||
1265 | static int __devexit powernowk8_cpu_exit (struct cpufreq_policy *pol) | 1344 | static int __devexit powernowk8_cpu_exit(struct cpufreq_policy *pol) |
1266 | { | 1345 | { |
1267 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); | 1346 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); |
1268 | 1347 | ||
@@ -1279,7 +1358,7 @@ static int __devexit powernowk8_cpu_exit (struct cpufreq_policy *pol) | |||
1279 | return 0; | 1358 | return 0; |
1280 | } | 1359 | } |
1281 | 1360 | ||
1282 | static unsigned int powernowk8_get (unsigned int cpu) | 1361 | static unsigned int powernowk8_get(unsigned int cpu) |
1283 | { | 1362 | { |
1284 | struct powernow_k8_data *data; | 1363 | struct powernow_k8_data *data; |
1285 | cpumask_t oldmask = current->cpus_allowed; | 1364 | cpumask_t oldmask = current->cpus_allowed; |
@@ -1315,7 +1394,7 @@ out: | |||
1315 | return khz; | 1394 | return khz; |
1316 | } | 1395 | } |
1317 | 1396 | ||
1318 | static struct freq_attr* powernow_k8_attr[] = { | 1397 | static struct freq_attr *powernow_k8_attr[] = { |
1319 | &cpufreq_freq_attr_scaling_available_freqs, | 1398 | &cpufreq_freq_attr_scaling_available_freqs, |
1320 | NULL, | 1399 | NULL, |
1321 | }; | 1400 | }; |
@@ -1360,7 +1439,8 @@ static void __exit powernowk8_exit(void) | |||
1360 | cpufreq_unregister_driver(&cpufreq_amd64_driver); | 1439 | cpufreq_unregister_driver(&cpufreq_amd64_driver); |
1361 | } | 1440 | } |
1362 | 1441 | ||
1363 | MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>"); | 1442 | MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and " |
1443 | "Mark Langsdorf <mark.langsdorf@amd.com>"); | ||
1364 | MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver."); | 1444 | MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver."); |
1365 | MODULE_LICENSE("GPL"); | 1445 | MODULE_LICENSE("GPL"); |
1366 | 1446 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h index 8ecc75b6c7c3..6c6698feade1 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h | |||
@@ -45,11 +45,10 @@ struct powernow_k8_data { | |||
45 | * frequency is in kHz */ | 45 | * frequency is in kHz */ |
46 | struct cpufreq_frequency_table *powernow_table; | 46 | struct cpufreq_frequency_table *powernow_table; |
47 | 47 | ||
48 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||
49 | /* the acpi table needs to be kept. it's only available if ACPI was | 48 | /* the acpi table needs to be kept. it's only available if ACPI was |
50 | * used to determine valid frequency/vid/fid states */ | 49 | * used to determine valid frequency/vid/fid states */ |
51 | struct acpi_processor_performance acpi_data; | 50 | struct acpi_processor_performance acpi_data; |
52 | #endif | 51 | |
53 | /* we need to keep track of associated cores, but let cpufreq | 52 | /* we need to keep track of associated cores, but let cpufreq |
54 | * handle hotplug events - so just point at cpufreq pol->cpus | 53 | * handle hotplug events - so just point at cpufreq pol->cpus |
55 | * structure */ | 54 | * structure */ |
@@ -222,10 +221,8 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid); | |||
222 | 221 | ||
223 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index); | 222 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index); |
224 | 223 | ||
225 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||
226 | static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); | 224 | static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); |
227 | static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); | 225 | static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table); |
228 | #endif | ||
229 | 226 | ||
230 | #ifdef CONFIG_SMP | 227 | #ifdef CONFIG_SMP |
231 | static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[]) | 228 | static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[]) |
diff --git a/arch/x86/kernel/cpu/cpufreq/sc520_freq.c b/arch/x86/kernel/cpu/cpufreq/sc520_freq.c index 42da9bd677d6..435a996a613a 100644 --- a/arch/x86/kernel/cpu/cpufreq/sc520_freq.c +++ b/arch/x86/kernel/cpu/cpufreq/sc520_freq.c | |||
@@ -19,17 +19,19 @@ | |||
19 | 19 | ||
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/cpufreq.h> | 21 | #include <linux/cpufreq.h> |
22 | #include <linux/timex.h> | ||
23 | #include <linux/io.h> | ||
22 | 24 | ||
23 | #include <asm/msr.h> | 25 | #include <asm/msr.h> |
24 | #include <asm/timex.h> | ||
25 | #include <asm/io.h> | ||
26 | 26 | ||
27 | #define MMCR_BASE 0xfffef000 /* The default base address */ | 27 | #define MMCR_BASE 0xfffef000 /* The default base address */ |
28 | #define OFFS_CPUCTL 0x2 /* CPU Control Register */ | 28 | #define OFFS_CPUCTL 0x2 /* CPU Control Register */ |
29 | 29 | ||
30 | static __u8 __iomem *cpuctl; | 30 | static __u8 __iomem *cpuctl; |
31 | 31 | ||
32 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "sc520_freq", msg) | 32 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
33 | "sc520_freq", msg) | ||
34 | #define PFX "sc520_freq: " | ||
33 | 35 | ||
34 | static struct cpufreq_frequency_table sc520_freq_table[] = { | 36 | static struct cpufreq_frequency_table sc520_freq_table[] = { |
35 | {0x01, 100000}, | 37 | {0x01, 100000}, |
@@ -43,7 +45,8 @@ static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu) | |||
43 | 45 | ||
44 | switch (clockspeed_reg & 0x03) { | 46 | switch (clockspeed_reg & 0x03) { |
45 | default: | 47 | default: |
46 | printk(KERN_ERR "sc520_freq: error: cpuctl register has unexpected value %02x\n", clockspeed_reg); | 48 | printk(KERN_ERR PFX "error: cpuctl register has unexpected " |
49 | "value %02x\n", clockspeed_reg); | ||
47 | case 0x01: | 50 | case 0x01: |
48 | return 100000; | 51 | return 100000; |
49 | case 0x02: | 52 | case 0x02: |
@@ -51,7 +54,7 @@ static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu) | |||
51 | } | 54 | } |
52 | } | 55 | } |
53 | 56 | ||
54 | static void sc520_freq_set_cpu_state (unsigned int state) | 57 | static void sc520_freq_set_cpu_state(unsigned int state) |
55 | { | 58 | { |
56 | 59 | ||
57 | struct cpufreq_freqs freqs; | 60 | struct cpufreq_freqs freqs; |
@@ -76,18 +79,19 @@ static void sc520_freq_set_cpu_state (unsigned int state) | |||
76 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 79 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
77 | }; | 80 | }; |
78 | 81 | ||
79 | static int sc520_freq_verify (struct cpufreq_policy *policy) | 82 | static int sc520_freq_verify(struct cpufreq_policy *policy) |
80 | { | 83 | { |
81 | return cpufreq_frequency_table_verify(policy, &sc520_freq_table[0]); | 84 | return cpufreq_frequency_table_verify(policy, &sc520_freq_table[0]); |
82 | } | 85 | } |
83 | 86 | ||
84 | static int sc520_freq_target (struct cpufreq_policy *policy, | 87 | static int sc520_freq_target(struct cpufreq_policy *policy, |
85 | unsigned int target_freq, | 88 | unsigned int target_freq, |
86 | unsigned int relation) | 89 | unsigned int relation) |
87 | { | 90 | { |
88 | unsigned int newstate = 0; | 91 | unsigned int newstate = 0; |
89 | 92 | ||
90 | if (cpufreq_frequency_table_target(policy, sc520_freq_table, target_freq, relation, &newstate)) | 93 | if (cpufreq_frequency_table_target(policy, sc520_freq_table, |
94 | target_freq, relation, &newstate)) | ||
91 | return -EINVAL; | 95 | return -EINVAL; |
92 | 96 | ||
93 | sc520_freq_set_cpu_state(newstate); | 97 | sc520_freq_set_cpu_state(newstate); |
@@ -116,7 +120,7 @@ static int sc520_freq_cpu_init(struct cpufreq_policy *policy) | |||
116 | 120 | ||
117 | result = cpufreq_frequency_table_cpuinfo(policy, sc520_freq_table); | 121 | result = cpufreq_frequency_table_cpuinfo(policy, sc520_freq_table); |
118 | if (result) | 122 | if (result) |
119 | return (result); | 123 | return result; |
120 | 124 | ||
121 | cpufreq_frequency_table_get_attr(sc520_freq_table, policy->cpu); | 125 | cpufreq_frequency_table_get_attr(sc520_freq_table, policy->cpu); |
122 | 126 | ||
@@ -131,7 +135,7 @@ static int sc520_freq_cpu_exit(struct cpufreq_policy *policy) | |||
131 | } | 135 | } |
132 | 136 | ||
133 | 137 | ||
134 | static struct freq_attr* sc520_freq_attr[] = { | 138 | static struct freq_attr *sc520_freq_attr[] = { |
135 | &cpufreq_freq_attr_scaling_available_freqs, | 139 | &cpufreq_freq_attr_scaling_available_freqs, |
136 | NULL, | 140 | NULL, |
137 | }; | 141 | }; |
@@ -155,13 +159,13 @@ static int __init sc520_freq_init(void) | |||
155 | int err; | 159 | int err; |
156 | 160 | ||
157 | /* Test if we have the right hardware */ | 161 | /* Test if we have the right hardware */ |
158 | if(c->x86_vendor != X86_VENDOR_AMD || | 162 | if (c->x86_vendor != X86_VENDOR_AMD || |
159 | c->x86 != 4 || c->x86_model != 9) { | 163 | c->x86 != 4 || c->x86_model != 9) { |
160 | dprintk("no Elan SC520 processor found!\n"); | 164 | dprintk("no Elan SC520 processor found!\n"); |
161 | return -ENODEV; | 165 | return -ENODEV; |
162 | } | 166 | } |
163 | cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1); | 167 | cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1); |
164 | if(!cpuctl) { | 168 | if (!cpuctl) { |
165 | printk(KERN_ERR "sc520_freq: error: failed to remap memory\n"); | 169 | printk(KERN_ERR "sc520_freq: error: failed to remap memory\n"); |
166 | return -ENOMEM; | 170 | return -ENOMEM; |
167 | } | 171 | } |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index dedc1e98f168..8bbb11adb315 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | |||
@@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev; | |||
39 | 39 | ||
40 | /* speedstep_processor | 40 | /* speedstep_processor |
41 | */ | 41 | */ |
42 | static unsigned int speedstep_processor = 0; | 42 | static unsigned int speedstep_processor; |
43 | 43 | ||
44 | static u32 pmbase; | 44 | static u32 pmbase; |
45 | 45 | ||
@@ -54,7 +54,8 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
54 | }; | 54 | }; |
55 | 55 | ||
56 | 56 | ||
57 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg) | 57 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
58 | "speedstep-ich", msg) | ||
58 | 59 | ||
59 | 60 | ||
60 | /** | 61 | /** |
@@ -62,7 +63,7 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
62 | * | 63 | * |
63 | * Returns: -ENODEV if no register could be found | 64 | * Returns: -ENODEV if no register could be found |
64 | */ | 65 | */ |
65 | static int speedstep_find_register (void) | 66 | static int speedstep_find_register(void) |
66 | { | 67 | { |
67 | if (!speedstep_chipset_dev) | 68 | if (!speedstep_chipset_dev) |
68 | return -ENODEV; | 69 | return -ENODEV; |
@@ -90,7 +91,7 @@ static int speedstep_find_register (void) | |||
90 | * | 91 | * |
91 | * Tries to change the SpeedStep state. | 92 | * Tries to change the SpeedStep state. |
92 | */ | 93 | */ |
93 | static void speedstep_set_state (unsigned int state) | 94 | static void speedstep_set_state(unsigned int state) |
94 | { | 95 | { |
95 | u8 pm2_blk; | 96 | u8 pm2_blk; |
96 | u8 value; | 97 | u8 value; |
@@ -133,11 +134,11 @@ static void speedstep_set_state (unsigned int state) | |||
133 | 134 | ||
134 | dprintk("read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value); | 135 | dprintk("read at pmbase 0x%x + 0x50 returned 0x%x\n", pmbase, value); |
135 | 136 | ||
136 | if (state == (value & 0x1)) { | 137 | if (state == (value & 0x1)) |
137 | dprintk("change to %u MHz succeeded\n", (speedstep_get_processor_frequency(speedstep_processor) / 1000)); | 138 | dprintk("change to %u MHz succeeded\n", |
138 | } else { | 139 | speedstep_get_frequency(speedstep_processor) / 1000); |
139 | printk (KERN_ERR "cpufreq: change failed - I/O error\n"); | 140 | else |
140 | } | 141 | printk(KERN_ERR "cpufreq: change failed - I/O error\n"); |
141 | 142 | ||
142 | return; | 143 | return; |
143 | } | 144 | } |
@@ -149,7 +150,7 @@ static void speedstep_set_state (unsigned int state) | |||
149 | * Tries to activate the SpeedStep status and control registers. | 150 | * Tries to activate the SpeedStep status and control registers. |
150 | * Returns -EINVAL on an unsupported chipset, and zero on success. | 151 | * Returns -EINVAL on an unsupported chipset, and zero on success. |
151 | */ | 152 | */ |
152 | static int speedstep_activate (void) | 153 | static int speedstep_activate(void) |
153 | { | 154 | { |
154 | u16 value = 0; | 155 | u16 value = 0; |
155 | 156 | ||
@@ -175,20 +176,18 @@ static int speedstep_activate (void) | |||
175 | * functions. Returns the SPEEDSTEP_CHIPSET_-number for the detected | 176 | * functions. Returns the SPEEDSTEP_CHIPSET_-number for the detected |
176 | * chipset, or zero on failure. | 177 | * chipset, or zero on failure. |
177 | */ | 178 | */ |
178 | static unsigned int speedstep_detect_chipset (void) | 179 | static unsigned int speedstep_detect_chipset(void) |
179 | { | 180 | { |
180 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 181 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
181 | PCI_DEVICE_ID_INTEL_82801DB_12, | 182 | PCI_DEVICE_ID_INTEL_82801DB_12, |
182 | PCI_ANY_ID, | 183 | PCI_ANY_ID, PCI_ANY_ID, |
183 | PCI_ANY_ID, | ||
184 | NULL); | 184 | NULL); |
185 | if (speedstep_chipset_dev) | 185 | if (speedstep_chipset_dev) |
186 | return 4; /* 4-M */ | 186 | return 4; /* 4-M */ |
187 | 187 | ||
188 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 188 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
189 | PCI_DEVICE_ID_INTEL_82801CA_12, | 189 | PCI_DEVICE_ID_INTEL_82801CA_12, |
190 | PCI_ANY_ID, | 190 | PCI_ANY_ID, PCI_ANY_ID, |
191 | PCI_ANY_ID, | ||
192 | NULL); | 191 | NULL); |
193 | if (speedstep_chipset_dev) | 192 | if (speedstep_chipset_dev) |
194 | return 3; /* 3-M */ | 193 | return 3; /* 3-M */ |
@@ -196,8 +195,7 @@ static unsigned int speedstep_detect_chipset (void) | |||
196 | 195 | ||
197 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 196 | speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
198 | PCI_DEVICE_ID_INTEL_82801BA_10, | 197 | PCI_DEVICE_ID_INTEL_82801BA_10, |
199 | PCI_ANY_ID, | 198 | PCI_ANY_ID, PCI_ANY_ID, |
200 | PCI_ANY_ID, | ||
201 | NULL); | 199 | NULL); |
202 | if (speedstep_chipset_dev) { | 200 | if (speedstep_chipset_dev) { |
203 | /* speedstep.c causes lockups on Dell Inspirons 8000 and | 201 | /* speedstep.c causes lockups on Dell Inspirons 8000 and |
@@ -208,8 +206,7 @@ static unsigned int speedstep_detect_chipset (void) | |||
208 | 206 | ||
209 | hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, | 207 | hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, |
210 | PCI_DEVICE_ID_INTEL_82815_MC, | 208 | PCI_DEVICE_ID_INTEL_82815_MC, |
211 | PCI_ANY_ID, | 209 | PCI_ANY_ID, PCI_ANY_ID, |
212 | PCI_ANY_ID, | ||
213 | NULL); | 210 | NULL); |
214 | 211 | ||
215 | if (!hostbridge) | 212 | if (!hostbridge) |
@@ -236,7 +233,7 @@ static unsigned int _speedstep_get(const struct cpumask *cpus) | |||
236 | 233 | ||
237 | cpus_allowed = current->cpus_allowed; | 234 | cpus_allowed = current->cpus_allowed; |
238 | set_cpus_allowed_ptr(current, cpus); | 235 | set_cpus_allowed_ptr(current, cpus); |
239 | speed = speedstep_get_processor_frequency(speedstep_processor); | 236 | speed = speedstep_get_frequency(speedstep_processor); |
240 | set_cpus_allowed_ptr(current, &cpus_allowed); | 237 | set_cpus_allowed_ptr(current, &cpus_allowed); |
241 | dprintk("detected %u kHz as current frequency\n", speed); | 238 | dprintk("detected %u kHz as current frequency\n", speed); |
242 | return speed; | 239 | return speed; |
@@ -251,11 +248,12 @@ static unsigned int speedstep_get(unsigned int cpu) | |||
251 | * speedstep_target - set a new CPUFreq policy | 248 | * speedstep_target - set a new CPUFreq policy |
252 | * @policy: new policy | 249 | * @policy: new policy |
253 | * @target_freq: the target frequency | 250 | * @target_freq: the target frequency |
254 | * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | 251 | * @relation: how that frequency relates to achieved frequency |
252 | * (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H) | ||
255 | * | 253 | * |
256 | * Sets a new CPUFreq policy. | 254 | * Sets a new CPUFreq policy. |
257 | */ | 255 | */ |
258 | static int speedstep_target (struct cpufreq_policy *policy, | 256 | static int speedstep_target(struct cpufreq_policy *policy, |
259 | unsigned int target_freq, | 257 | unsigned int target_freq, |
260 | unsigned int relation) | 258 | unsigned int relation) |
261 | { | 259 | { |
@@ -264,7 +262,8 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
264 | cpumask_t cpus_allowed; | 262 | cpumask_t cpus_allowed; |
265 | int i; | 263 | int i; |
266 | 264 | ||
267 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) | 265 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], |
266 | target_freq, relation, &newstate)) | ||
268 | return -EINVAL; | 267 | return -EINVAL; |
269 | 268 | ||
270 | freqs.old = _speedstep_get(policy->cpus); | 269 | freqs.old = _speedstep_get(policy->cpus); |
@@ -308,7 +307,7 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
308 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with | 307 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with |
309 | * at least one border included. | 308 | * at least one border included. |
310 | */ | 309 | */ |
311 | static int speedstep_verify (struct cpufreq_policy *policy) | 310 | static int speedstep_verify(struct cpufreq_policy *policy) |
312 | { | 311 | { |
313 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); | 312 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); |
314 | } | 313 | } |
@@ -344,7 +343,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
344 | return -EIO; | 343 | return -EIO; |
345 | 344 | ||
346 | dprintk("currently at %s speed setting - %i MHz\n", | 345 | dprintk("currently at %s speed setting - %i MHz\n", |
347 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", | 346 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) |
347 | ? "low" : "high", | ||
348 | (speed / 1000)); | 348 | (speed / 1000)); |
349 | 349 | ||
350 | /* cpuinfo and default policy values */ | 350 | /* cpuinfo and default policy values */ |
@@ -352,9 +352,9 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
352 | 352 | ||
353 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); | 353 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); |
354 | if (result) | 354 | if (result) |
355 | return (result); | 355 | return result; |
356 | 356 | ||
357 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); | 357 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); |
358 | 358 | ||
359 | return 0; | 359 | return 0; |
360 | } | 360 | } |
@@ -366,7 +366,7 @@ static int speedstep_cpu_exit(struct cpufreq_policy *policy) | |||
366 | return 0; | 366 | return 0; |
367 | } | 367 | } |
368 | 368 | ||
369 | static struct freq_attr* speedstep_attr[] = { | 369 | static struct freq_attr *speedstep_attr[] = { |
370 | &cpufreq_freq_attr_scaling_available_freqs, | 370 | &cpufreq_freq_attr_scaling_available_freqs, |
371 | NULL, | 371 | NULL, |
372 | }; | 372 | }; |
@@ -396,13 +396,15 @@ static int __init speedstep_init(void) | |||
396 | /* detect processor */ | 396 | /* detect processor */ |
397 | speedstep_processor = speedstep_detect_processor(); | 397 | speedstep_processor = speedstep_detect_processor(); |
398 | if (!speedstep_processor) { | 398 | if (!speedstep_processor) { |
399 | dprintk("Intel(R) SpeedStep(TM) capable processor not found\n"); | 399 | dprintk("Intel(R) SpeedStep(TM) capable processor " |
400 | "not found\n"); | ||
400 | return -ENODEV; | 401 | return -ENODEV; |
401 | } | 402 | } |
402 | 403 | ||
403 | /* detect chipset */ | 404 | /* detect chipset */ |
404 | if (!speedstep_detect_chipset()) { | 405 | if (!speedstep_detect_chipset()) { |
405 | dprintk("Intel(R) SpeedStep(TM) for this chipset not (yet) available.\n"); | 406 | dprintk("Intel(R) SpeedStep(TM) for this chipset not " |
407 | "(yet) available.\n"); | ||
406 | return -ENODEV; | 408 | return -ENODEV; |
407 | } | 409 | } |
408 | 410 | ||
@@ -431,9 +433,11 @@ static void __exit speedstep_exit(void) | |||
431 | } | 433 | } |
432 | 434 | ||
433 | 435 | ||
434 | MODULE_AUTHOR ("Dave Jones <davej@redhat.com>, Dominik Brodowski <linux@brodo.de>"); | 436 | MODULE_AUTHOR("Dave Jones <davej@redhat.com>, " |
435 | MODULE_DESCRIPTION ("Speedstep driver for Intel mobile processors on chipsets with ICH-M southbridges."); | 437 | "Dominik Brodowski <linux@brodo.de>"); |
436 | MODULE_LICENSE ("GPL"); | 438 | MODULE_DESCRIPTION("Speedstep driver for Intel mobile processors on chipsets " |
439 | "with ICH-M southbridges."); | ||
440 | MODULE_LICENSE("GPL"); | ||
437 | 441 | ||
438 | module_init(speedstep_init); | 442 | module_init(speedstep_init); |
439 | module_exit(speedstep_exit); | 443 | module_exit(speedstep_exit); |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c index cdac7d62369b..2e3c6862657b 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.c | |||
@@ -16,12 +16,16 @@ | |||
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | 17 | ||
18 | #include <asm/msr.h> | 18 | #include <asm/msr.h> |
19 | #include <asm/tsc.h> | ||
19 | #include "speedstep-lib.h" | 20 | #include "speedstep-lib.h" |
20 | 21 | ||
21 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-lib", msg) | 22 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
23 | "speedstep-lib", msg) | ||
24 | |||
25 | #define PFX "speedstep-lib: " | ||
22 | 26 | ||
23 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK | 27 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK |
24 | static int relaxed_check = 0; | 28 | static int relaxed_check; |
25 | #else | 29 | #else |
26 | #define relaxed_check 0 | 30 | #define relaxed_check 0 |
27 | #endif | 31 | #endif |
@@ -30,14 +34,14 @@ static int relaxed_check = 0; | |||
30 | * GET PROCESSOR CORE SPEED IN KHZ * | 34 | * GET PROCESSOR CORE SPEED IN KHZ * |
31 | *********************************************************************/ | 35 | *********************************************************************/ |
32 | 36 | ||
33 | static unsigned int pentium3_get_frequency (unsigned int processor) | 37 | static unsigned int pentium3_get_frequency(unsigned int processor) |
34 | { | 38 | { |
35 | /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ | 39 | /* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */ |
36 | struct { | 40 | struct { |
37 | unsigned int ratio; /* Frequency Multiplier (x10) */ | 41 | unsigned int ratio; /* Frequency Multiplier (x10) */ |
38 | u8 bitmap; /* power on configuration bits | 42 | u8 bitmap; /* power on configuration bits |
39 | [27, 25:22] (in MSR 0x2a) */ | 43 | [27, 25:22] (in MSR 0x2a) */ |
40 | } msr_decode_mult [] = { | 44 | } msr_decode_mult[] = { |
41 | { 30, 0x01 }, | 45 | { 30, 0x01 }, |
42 | { 35, 0x05 }, | 46 | { 35, 0x05 }, |
43 | { 40, 0x02 }, | 47 | { 40, 0x02 }, |
@@ -52,7 +56,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
52 | { 85, 0x26 }, | 56 | { 85, 0x26 }, |
53 | { 90, 0x20 }, | 57 | { 90, 0x20 }, |
54 | { 100, 0x2b }, | 58 | { 100, 0x2b }, |
55 | { 0, 0xff } /* error or unknown value */ | 59 | { 0, 0xff } /* error or unknown value */ |
56 | }; | 60 | }; |
57 | 61 | ||
58 | /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ | 62 | /* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */ |
@@ -60,7 +64,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
60 | unsigned int value; /* Front Side Bus speed in MHz */ | 64 | unsigned int value; /* Front Side Bus speed in MHz */ |
61 | u8 bitmap; /* power on configuration bits [18: 19] | 65 | u8 bitmap; /* power on configuration bits [18: 19] |
62 | (in MSR 0x2a) */ | 66 | (in MSR 0x2a) */ |
63 | } msr_decode_fsb [] = { | 67 | } msr_decode_fsb[] = { |
64 | { 66, 0x0 }, | 68 | { 66, 0x0 }, |
65 | { 100, 0x2 }, | 69 | { 100, 0x2 }, |
66 | { 133, 0x1 }, | 70 | { 133, 0x1 }, |
@@ -85,7 +89,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
85 | } | 89 | } |
86 | 90 | ||
87 | /* decode the multiplier */ | 91 | /* decode the multiplier */ |
88 | if (processor == SPEEDSTEP_PROCESSOR_PIII_C_EARLY) { | 92 | if (processor == SPEEDSTEP_CPU_PIII_C_EARLY) { |
89 | dprintk("workaround for early PIIIs\n"); | 93 | dprintk("workaround for early PIIIs\n"); |
90 | msr_lo &= 0x03c00000; | 94 | msr_lo &= 0x03c00000; |
91 | } else | 95 | } else |
@@ -97,9 +101,10 @@ static unsigned int pentium3_get_frequency (unsigned int processor) | |||
97 | j++; | 101 | j++; |
98 | } | 102 | } |
99 | 103 | ||
100 | dprintk("speed is %u\n", (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); | 104 | dprintk("speed is %u\n", |
105 | (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100)); | ||
101 | 106 | ||
102 | return (msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100); | 107 | return msr_decode_mult[j].ratio * msr_decode_fsb[i].value * 100; |
103 | } | 108 | } |
104 | 109 | ||
105 | 110 | ||
@@ -112,20 +117,23 @@ static unsigned int pentiumM_get_frequency(void) | |||
112 | 117 | ||
113 | /* see table B-2 of 24547212.pdf */ | 118 | /* see table B-2 of 24547212.pdf */ |
114 | if (msr_lo & 0x00040000) { | 119 | if (msr_lo & 0x00040000) { |
115 | printk(KERN_DEBUG "speedstep-lib: PM - invalid FSB: 0x%x 0x%x\n", msr_lo, msr_tmp); | 120 | printk(KERN_DEBUG PFX "PM - invalid FSB: 0x%x 0x%x\n", |
121 | msr_lo, msr_tmp); | ||
116 | return 0; | 122 | return 0; |
117 | } | 123 | } |
118 | 124 | ||
119 | msr_tmp = (msr_lo >> 22) & 0x1f; | 125 | msr_tmp = (msr_lo >> 22) & 0x1f; |
120 | dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * 100 * 1000)); | 126 | dprintk("bits 22-26 are 0x%x, speed is %u\n", |
127 | msr_tmp, (msr_tmp * 100 * 1000)); | ||
121 | 128 | ||
122 | return (msr_tmp * 100 * 1000); | 129 | return msr_tmp * 100 * 1000; |
123 | } | 130 | } |
124 | 131 | ||
125 | static unsigned int pentium_core_get_frequency(void) | 132 | static unsigned int pentium_core_get_frequency(void) |
126 | { | 133 | { |
127 | u32 fsb = 0; | 134 | u32 fsb = 0; |
128 | u32 msr_lo, msr_tmp; | 135 | u32 msr_lo, msr_tmp; |
136 | int ret; | ||
129 | 137 | ||
130 | rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); | 138 | rdmsr(MSR_FSB_FREQ, msr_lo, msr_tmp); |
131 | /* see table B-2 of 25366920.pdf */ | 139 | /* see table B-2 of 25366920.pdf */ |
@@ -153,12 +161,15 @@ static unsigned int pentium_core_get_frequency(void) | |||
153 | } | 161 | } |
154 | 162 | ||
155 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); | 163 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_tmp); |
156 | dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", msr_lo, msr_tmp); | 164 | dprintk("PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x\n", |
165 | msr_lo, msr_tmp); | ||
157 | 166 | ||
158 | msr_tmp = (msr_lo >> 22) & 0x1f; | 167 | msr_tmp = (msr_lo >> 22) & 0x1f; |
159 | dprintk("bits 22-26 are 0x%x, speed is %u\n", msr_tmp, (msr_tmp * fsb)); | 168 | dprintk("bits 22-26 are 0x%x, speed is %u\n", |
169 | msr_tmp, (msr_tmp * fsb)); | ||
160 | 170 | ||
161 | return (msr_tmp * fsb); | 171 | ret = (msr_tmp * fsb); |
172 | return ret; | ||
162 | } | 173 | } |
163 | 174 | ||
164 | 175 | ||
@@ -167,6 +178,16 @@ static unsigned int pentium4_get_frequency(void) | |||
167 | struct cpuinfo_x86 *c = &boot_cpu_data; | 178 | struct cpuinfo_x86 *c = &boot_cpu_data; |
168 | u32 msr_lo, msr_hi, mult; | 179 | u32 msr_lo, msr_hi, mult; |
169 | unsigned int fsb = 0; | 180 | unsigned int fsb = 0; |
181 | unsigned int ret; | ||
182 | u8 fsb_code; | ||
183 | |||
184 | /* Pentium 4 Model 0 and 1 do not have the Core Clock Frequency | ||
185 | * to System Bus Frequency Ratio Field in the Processor Frequency | ||
186 | * Configuration Register of the MSR. Therefore the current | ||
187 | * frequency cannot be calculated and has to be measured. | ||
188 | */ | ||
189 | if (c->x86_model < 2) | ||
190 | return cpu_khz; | ||
170 | 191 | ||
171 | rdmsr(0x2c, msr_lo, msr_hi); | 192 | rdmsr(0x2c, msr_lo, msr_hi); |
172 | 193 | ||
@@ -177,62 +198,61 @@ static unsigned int pentium4_get_frequency(void) | |||
177 | * revision #12 in Table B-1: MSRs in the Pentium 4 and | 198 | * revision #12 in Table B-1: MSRs in the Pentium 4 and |
178 | * Intel Xeon Processors, on page B-4 and B-5. | 199 | * Intel Xeon Processors, on page B-4 and B-5. |
179 | */ | 200 | */ |
180 | if (c->x86_model < 2) | 201 | fsb_code = (msr_lo >> 16) & 0x7; |
202 | switch (fsb_code) { | ||
203 | case 0: | ||
181 | fsb = 100 * 1000; | 204 | fsb = 100 * 1000; |
182 | else { | 205 | break; |
183 | u8 fsb_code = (msr_lo >> 16) & 0x7; | 206 | case 1: |
184 | switch (fsb_code) { | 207 | fsb = 13333 * 10; |
185 | case 0: | 208 | break; |
186 | fsb = 100 * 1000; | 209 | case 2: |
187 | break; | 210 | fsb = 200 * 1000; |
188 | case 1: | 211 | break; |
189 | fsb = 13333 * 10; | ||
190 | break; | ||
191 | case 2: | ||
192 | fsb = 200 * 1000; | ||
193 | break; | ||
194 | } | ||
195 | } | 212 | } |
196 | 213 | ||
197 | if (!fsb) | 214 | if (!fsb) |
198 | printk(KERN_DEBUG "speedstep-lib: couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>\n"); | 215 | printk(KERN_DEBUG PFX "couldn't detect FSB speed. " |
216 | "Please send an e-mail to <linux@brodo.de>\n"); | ||
199 | 217 | ||
200 | /* Multiplier. */ | 218 | /* Multiplier. */ |
201 | mult = msr_lo >> 24; | 219 | mult = msr_lo >> 24; |
202 | 220 | ||
203 | dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", fsb, mult, (fsb * mult)); | 221 | dprintk("P4 - FSB %u kHz; Multiplier %u; Speed %u kHz\n", |
222 | fsb, mult, (fsb * mult)); | ||
204 | 223 | ||
205 | return (fsb * mult); | 224 | ret = (fsb * mult); |
225 | return ret; | ||
206 | } | 226 | } |
207 | 227 | ||
208 | 228 | ||
209 | unsigned int speedstep_get_processor_frequency(unsigned int processor) | 229 | unsigned int speedstep_get_frequency(unsigned int processor) |
210 | { | 230 | { |
211 | switch (processor) { | 231 | switch (processor) { |
212 | case SPEEDSTEP_PROCESSOR_PCORE: | 232 | case SPEEDSTEP_CPU_PCORE: |
213 | return pentium_core_get_frequency(); | 233 | return pentium_core_get_frequency(); |
214 | case SPEEDSTEP_PROCESSOR_PM: | 234 | case SPEEDSTEP_CPU_PM: |
215 | return pentiumM_get_frequency(); | 235 | return pentiumM_get_frequency(); |
216 | case SPEEDSTEP_PROCESSOR_P4D: | 236 | case SPEEDSTEP_CPU_P4D: |
217 | case SPEEDSTEP_PROCESSOR_P4M: | 237 | case SPEEDSTEP_CPU_P4M: |
218 | return pentium4_get_frequency(); | 238 | return pentium4_get_frequency(); |
219 | case SPEEDSTEP_PROCESSOR_PIII_T: | 239 | case SPEEDSTEP_CPU_PIII_T: |
220 | case SPEEDSTEP_PROCESSOR_PIII_C: | 240 | case SPEEDSTEP_CPU_PIII_C: |
221 | case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: | 241 | case SPEEDSTEP_CPU_PIII_C_EARLY: |
222 | return pentium3_get_frequency(processor); | 242 | return pentium3_get_frequency(processor); |
223 | default: | 243 | default: |
224 | return 0; | 244 | return 0; |
225 | }; | 245 | }; |
226 | return 0; | 246 | return 0; |
227 | } | 247 | } |
228 | EXPORT_SYMBOL_GPL(speedstep_get_processor_frequency); | 248 | EXPORT_SYMBOL_GPL(speedstep_get_frequency); |
229 | 249 | ||
230 | 250 | ||
231 | /********************************************************************* | 251 | /********************************************************************* |
232 | * DETECT SPEEDSTEP-CAPABLE PROCESSOR * | 252 | * DETECT SPEEDSTEP-CAPABLE PROCESSOR * |
233 | *********************************************************************/ | 253 | *********************************************************************/ |
234 | 254 | ||
235 | unsigned int speedstep_detect_processor (void) | 255 | unsigned int speedstep_detect_processor(void) |
236 | { | 256 | { |
237 | struct cpuinfo_x86 *c = &cpu_data(0); | 257 | struct cpuinfo_x86 *c = &cpu_data(0); |
238 | u32 ebx, msr_lo, msr_hi; | 258 | u32 ebx, msr_lo, msr_hi; |
@@ -261,7 +281,7 @@ unsigned int speedstep_detect_processor (void) | |||
261 | * sample has ebx = 0x0f, production has 0x0e. | 281 | * sample has ebx = 0x0f, production has 0x0e. |
262 | */ | 282 | */ |
263 | if ((ebx == 0x0e) || (ebx == 0x0f)) | 283 | if ((ebx == 0x0e) || (ebx == 0x0f)) |
264 | return SPEEDSTEP_PROCESSOR_P4M; | 284 | return SPEEDSTEP_CPU_P4M; |
265 | break; | 285 | break; |
266 | case 7: | 286 | case 7: |
267 | /* | 287 | /* |
@@ -272,7 +292,7 @@ unsigned int speedstep_detect_processor (void) | |||
272 | * samples are only of B-stepping... | 292 | * samples are only of B-stepping... |
273 | */ | 293 | */ |
274 | if (ebx == 0x0e) | 294 | if (ebx == 0x0e) |
275 | return SPEEDSTEP_PROCESSOR_P4M; | 295 | return SPEEDSTEP_CPU_P4M; |
276 | break; | 296 | break; |
277 | case 9: | 297 | case 9: |
278 | /* | 298 | /* |
@@ -288,10 +308,13 @@ unsigned int speedstep_detect_processor (void) | |||
288 | * M-P4-Ms may have either ebx=0xe or 0xf [see above] | 308 | * M-P4-Ms may have either ebx=0xe or 0xf [see above] |
289 | * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] | 309 | * M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf] |
290 | * also, M-P4M HTs have ebx=0x8, too | 310 | * also, M-P4M HTs have ebx=0x8, too |
291 | * For now, they are distinguished by the model_id string | 311 | * For now, they are distinguished by the model_id |
312 | * string | ||
292 | */ | 313 | */ |
293 | if ((ebx == 0x0e) || (strstr(c->x86_model_id,"Mobile Intel(R) Pentium(R) 4") != NULL)) | 314 | if ((ebx == 0x0e) || |
294 | return SPEEDSTEP_PROCESSOR_P4M; | 315 | (strstr(c->x86_model_id, |
316 | "Mobile Intel(R) Pentium(R) 4") != NULL)) | ||
317 | return SPEEDSTEP_CPU_P4M; | ||
295 | break; | 318 | break; |
296 | default: | 319 | default: |
297 | break; | 320 | break; |
@@ -301,7 +324,8 @@ unsigned int speedstep_detect_processor (void) | |||
301 | 324 | ||
302 | switch (c->x86_model) { | 325 | switch (c->x86_model) { |
303 | case 0x0B: /* Intel PIII [Tualatin] */ | 326 | case 0x0B: /* Intel PIII [Tualatin] */ |
304 | /* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */ | 327 | /* cpuid_ebx(1) is 0x04 for desktop PIII, |
328 | * 0x06 for mobile PIII-M */ | ||
305 | ebx = cpuid_ebx(0x00000001); | 329 | ebx = cpuid_ebx(0x00000001); |
306 | dprintk("ebx is %x\n", ebx); | 330 | dprintk("ebx is %x\n", ebx); |
307 | 331 | ||
@@ -313,14 +337,15 @@ unsigned int speedstep_detect_processor (void) | |||
313 | /* So far all PIII-M processors support SpeedStep. See | 337 | /* So far all PIII-M processors support SpeedStep. See |
314 | * Intel's 24540640.pdf of June 2003 | 338 | * Intel's 24540640.pdf of June 2003 |
315 | */ | 339 | */ |
316 | return SPEEDSTEP_PROCESSOR_PIII_T; | 340 | return SPEEDSTEP_CPU_PIII_T; |
317 | 341 | ||
318 | case 0x08: /* Intel PIII [Coppermine] */ | 342 | case 0x08: /* Intel PIII [Coppermine] */ |
319 | 343 | ||
320 | /* all mobile PIII Coppermines have FSB 100 MHz | 344 | /* all mobile PIII Coppermines have FSB 100 MHz |
321 | * ==> sort out a few desktop PIIIs. */ | 345 | * ==> sort out a few desktop PIIIs. */ |
322 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_hi); | 346 | rdmsr(MSR_IA32_EBL_CR_POWERON, msr_lo, msr_hi); |
323 | dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", msr_lo, msr_hi); | 347 | dprintk("Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x\n", |
348 | msr_lo, msr_hi); | ||
324 | msr_lo &= 0x00c0000; | 349 | msr_lo &= 0x00c0000; |
325 | if (msr_lo != 0x0080000) | 350 | if (msr_lo != 0x0080000) |
326 | return 0; | 351 | return 0; |
@@ -332,13 +357,15 @@ unsigned int speedstep_detect_processor (void) | |||
332 | * bit 56 or 57 is set | 357 | * bit 56 or 57 is set |
333 | */ | 358 | */ |
334 | rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi); | 359 | rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi); |
335 | dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi); | 360 | dprintk("Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", |
336 | if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) { | 361 | msr_lo, msr_hi); |
362 | if ((msr_hi & (1<<18)) && | ||
363 | (relaxed_check ? 1 : (msr_hi & (3<<24)))) { | ||
337 | if (c->x86_mask == 0x01) { | 364 | if (c->x86_mask == 0x01) { |
338 | dprintk("early PIII version\n"); | 365 | dprintk("early PIII version\n"); |
339 | return SPEEDSTEP_PROCESSOR_PIII_C_EARLY; | 366 | return SPEEDSTEP_CPU_PIII_C_EARLY; |
340 | } else | 367 | } else |
341 | return SPEEDSTEP_PROCESSOR_PIII_C; | 368 | return SPEEDSTEP_CPU_PIII_C; |
342 | } | 369 | } |
343 | 370 | ||
344 | default: | 371 | default: |
@@ -369,7 +396,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
369 | dprintk("trying to determine both speeds\n"); | 396 | dprintk("trying to determine both speeds\n"); |
370 | 397 | ||
371 | /* get current speed */ | 398 | /* get current speed */ |
372 | prev_speed = speedstep_get_processor_frequency(processor); | 399 | prev_speed = speedstep_get_frequency(processor); |
373 | if (!prev_speed) | 400 | if (!prev_speed) |
374 | return -EIO; | 401 | return -EIO; |
375 | 402 | ||
@@ -379,7 +406,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
379 | 406 | ||
380 | /* switch to low state */ | 407 | /* switch to low state */ |
381 | set_state(SPEEDSTEP_LOW); | 408 | set_state(SPEEDSTEP_LOW); |
382 | *low_speed = speedstep_get_processor_frequency(processor); | 409 | *low_speed = speedstep_get_frequency(processor); |
383 | if (!*low_speed) { | 410 | if (!*low_speed) { |
384 | ret = -EIO; | 411 | ret = -EIO; |
385 | goto out; | 412 | goto out; |
@@ -398,7 +425,7 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
398 | if (transition_latency) | 425 | if (transition_latency) |
399 | do_gettimeofday(&tv2); | 426 | do_gettimeofday(&tv2); |
400 | 427 | ||
401 | *high_speed = speedstep_get_processor_frequency(processor); | 428 | *high_speed = speedstep_get_frequency(processor); |
402 | if (!*high_speed) { | 429 | if (!*high_speed) { |
403 | ret = -EIO; | 430 | ret = -EIO; |
404 | goto out; | 431 | goto out; |
@@ -426,9 +453,12 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
426 | /* check if the latency measurement is too high or too low | 453 | /* check if the latency measurement is too high or too low |
427 | * and set it to a safe value (500uSec) in that case | 454 | * and set it to a safe value (500uSec) in that case |
428 | */ | 455 | */ |
429 | if (*transition_latency > 10000000 || *transition_latency < 50000) { | 456 | if (*transition_latency > 10000000 || |
430 | printk (KERN_WARNING "speedstep: frequency transition measured seems out of " | 457 | *transition_latency < 50000) { |
431 | "range (%u nSec), falling back to a safe one of %u nSec.\n", | 458 | printk(KERN_WARNING PFX "frequency transition " |
459 | "measured seems out of range (%u " | ||
460 | "nSec), falling back to a safe one of" | ||
461 | "%u nSec.\n", | ||
432 | *transition_latency, 500000); | 462 | *transition_latency, 500000); |
433 | *transition_latency = 500000; | 463 | *transition_latency = 500000; |
434 | } | 464 | } |
@@ -436,15 +466,16 @@ unsigned int speedstep_get_freqs(unsigned int processor, | |||
436 | 466 | ||
437 | out: | 467 | out: |
438 | local_irq_restore(flags); | 468 | local_irq_restore(flags); |
439 | return (ret); | 469 | return ret; |
440 | } | 470 | } |
441 | EXPORT_SYMBOL_GPL(speedstep_get_freqs); | 471 | EXPORT_SYMBOL_GPL(speedstep_get_freqs); |
442 | 472 | ||
443 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK | 473 | #ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK |
444 | module_param(relaxed_check, int, 0444); | 474 | module_param(relaxed_check, int, 0444); |
445 | MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability."); | 475 | MODULE_PARM_DESC(relaxed_check, |
476 | "Don't do all checks for speedstep capability."); | ||
446 | #endif | 477 | #endif |
447 | 478 | ||
448 | MODULE_AUTHOR ("Dominik Brodowski <linux@brodo.de>"); | 479 | MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>"); |
449 | MODULE_DESCRIPTION ("Library for Intel SpeedStep 1 or 2 cpufreq drivers."); | 480 | MODULE_DESCRIPTION("Library for Intel SpeedStep 1 or 2 cpufreq drivers."); |
450 | MODULE_LICENSE ("GPL"); | 481 | MODULE_LICENSE("GPL"); |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h index b11bcc608cac..2b6c04e5a304 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-lib.h | |||
@@ -12,17 +12,17 @@ | |||
12 | 12 | ||
13 | /* processors */ | 13 | /* processors */ |
14 | 14 | ||
15 | #define SPEEDSTEP_PROCESSOR_PIII_C_EARLY 0x00000001 /* Coppermine core */ | 15 | #define SPEEDSTEP_CPU_PIII_C_EARLY 0x00000001 /* Coppermine core */ |
16 | #define SPEEDSTEP_PROCESSOR_PIII_C 0x00000002 /* Coppermine core */ | 16 | #define SPEEDSTEP_CPU_PIII_C 0x00000002 /* Coppermine core */ |
17 | #define SPEEDSTEP_PROCESSOR_PIII_T 0x00000003 /* Tualatin core */ | 17 | #define SPEEDSTEP_CPU_PIII_T 0x00000003 /* Tualatin core */ |
18 | #define SPEEDSTEP_PROCESSOR_P4M 0x00000004 /* P4-M */ | 18 | #define SPEEDSTEP_CPU_P4M 0x00000004 /* P4-M */ |
19 | 19 | ||
20 | /* the following processors are not speedstep-capable and are not auto-detected | 20 | /* the following processors are not speedstep-capable and are not auto-detected |
21 | * in speedstep_detect_processor(). However, their speed can be detected using | 21 | * in speedstep_detect_processor(). However, their speed can be detected using |
22 | * the speedstep_get_processor_frequency() call. */ | 22 | * the speedstep_get_frequency() call. */ |
23 | #define SPEEDSTEP_PROCESSOR_PM 0xFFFFFF03 /* Pentium M */ | 23 | #define SPEEDSTEP_CPU_PM 0xFFFFFF03 /* Pentium M */ |
24 | #define SPEEDSTEP_PROCESSOR_P4D 0xFFFFFF04 /* desktop P4 */ | 24 | #define SPEEDSTEP_CPU_P4D 0xFFFFFF04 /* desktop P4 */ |
25 | #define SPEEDSTEP_PROCESSOR_PCORE 0xFFFFFF05 /* Core */ | 25 | #define SPEEDSTEP_CPU_PCORE 0xFFFFFF05 /* Core */ |
26 | 26 | ||
27 | /* speedstep states -- only two of them */ | 27 | /* speedstep states -- only two of them */ |
28 | 28 | ||
@@ -34,7 +34,7 @@ | |||
34 | extern unsigned int speedstep_detect_processor (void); | 34 | extern unsigned int speedstep_detect_processor (void); |
35 | 35 | ||
36 | /* detect the current speed (in khz) of the processor */ | 36 | /* detect the current speed (in khz) of the processor */ |
37 | extern unsigned int speedstep_get_processor_frequency(unsigned int processor); | 37 | extern unsigned int speedstep_get_frequency(unsigned int processor); |
38 | 38 | ||
39 | 39 | ||
40 | /* detect the low and high speeds of the processor. The callback | 40 | /* detect the low and high speeds of the processor. The callback |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c index 8a85c93bd62a..befea088e4f5 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | |||
@@ -19,8 +19,8 @@ | |||
19 | #include <linux/cpufreq.h> | 19 | #include <linux/cpufreq.h> |
20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
22 | #include <linux/io.h> | ||
22 | #include <asm/ist.h> | 23 | #include <asm/ist.h> |
23 | #include <asm/io.h> | ||
24 | 24 | ||
25 | #include "speedstep-lib.h" | 25 | #include "speedstep-lib.h" |
26 | 26 | ||
@@ -30,12 +30,12 @@ | |||
30 | * If user gives it, these are used. | 30 | * If user gives it, these are used. |
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | static int smi_port = 0; | 33 | static int smi_port; |
34 | static int smi_cmd = 0; | 34 | static int smi_cmd; |
35 | static unsigned int smi_sig = 0; | 35 | static unsigned int smi_sig; |
36 | 36 | ||
37 | /* info about the processor */ | 37 | /* info about the processor */ |
38 | static unsigned int speedstep_processor = 0; | 38 | static unsigned int speedstep_processor; |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * There are only two frequency states for each processor. Values | 41 | * There are only two frequency states for each processor. Values |
@@ -56,12 +56,13 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
56 | * of DMA activity going on? */ | 56 | * of DMA activity going on? */ |
57 | #define SMI_TRIES 5 | 57 | #define SMI_TRIES 5 |
58 | 58 | ||
59 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-smi", msg) | 59 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \ |
60 | "speedstep-smi", msg) | ||
60 | 61 | ||
61 | /** | 62 | /** |
62 | * speedstep_smi_ownership | 63 | * speedstep_smi_ownership |
63 | */ | 64 | */ |
64 | static int speedstep_smi_ownership (void) | 65 | static int speedstep_smi_ownership(void) |
65 | { | 66 | { |
66 | u32 command, result, magic, dummy; | 67 | u32 command, result, magic, dummy; |
67 | u32 function = GET_SPEEDSTEP_OWNER; | 68 | u32 function = GET_SPEEDSTEP_OWNER; |
@@ -70,16 +71,18 @@ static int speedstep_smi_ownership (void) | |||
70 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 71 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
71 | magic = virt_to_phys(magic_data); | 72 | magic = virt_to_phys(magic_data); |
72 | 73 | ||
73 | dprintk("trying to obtain ownership with command %x at port %x\n", command, smi_port); | 74 | dprintk("trying to obtain ownership with command %x at port %x\n", |
75 | command, smi_port); | ||
74 | 76 | ||
75 | __asm__ __volatile__( | 77 | __asm__ __volatile__( |
76 | "push %%ebp\n" | 78 | "push %%ebp\n" |
77 | "out %%al, (%%dx)\n" | 79 | "out %%al, (%%dx)\n" |
78 | "pop %%ebp\n" | 80 | "pop %%ebp\n" |
79 | : "=D" (result), "=a" (dummy), "=b" (dummy), "=c" (dummy), "=d" (dummy), | 81 | : "=D" (result), |
80 | "=S" (dummy) | 82 | "=a" (dummy), "=b" (dummy), "=c" (dummy), "=d" (dummy), |
83 | "=S" (dummy) | ||
81 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), | 84 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), |
82 | "D" (0), "S" (magic) | 85 | "D" (0), "S" (magic) |
83 | : "memory" | 86 | : "memory" |
84 | ); | 87 | ); |
85 | 88 | ||
@@ -97,10 +100,10 @@ static int speedstep_smi_ownership (void) | |||
97 | * even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing | 100 | * even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing |
98 | * shows that the latter occurs if !(ist_info.event & 0xFFFF). | 101 | * shows that the latter occurs if !(ist_info.event & 0xFFFF). |
99 | */ | 102 | */ |
100 | static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | 103 | static int speedstep_smi_get_freqs(unsigned int *low, unsigned int *high) |
101 | { | 104 | { |
102 | u32 command, result = 0, edi, high_mhz, low_mhz, dummy; | 105 | u32 command, result = 0, edi, high_mhz, low_mhz, dummy; |
103 | u32 state=0; | 106 | u32 state = 0; |
104 | u32 function = GET_SPEEDSTEP_FREQS; | 107 | u32 function = GET_SPEEDSTEP_FREQS; |
105 | 108 | ||
106 | if (!(ist_info.event & 0xFFFF)) { | 109 | if (!(ist_info.event & 0xFFFF)) { |
@@ -110,17 +113,25 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
110 | 113 | ||
111 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 114 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
112 | 115 | ||
113 | dprintk("trying to determine frequencies with command %x at port %x\n", command, smi_port); | 116 | dprintk("trying to determine frequencies with command %x at port %x\n", |
117 | command, smi_port); | ||
114 | 118 | ||
115 | __asm__ __volatile__( | 119 | __asm__ __volatile__( |
116 | "push %%ebp\n" | 120 | "push %%ebp\n" |
117 | "out %%al, (%%dx)\n" | 121 | "out %%al, (%%dx)\n" |
118 | "pop %%ebp" | 122 | "pop %%ebp" |
119 | : "=a" (result), "=b" (high_mhz), "=c" (low_mhz), "=d" (state), "=D" (edi), "=S" (dummy) | 123 | : "=a" (result), |
120 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | 124 | "=b" (high_mhz), |
125 | "=c" (low_mhz), | ||
126 | "=d" (state), "=D" (edi), "=S" (dummy) | ||
127 | : "a" (command), | ||
128 | "b" (function), | ||
129 | "c" (state), | ||
130 | "d" (smi_port), "S" (0), "D" (0) | ||
121 | ); | 131 | ); |
122 | 132 | ||
123 | dprintk("result %x, low_freq %u, high_freq %u\n", result, low_mhz, high_mhz); | 133 | dprintk("result %x, low_freq %u, high_freq %u\n", |
134 | result, low_mhz, high_mhz); | ||
124 | 135 | ||
125 | /* abort if results are obviously incorrect... */ | 136 | /* abort if results are obviously incorrect... */ |
126 | if ((high_mhz + low_mhz) < 600) | 137 | if ((high_mhz + low_mhz) < 600) |
@@ -137,26 +148,30 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
137 | * @state: processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) | 148 | * @state: processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) |
138 | * | 149 | * |
139 | */ | 150 | */ |
140 | static int speedstep_get_state (void) | 151 | static int speedstep_get_state(void) |
141 | { | 152 | { |
142 | u32 function=GET_SPEEDSTEP_STATE; | 153 | u32 function = GET_SPEEDSTEP_STATE; |
143 | u32 result, state, edi, command, dummy; | 154 | u32 result, state, edi, command, dummy; |
144 | 155 | ||
145 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 156 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
146 | 157 | ||
147 | dprintk("trying to determine current setting with command %x at port %x\n", command, smi_port); | 158 | dprintk("trying to determine current setting with command %x " |
159 | "at port %x\n", command, smi_port); | ||
148 | 160 | ||
149 | __asm__ __volatile__( | 161 | __asm__ __volatile__( |
150 | "push %%ebp\n" | 162 | "push %%ebp\n" |
151 | "out %%al, (%%dx)\n" | 163 | "out %%al, (%%dx)\n" |
152 | "pop %%ebp\n" | 164 | "pop %%ebp\n" |
153 | : "=a" (result), "=b" (state), "=D" (edi), "=c" (dummy), "=d" (dummy), "=S" (dummy) | 165 | : "=a" (result), |
154 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "S" (0), "D" (0) | 166 | "=b" (state), "=D" (edi), |
167 | "=c" (dummy), "=d" (dummy), "=S" (dummy) | ||
168 | : "a" (command), "b" (function), "c" (0), | ||
169 | "d" (smi_port), "S" (0), "D" (0) | ||
155 | ); | 170 | ); |
156 | 171 | ||
157 | dprintk("state is %x, result is %x\n", state, result); | 172 | dprintk("state is %x, result is %x\n", state, result); |
158 | 173 | ||
159 | return (state & 1); | 174 | return state & 1; |
160 | } | 175 | } |
161 | 176 | ||
162 | 177 | ||
@@ -165,11 +180,11 @@ static int speedstep_get_state (void) | |||
165 | * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) | 180 | * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH) |
166 | * | 181 | * |
167 | */ | 182 | */ |
168 | static void speedstep_set_state (unsigned int state) | 183 | static void speedstep_set_state(unsigned int state) |
169 | { | 184 | { |
170 | unsigned int result = 0, command, new_state, dummy; | 185 | unsigned int result = 0, command, new_state, dummy; |
171 | unsigned long flags; | 186 | unsigned long flags; |
172 | unsigned int function=SET_SPEEDSTEP_STATE; | 187 | unsigned int function = SET_SPEEDSTEP_STATE; |
173 | unsigned int retry = 0; | 188 | unsigned int retry = 0; |
174 | 189 | ||
175 | if (state > 0x1) | 190 | if (state > 0x1) |
@@ -180,11 +195,14 @@ static void speedstep_set_state (unsigned int state) | |||
180 | 195 | ||
181 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 196 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
182 | 197 | ||
183 | dprintk("trying to set frequency to state %u with command %x at port %x\n", state, command, smi_port); | 198 | dprintk("trying to set frequency to state %u " |
199 | "with command %x at port %x\n", | ||
200 | state, command, smi_port); | ||
184 | 201 | ||
185 | do { | 202 | do { |
186 | if (retry) { | 203 | if (retry) { |
187 | dprintk("retry %u, previous result %u, waiting...\n", retry, result); | 204 | dprintk("retry %u, previous result %u, waiting...\n", |
205 | retry, result); | ||
188 | mdelay(retry * 50); | 206 | mdelay(retry * 50); |
189 | } | 207 | } |
190 | retry++; | 208 | retry++; |
@@ -192,20 +210,26 @@ static void speedstep_set_state (unsigned int state) | |||
192 | "push %%ebp\n" | 210 | "push %%ebp\n" |
193 | "out %%al, (%%dx)\n" | 211 | "out %%al, (%%dx)\n" |
194 | "pop %%ebp" | 212 | "pop %%ebp" |
195 | : "=b" (new_state), "=D" (result), "=c" (dummy), "=a" (dummy), | 213 | : "=b" (new_state), "=D" (result), |
196 | "=d" (dummy), "=S" (dummy) | 214 | "=c" (dummy), "=a" (dummy), |
197 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | 215 | "=d" (dummy), "=S" (dummy) |
216 | : "a" (command), "b" (function), "c" (state), | ||
217 | "d" (smi_port), "S" (0), "D" (0) | ||
198 | ); | 218 | ); |
199 | } while ((new_state != state) && (retry <= SMI_TRIES)); | 219 | } while ((new_state != state) && (retry <= SMI_TRIES)); |
200 | 220 | ||
201 | /* enable IRQs */ | 221 | /* enable IRQs */ |
202 | local_irq_restore(flags); | 222 | local_irq_restore(flags); |
203 | 223 | ||
204 | if (new_state == state) { | 224 | if (new_state == state) |
205 | dprintk("change to %u MHz succeeded after %u tries with result %u\n", (speedstep_freqs[new_state].frequency / 1000), retry, result); | 225 | dprintk("change to %u MHz succeeded after %u tries " |
206 | } else { | 226 | "with result %u\n", |
207 | printk(KERN_ERR "cpufreq: change to state %u failed with new_state %u and result %u\n", state, new_state, result); | 227 | (speedstep_freqs[new_state].frequency / 1000), |
208 | } | 228 | retry, result); |
229 | else | ||
230 | printk(KERN_ERR "cpufreq: change to state %u " | ||
231 | "failed with new_state %u and result %u\n", | ||
232 | state, new_state, result); | ||
209 | 233 | ||
210 | return; | 234 | return; |
211 | } | 235 | } |
@@ -219,13 +243,14 @@ static void speedstep_set_state (unsigned int state) | |||
219 | * | 243 | * |
220 | * Sets a new CPUFreq policy/freq. | 244 | * Sets a new CPUFreq policy/freq. |
221 | */ | 245 | */ |
222 | static int speedstep_target (struct cpufreq_policy *policy, | 246 | static int speedstep_target(struct cpufreq_policy *policy, |
223 | unsigned int target_freq, unsigned int relation) | 247 | unsigned int target_freq, unsigned int relation) |
224 | { | 248 | { |
225 | unsigned int newstate = 0; | 249 | unsigned int newstate = 0; |
226 | struct cpufreq_freqs freqs; | 250 | struct cpufreq_freqs freqs; |
227 | 251 | ||
228 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], target_freq, relation, &newstate)) | 252 | if (cpufreq_frequency_table_target(policy, &speedstep_freqs[0], |
253 | target_freq, relation, &newstate)) | ||
229 | return -EINVAL; | 254 | return -EINVAL; |
230 | 255 | ||
231 | freqs.old = speedstep_freqs[speedstep_get_state()].frequency; | 256 | freqs.old = speedstep_freqs[speedstep_get_state()].frequency; |
@@ -250,7 +275,7 @@ static int speedstep_target (struct cpufreq_policy *policy, | |||
250 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with | 275 | * Limit must be within speedstep_low_freq and speedstep_high_freq, with |
251 | * at least one border included. | 276 | * at least one border included. |
252 | */ | 277 | */ |
253 | static int speedstep_verify (struct cpufreq_policy *policy) | 278 | static int speedstep_verify(struct cpufreq_policy *policy) |
254 | { | 279 | { |
255 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); | 280 | return cpufreq_frequency_table_verify(policy, &speedstep_freqs[0]); |
256 | } | 281 | } |
@@ -259,7 +284,8 @@ static int speedstep_verify (struct cpufreq_policy *policy) | |||
259 | static int speedstep_cpu_init(struct cpufreq_policy *policy) | 284 | static int speedstep_cpu_init(struct cpufreq_policy *policy) |
260 | { | 285 | { |
261 | int result; | 286 | int result; |
262 | unsigned int speed,state; | 287 | unsigned int speed, state; |
288 | unsigned int *low, *high; | ||
263 | 289 | ||
264 | /* capability check */ | 290 | /* capability check */ |
265 | if (policy->cpu != 0) | 291 | if (policy->cpu != 0) |
@@ -272,19 +298,23 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
272 | } | 298 | } |
273 | 299 | ||
274 | /* detect low and high frequency */ | 300 | /* detect low and high frequency */ |
275 | result = speedstep_smi_get_freqs(&speedstep_freqs[SPEEDSTEP_LOW].frequency, | 301 | low = &speedstep_freqs[SPEEDSTEP_LOW].frequency; |
276 | &speedstep_freqs[SPEEDSTEP_HIGH].frequency); | 302 | high = &speedstep_freqs[SPEEDSTEP_HIGH].frequency; |
303 | |||
304 | result = speedstep_smi_get_freqs(low, high); | ||
277 | if (result) { | 305 | if (result) { |
278 | /* fall back to speedstep_lib.c dection mechanism: try both states out */ | 306 | /* fall back to speedstep_lib.c dection mechanism: |
279 | dprintk("could not detect low and high frequencies by SMI call.\n"); | 307 | * try both states out */ |
308 | dprintk("could not detect low and high frequencies " | ||
309 | "by SMI call.\n"); | ||
280 | result = speedstep_get_freqs(speedstep_processor, | 310 | result = speedstep_get_freqs(speedstep_processor, |
281 | &speedstep_freqs[SPEEDSTEP_LOW].frequency, | 311 | low, high, |
282 | &speedstep_freqs[SPEEDSTEP_HIGH].frequency, | ||
283 | NULL, | 312 | NULL, |
284 | &speedstep_set_state); | 313 | &speedstep_set_state); |
285 | 314 | ||
286 | if (result) { | 315 | if (result) { |
287 | dprintk("could not detect two different speeds -- aborting.\n"); | 316 | dprintk("could not detect two different speeds" |
317 | " -- aborting.\n"); | ||
288 | return result; | 318 | return result; |
289 | } else | 319 | } else |
290 | dprintk("workaround worked.\n"); | 320 | dprintk("workaround worked.\n"); |
@@ -295,7 +325,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
295 | speed = speedstep_freqs[state].frequency; | 325 | speed = speedstep_freqs[state].frequency; |
296 | 326 | ||
297 | dprintk("currently at %s speed setting - %i MHz\n", | 327 | dprintk("currently at %s speed setting - %i MHz\n", |
298 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) ? "low" : "high", | 328 | (speed == speedstep_freqs[SPEEDSTEP_LOW].frequency) |
329 | ? "low" : "high", | ||
299 | (speed / 1000)); | 330 | (speed / 1000)); |
300 | 331 | ||
301 | /* cpuinfo and default policy values */ | 332 | /* cpuinfo and default policy values */ |
@@ -304,7 +335,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy) | |||
304 | 335 | ||
305 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); | 336 | result = cpufreq_frequency_table_cpuinfo(policy, speedstep_freqs); |
306 | if (result) | 337 | if (result) |
307 | return (result); | 338 | return result; |
308 | 339 | ||
309 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); | 340 | cpufreq_frequency_table_get_attr(speedstep_freqs, policy->cpu); |
310 | 341 | ||
@@ -321,7 +352,7 @@ static unsigned int speedstep_get(unsigned int cpu) | |||
321 | { | 352 | { |
322 | if (cpu) | 353 | if (cpu) |
323 | return -ENODEV; | 354 | return -ENODEV; |
324 | return speedstep_get_processor_frequency(speedstep_processor); | 355 | return speedstep_get_frequency(speedstep_processor); |
325 | } | 356 | } |
326 | 357 | ||
327 | 358 | ||
@@ -335,7 +366,7 @@ static int speedstep_resume(struct cpufreq_policy *policy) | |||
335 | return result; | 366 | return result; |
336 | } | 367 | } |
337 | 368 | ||
338 | static struct freq_attr* speedstep_attr[] = { | 369 | static struct freq_attr *speedstep_attr[] = { |
339 | &cpufreq_freq_attr_scaling_available_freqs, | 370 | &cpufreq_freq_attr_scaling_available_freqs, |
340 | NULL, | 371 | NULL, |
341 | }; | 372 | }; |
@@ -364,21 +395,23 @@ static int __init speedstep_init(void) | |||
364 | speedstep_processor = speedstep_detect_processor(); | 395 | speedstep_processor = speedstep_detect_processor(); |
365 | 396 | ||
366 | switch (speedstep_processor) { | 397 | switch (speedstep_processor) { |
367 | case SPEEDSTEP_PROCESSOR_PIII_T: | 398 | case SPEEDSTEP_CPU_PIII_T: |
368 | case SPEEDSTEP_PROCESSOR_PIII_C: | 399 | case SPEEDSTEP_CPU_PIII_C: |
369 | case SPEEDSTEP_PROCESSOR_PIII_C_EARLY: | 400 | case SPEEDSTEP_CPU_PIII_C_EARLY: |
370 | break; | 401 | break; |
371 | default: | 402 | default: |
372 | speedstep_processor = 0; | 403 | speedstep_processor = 0; |
373 | } | 404 | } |
374 | 405 | ||
375 | if (!speedstep_processor) { | 406 | if (!speedstep_processor) { |
376 | dprintk ("No supported Intel CPU detected.\n"); | 407 | dprintk("No supported Intel CPU detected.\n"); |
377 | return -ENODEV; | 408 | return -ENODEV; |
378 | } | 409 | } |
379 | 410 | ||
380 | dprintk("signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.\n", | 411 | dprintk("signature:0x%.8lx, command:0x%.8lx, " |
381 | ist_info.signature, ist_info.command, ist_info.event, ist_info.perf_level); | 412 | "event:0x%.8lx, perf_level:0x%.8lx.\n", |
413 | ist_info.signature, ist_info.command, | ||
414 | ist_info.event, ist_info.perf_level); | ||
382 | 415 | ||
383 | /* Error if no IST-SMI BIOS or no PARM | 416 | /* Error if no IST-SMI BIOS or no PARM |
384 | sig= 'ISGE' aka 'Intel Speedstep Gate E' */ | 417 | sig= 'ISGE' aka 'Intel Speedstep Gate E' */ |
@@ -416,17 +449,20 @@ static void __exit speedstep_exit(void) | |||
416 | cpufreq_unregister_driver(&speedstep_driver); | 449 | cpufreq_unregister_driver(&speedstep_driver); |
417 | } | 450 | } |
418 | 451 | ||
419 | module_param(smi_port, int, 0444); | 452 | module_param(smi_port, int, 0444); |
420 | module_param(smi_cmd, int, 0444); | 453 | module_param(smi_cmd, int, 0444); |
421 | module_param(smi_sig, uint, 0444); | 454 | module_param(smi_sig, uint, 0444); |
422 | 455 | ||
423 | MODULE_PARM_DESC(smi_port, "Override the BIOS-given IST port with this value -- Intel's default setting is 0xb2"); | 456 | MODULE_PARM_DESC(smi_port, "Override the BIOS-given IST port with this value " |
424 | MODULE_PARM_DESC(smi_cmd, "Override the BIOS-given IST command with this value -- Intel's default setting is 0x82"); | 457 | "-- Intel's default setting is 0xb2"); |
425 | MODULE_PARM_DESC(smi_sig, "Set to 1 to fake the IST signature when using the SMI interface."); | 458 | MODULE_PARM_DESC(smi_cmd, "Override the BIOS-given IST command with this value " |
459 | "-- Intel's default setting is 0x82"); | ||
460 | MODULE_PARM_DESC(smi_sig, "Set to 1 to fake the IST signature when using the " | ||
461 | "SMI interface."); | ||
426 | 462 | ||
427 | MODULE_AUTHOR ("Hiroshi Miura"); | 463 | MODULE_AUTHOR("Hiroshi Miura"); |
428 | MODULE_DESCRIPTION ("Speedstep driver for IST applet SMI interface."); | 464 | MODULE_DESCRIPTION("Speedstep driver for IST applet SMI interface."); |
429 | MODULE_LICENSE ("GPL"); | 465 | MODULE_LICENSE("GPL"); |
430 | 466 | ||
431 | module_init(speedstep_init); | 467 | module_init(speedstep_init); |
432 | module_exit(speedstep_exit); | 468 | module_exit(speedstep_exit); |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index b09d4eb52bb9..7437fa133c02 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/string.h> | 4 | #include <linux/string.h> |
5 | #include <linux/bitops.h> | 5 | #include <linux/bitops.h> |
6 | #include <linux/smp.h> | 6 | #include <linux/smp.h> |
7 | #include <linux/sched.h> | ||
7 | #include <linux/thread_info.h> | 8 | #include <linux/thread_info.h> |
8 | #include <linux/module.h> | 9 | #include <linux/module.h> |
9 | 10 | ||
@@ -61,11 +62,16 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
61 | 62 | ||
62 | /* | 63 | /* |
63 | * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate | 64 | * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate |
64 | * with P/T states and does not stop in deep C-states | 65 | * with P/T states and does not stop in deep C-states. |
66 | * | ||
67 | * It is also reliable across cores and sockets. (but not across | ||
68 | * cabinets - we turn it off in that case explicitly.) | ||
65 | */ | 69 | */ |
66 | if (c->x86_power & (1 << 8)) { | 70 | if (c->x86_power & (1 << 8)) { |
67 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 71 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
68 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 72 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
73 | set_cpu_cap(c, X86_FEATURE_TSC_RELIABLE); | ||
74 | sched_clock_stable = 1; | ||
69 | } | 75 | } |
70 | 76 | ||
71 | /* | 77 | /* |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index a00545fe5cdd..648b3a2a3a44 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
@@ -80,6 +80,7 @@ static inline void hpet_clear_mapping(void) | |||
80 | */ | 80 | */ |
81 | static int boot_hpet_disable; | 81 | static int boot_hpet_disable; |
82 | int hpet_force_user; | 82 | int hpet_force_user; |
83 | static int hpet_verbose; | ||
83 | 84 | ||
84 | static int __init hpet_setup(char *str) | 85 | static int __init hpet_setup(char *str) |
85 | { | 86 | { |
@@ -88,6 +89,8 @@ static int __init hpet_setup(char *str) | |||
88 | boot_hpet_disable = 1; | 89 | boot_hpet_disable = 1; |
89 | if (!strncmp("force", str, 5)) | 90 | if (!strncmp("force", str, 5)) |
90 | hpet_force_user = 1; | 91 | hpet_force_user = 1; |
92 | if (!strncmp("verbose", str, 7)) | ||
93 | hpet_verbose = 1; | ||
91 | } | 94 | } |
92 | return 1; | 95 | return 1; |
93 | } | 96 | } |
@@ -119,6 +122,43 @@ int is_hpet_enabled(void) | |||
119 | } | 122 | } |
120 | EXPORT_SYMBOL_GPL(is_hpet_enabled); | 123 | EXPORT_SYMBOL_GPL(is_hpet_enabled); |
121 | 124 | ||
125 | static void _hpet_print_config(const char *function, int line) | ||
126 | { | ||
127 | u32 i, timers, l, h; | ||
128 | printk(KERN_INFO "hpet: %s(%d):\n", function, line); | ||
129 | l = hpet_readl(HPET_ID); | ||
130 | h = hpet_readl(HPET_PERIOD); | ||
131 | timers = ((l & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1; | ||
132 | printk(KERN_INFO "hpet: ID: 0x%x, PERIOD: 0x%x\n", l, h); | ||
133 | l = hpet_readl(HPET_CFG); | ||
134 | h = hpet_readl(HPET_STATUS); | ||
135 | printk(KERN_INFO "hpet: CFG: 0x%x, STATUS: 0x%x\n", l, h); | ||
136 | l = hpet_readl(HPET_COUNTER); | ||
137 | h = hpet_readl(HPET_COUNTER+4); | ||
138 | printk(KERN_INFO "hpet: COUNTER_l: 0x%x, COUNTER_h: 0x%x\n", l, h); | ||
139 | |||
140 | for (i = 0; i < timers; i++) { | ||
141 | l = hpet_readl(HPET_Tn_CFG(i)); | ||
142 | h = hpet_readl(HPET_Tn_CFG(i)+4); | ||
143 | printk(KERN_INFO "hpet: T%d: CFG_l: 0x%x, CFG_h: 0x%x\n", | ||
144 | i, l, h); | ||
145 | l = hpet_readl(HPET_Tn_CMP(i)); | ||
146 | h = hpet_readl(HPET_Tn_CMP(i)+4); | ||
147 | printk(KERN_INFO "hpet: T%d: CMP_l: 0x%x, CMP_h: 0x%x\n", | ||
148 | i, l, h); | ||
149 | l = hpet_readl(HPET_Tn_ROUTE(i)); | ||
150 | h = hpet_readl(HPET_Tn_ROUTE(i)+4); | ||
151 | printk(KERN_INFO "hpet: T%d ROUTE_l: 0x%x, ROUTE_h: 0x%x\n", | ||
152 | i, l, h); | ||
153 | } | ||
154 | } | ||
155 | |||
156 | #define hpet_print_config() \ | ||
157 | do { \ | ||
158 | if (hpet_verbose) \ | ||
159 | _hpet_print_config(__FUNCTION__, __LINE__); \ | ||
160 | } while (0) | ||
161 | |||
122 | /* | 162 | /* |
123 | * When the hpet driver (/dev/hpet) is enabled, we need to reserve | 163 | * When the hpet driver (/dev/hpet) is enabled, we need to reserve |
124 | * timer 0 and timer 1 in case of RTC emulation. | 164 | * timer 0 and timer 1 in case of RTC emulation. |
@@ -191,27 +231,37 @@ static struct clock_event_device hpet_clockevent = { | |||
191 | .rating = 50, | 231 | .rating = 50, |
192 | }; | 232 | }; |
193 | 233 | ||
194 | static void hpet_start_counter(void) | 234 | static void hpet_stop_counter(void) |
195 | { | 235 | { |
196 | unsigned long cfg = hpet_readl(HPET_CFG); | 236 | unsigned long cfg = hpet_readl(HPET_CFG); |
197 | |||
198 | cfg &= ~HPET_CFG_ENABLE; | 237 | cfg &= ~HPET_CFG_ENABLE; |
199 | hpet_writel(cfg, HPET_CFG); | 238 | hpet_writel(cfg, HPET_CFG); |
200 | hpet_writel(0, HPET_COUNTER); | 239 | hpet_writel(0, HPET_COUNTER); |
201 | hpet_writel(0, HPET_COUNTER + 4); | 240 | hpet_writel(0, HPET_COUNTER + 4); |
241 | } | ||
242 | |||
243 | static void hpet_start_counter(void) | ||
244 | { | ||
245 | unsigned long cfg = hpet_readl(HPET_CFG); | ||
202 | cfg |= HPET_CFG_ENABLE; | 246 | cfg |= HPET_CFG_ENABLE; |
203 | hpet_writel(cfg, HPET_CFG); | 247 | hpet_writel(cfg, HPET_CFG); |
204 | } | 248 | } |
205 | 249 | ||
250 | static void hpet_restart_counter(void) | ||
251 | { | ||
252 | hpet_stop_counter(); | ||
253 | hpet_start_counter(); | ||
254 | } | ||
255 | |||
206 | static void hpet_resume_device(void) | 256 | static void hpet_resume_device(void) |
207 | { | 257 | { |
208 | force_hpet_resume(); | 258 | force_hpet_resume(); |
209 | } | 259 | } |
210 | 260 | ||
211 | static void hpet_restart_counter(void) | 261 | static void hpet_resume_counter(void) |
212 | { | 262 | { |
213 | hpet_resume_device(); | 263 | hpet_resume_device(); |
214 | hpet_start_counter(); | 264 | hpet_restart_counter(); |
215 | } | 265 | } |
216 | 266 | ||
217 | static void hpet_enable_legacy_int(void) | 267 | static void hpet_enable_legacy_int(void) |
@@ -259,29 +309,23 @@ static int hpet_setup_msi_irq(unsigned int irq); | |||
259 | static void hpet_set_mode(enum clock_event_mode mode, | 309 | static void hpet_set_mode(enum clock_event_mode mode, |
260 | struct clock_event_device *evt, int timer) | 310 | struct clock_event_device *evt, int timer) |
261 | { | 311 | { |
262 | unsigned long cfg, cmp, now; | 312 | unsigned long cfg; |
263 | uint64_t delta; | 313 | uint64_t delta; |
264 | 314 | ||
265 | switch (mode) { | 315 | switch (mode) { |
266 | case CLOCK_EVT_MODE_PERIODIC: | 316 | case CLOCK_EVT_MODE_PERIODIC: |
317 | hpet_stop_counter(); | ||
267 | delta = ((uint64_t)(NSEC_PER_SEC/HZ)) * evt->mult; | 318 | delta = ((uint64_t)(NSEC_PER_SEC/HZ)) * evt->mult; |
268 | delta >>= evt->shift; | 319 | delta >>= evt->shift; |
269 | now = hpet_readl(HPET_COUNTER); | ||
270 | cmp = now + (unsigned long) delta; | ||
271 | cfg = hpet_readl(HPET_Tn_CFG(timer)); | 320 | cfg = hpet_readl(HPET_Tn_CFG(timer)); |
272 | /* Make sure we use edge triggered interrupts */ | 321 | /* Make sure we use edge triggered interrupts */ |
273 | cfg &= ~HPET_TN_LEVEL; | 322 | cfg &= ~HPET_TN_LEVEL; |
274 | cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC | | 323 | cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC | |
275 | HPET_TN_SETVAL | HPET_TN_32BIT; | 324 | HPET_TN_SETVAL | HPET_TN_32BIT; |
276 | hpet_writel(cfg, HPET_Tn_CFG(timer)); | 325 | hpet_writel(cfg, HPET_Tn_CFG(timer)); |
277 | /* | ||
278 | * The first write after writing TN_SETVAL to the | ||
279 | * config register sets the counter value, the second | ||
280 | * write sets the period. | ||
281 | */ | ||
282 | hpet_writel(cmp, HPET_Tn_CMP(timer)); | ||
283 | udelay(1); | ||
284 | hpet_writel((unsigned long) delta, HPET_Tn_CMP(timer)); | 326 | hpet_writel((unsigned long) delta, HPET_Tn_CMP(timer)); |
327 | hpet_start_counter(); | ||
328 | hpet_print_config(); | ||
285 | break; | 329 | break; |
286 | 330 | ||
287 | case CLOCK_EVT_MODE_ONESHOT: | 331 | case CLOCK_EVT_MODE_ONESHOT: |
@@ -308,6 +352,7 @@ static void hpet_set_mode(enum clock_event_mode mode, | |||
308 | irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); | 352 | irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); |
309 | enable_irq(hdev->irq); | 353 | enable_irq(hdev->irq); |
310 | } | 354 | } |
355 | hpet_print_config(); | ||
311 | break; | 356 | break; |
312 | } | 357 | } |
313 | } | 358 | } |
@@ -526,6 +571,7 @@ static void hpet_msi_capability_lookup(unsigned int start_timer) | |||
526 | 571 | ||
527 | num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT); | 572 | num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT); |
528 | num_timers++; /* Value read out starts from 0 */ | 573 | num_timers++; /* Value read out starts from 0 */ |
574 | hpet_print_config(); | ||
529 | 575 | ||
530 | hpet_devs = kzalloc(sizeof(struct hpet_dev) * num_timers, GFP_KERNEL); | 576 | hpet_devs = kzalloc(sizeof(struct hpet_dev) * num_timers, GFP_KERNEL); |
531 | if (!hpet_devs) | 577 | if (!hpet_devs) |
@@ -695,7 +741,7 @@ static struct clocksource clocksource_hpet = { | |||
695 | .mask = HPET_MASK, | 741 | .mask = HPET_MASK, |
696 | .shift = HPET_SHIFT, | 742 | .shift = HPET_SHIFT, |
697 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 743 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
698 | .resume = hpet_restart_counter, | 744 | .resume = hpet_resume_counter, |
699 | #ifdef CONFIG_X86_64 | 745 | #ifdef CONFIG_X86_64 |
700 | .vread = vread_hpet, | 746 | .vread = vread_hpet, |
701 | #endif | 747 | #endif |
@@ -707,7 +753,7 @@ static int hpet_clocksource_register(void) | |||
707 | cycle_t t1; | 753 | cycle_t t1; |
708 | 754 | ||
709 | /* Start the counter */ | 755 | /* Start the counter */ |
710 | hpet_start_counter(); | 756 | hpet_restart_counter(); |
711 | 757 | ||
712 | /* Verify whether hpet counter works */ | 758 | /* Verify whether hpet counter works */ |
713 | t1 = read_hpet(); | 759 | t1 = read_hpet(); |
@@ -793,6 +839,7 @@ int __init hpet_enable(void) | |||
793 | * information and the number of channels | 839 | * information and the number of channels |
794 | */ | 840 | */ |
795 | id = hpet_readl(HPET_ID); | 841 | id = hpet_readl(HPET_ID); |
842 | hpet_print_config(); | ||
796 | 843 | ||
797 | #ifdef CONFIG_HPET_EMULATE_RTC | 844 | #ifdef CONFIG_HPET_EMULATE_RTC |
798 | /* | 845 | /* |
@@ -845,6 +892,7 @@ static __init int hpet_late_init(void) | |||
845 | return -ENODEV; | 892 | return -ENODEV; |
846 | 893 | ||
847 | hpet_reserve_platform_timers(hpet_readl(HPET_ID)); | 894 | hpet_reserve_platform_timers(hpet_readl(HPET_ID)); |
895 | hpet_print_config(); | ||
848 | 896 | ||
849 | for_each_online_cpu(cpu) { | 897 | for_each_online_cpu(cpu) { |
850 | hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu); | 898 | hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu); |
diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c index 6a5a2970f4c5..e95022e4f5d5 100644 --- a/arch/x86/kernel/quirks.c +++ b/arch/x86/kernel/quirks.c | |||
@@ -171,7 +171,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_4, | |||
171 | ich_force_enable_hpet); | 171 | ich_force_enable_hpet); |
172 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, | 172 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, |
173 | ich_force_enable_hpet); | 173 | ich_force_enable_hpet); |
174 | 174 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x3a16, /* ICH10 */ | |
175 | ich_force_enable_hpet); | ||
175 | 176 | ||
176 | static struct pci_dev *cached_dev; | 177 | static struct pci_dev *cached_dev; |
177 | 178 | ||
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 462b9ba67e92..7a567ebe6361 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -17,20 +17,21 @@ | |||
17 | #include <asm/delay.h> | 17 | #include <asm/delay.h> |
18 | #include <asm/hypervisor.h> | 18 | #include <asm/hypervisor.h> |
19 | 19 | ||
20 | unsigned int cpu_khz; /* TSC clocks / usec, not used here */ | 20 | unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */ |
21 | EXPORT_SYMBOL(cpu_khz); | 21 | EXPORT_SYMBOL(cpu_khz); |
22 | unsigned int tsc_khz; | 22 | |
23 | unsigned int __read_mostly tsc_khz; | ||
23 | EXPORT_SYMBOL(tsc_khz); | 24 | EXPORT_SYMBOL(tsc_khz); |
24 | 25 | ||
25 | /* | 26 | /* |
26 | * TSC can be unstable due to cpufreq or due to unsynced TSCs | 27 | * TSC can be unstable due to cpufreq or due to unsynced TSCs |
27 | */ | 28 | */ |
28 | static int tsc_unstable; | 29 | static int __read_mostly tsc_unstable; |
29 | 30 | ||
30 | /* native_sched_clock() is called before tsc_init(), so | 31 | /* native_sched_clock() is called before tsc_init(), so |
31 | we must start with the TSC soft disabled to prevent | 32 | we must start with the TSC soft disabled to prevent |
32 | erroneous rdtsc usage on !cpu_has_tsc processors */ | 33 | erroneous rdtsc usage on !cpu_has_tsc processors */ |
33 | static int tsc_disabled = -1; | 34 | static int __read_mostly tsc_disabled = -1; |
34 | 35 | ||
35 | static int tsc_clocksource_reliable; | 36 | static int tsc_clocksource_reliable; |
36 | /* | 37 | /* |
@@ -543,8 +544,6 @@ unsigned long native_calibrate_tsc(void) | |||
543 | return tsc_pit_min; | 544 | return tsc_pit_min; |
544 | } | 545 | } |
545 | 546 | ||
546 | #ifdef CONFIG_X86_32 | ||
547 | /* Only called from the Powernow K7 cpu freq driver */ | ||
548 | int recalibrate_cpu_khz(void) | 547 | int recalibrate_cpu_khz(void) |
549 | { | 548 | { |
550 | #ifndef CONFIG_SMP | 549 | #ifndef CONFIG_SMP |
@@ -566,7 +565,6 @@ int recalibrate_cpu_khz(void) | |||
566 | 565 | ||
567 | EXPORT_SYMBOL(recalibrate_cpu_khz); | 566 | EXPORT_SYMBOL(recalibrate_cpu_khz); |
568 | 567 | ||
569 | #endif /* CONFIG_X86_32 */ | ||
570 | 568 | ||
571 | /* Accelerators for sched_clock() | 569 | /* Accelerators for sched_clock() |
572 | * convert from cycles(64bits) => nanoseconds (64bits) | 570 | * convert from cycles(64bits) => nanoseconds (64bits) |
diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index b81125f0bdee..0a303c3ed11f 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig | |||
@@ -4,6 +4,10 @@ | |||
4 | config HAVE_KVM | 4 | config HAVE_KVM |
5 | bool | 5 | bool |
6 | 6 | ||
7 | config HAVE_KVM_IRQCHIP | ||
8 | bool | ||
9 | default y | ||
10 | |||
7 | menuconfig VIRTUALIZATION | 11 | menuconfig VIRTUALIZATION |
8 | bool "Virtualization" | 12 | bool "Virtualization" |
9 | depends on HAVE_KVM || X86 | 13 | depends on HAVE_KVM || X86 |
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 72bd275a9b5c..c13bb92d3157 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
@@ -201,6 +201,9 @@ static int __pit_timer_fn(struct kvm_kpit_state *ps) | |||
201 | if (!atomic_inc_and_test(&pt->pending)) | 201 | if (!atomic_inc_and_test(&pt->pending)) |
202 | set_bit(KVM_REQ_PENDING_TIMER, &vcpu0->requests); | 202 | set_bit(KVM_REQ_PENDING_TIMER, &vcpu0->requests); |
203 | 203 | ||
204 | if (!pt->reinject) | ||
205 | atomic_set(&pt->pending, 1); | ||
206 | |||
204 | if (vcpu0 && waitqueue_active(&vcpu0->wq)) | 207 | if (vcpu0 && waitqueue_active(&vcpu0->wq)) |
205 | wake_up_interruptible(&vcpu0->wq); | 208 | wake_up_interruptible(&vcpu0->wq); |
206 | 209 | ||
@@ -536,6 +539,16 @@ void kvm_pit_reset(struct kvm_pit *pit) | |||
536 | pit->pit_state.irq_ack = 1; | 539 | pit->pit_state.irq_ack = 1; |
537 | } | 540 | } |
538 | 541 | ||
542 | static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask) | ||
543 | { | ||
544 | struct kvm_pit *pit = container_of(kimn, struct kvm_pit, mask_notifier); | ||
545 | |||
546 | if (!mask) { | ||
547 | atomic_set(&pit->pit_state.pit_timer.pending, 0); | ||
548 | pit->pit_state.irq_ack = 1; | ||
549 | } | ||
550 | } | ||
551 | |||
539 | struct kvm_pit *kvm_create_pit(struct kvm *kvm) | 552 | struct kvm_pit *kvm_create_pit(struct kvm *kvm) |
540 | { | 553 | { |
541 | struct kvm_pit *pit; | 554 | struct kvm_pit *pit; |
@@ -545,9 +558,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm) | |||
545 | if (!pit) | 558 | if (!pit) |
546 | return NULL; | 559 | return NULL; |
547 | 560 | ||
548 | mutex_lock(&kvm->lock); | ||
549 | pit->irq_source_id = kvm_request_irq_source_id(kvm); | 561 | pit->irq_source_id = kvm_request_irq_source_id(kvm); |
550 | mutex_unlock(&kvm->lock); | ||
551 | if (pit->irq_source_id < 0) { | 562 | if (pit->irq_source_id < 0) { |
552 | kfree(pit); | 563 | kfree(pit); |
553 | return NULL; | 564 | return NULL; |
@@ -580,10 +591,14 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm) | |||
580 | pit_state->irq_ack_notifier.gsi = 0; | 591 | pit_state->irq_ack_notifier.gsi = 0; |
581 | pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq; | 592 | pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq; |
582 | kvm_register_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier); | 593 | kvm_register_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier); |
594 | pit_state->pit_timer.reinject = true; | ||
583 | mutex_unlock(&pit->pit_state.lock); | 595 | mutex_unlock(&pit->pit_state.lock); |
584 | 596 | ||
585 | kvm_pit_reset(pit); | 597 | kvm_pit_reset(pit); |
586 | 598 | ||
599 | pit->mask_notifier.func = pit_mask_notifer; | ||
600 | kvm_register_irq_mask_notifier(kvm, 0, &pit->mask_notifier); | ||
601 | |||
587 | return pit; | 602 | return pit; |
588 | } | 603 | } |
589 | 604 | ||
@@ -592,6 +607,8 @@ void kvm_free_pit(struct kvm *kvm) | |||
592 | struct hrtimer *timer; | 607 | struct hrtimer *timer; |
593 | 608 | ||
594 | if (kvm->arch.vpit) { | 609 | if (kvm->arch.vpit) { |
610 | kvm_unregister_irq_mask_notifier(kvm, 0, | ||
611 | &kvm->arch.vpit->mask_notifier); | ||
595 | mutex_lock(&kvm->arch.vpit->pit_state.lock); | 612 | mutex_lock(&kvm->arch.vpit->pit_state.lock); |
596 | timer = &kvm->arch.vpit->pit_state.pit_timer.timer; | 613 | timer = &kvm->arch.vpit->pit_state.pit_timer.timer; |
597 | hrtimer_cancel(timer); | 614 | hrtimer_cancel(timer); |
diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index 4178022b97aa..6acbe4b505d5 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h | |||
@@ -9,6 +9,7 @@ struct kvm_kpit_timer { | |||
9 | s64 period; /* unit: ns */ | 9 | s64 period; /* unit: ns */ |
10 | s64 scheduled; | 10 | s64 scheduled; |
11 | atomic_t pending; | 11 | atomic_t pending; |
12 | bool reinject; | ||
12 | }; | 13 | }; |
13 | 14 | ||
14 | struct kvm_kpit_channel_state { | 15 | struct kvm_kpit_channel_state { |
@@ -45,6 +46,7 @@ struct kvm_pit { | |||
45 | struct kvm *kvm; | 46 | struct kvm *kvm; |
46 | struct kvm_kpit_state pit_state; | 47 | struct kvm_kpit_state pit_state; |
47 | int irq_source_id; | 48 | int irq_source_id; |
49 | struct kvm_irq_mask_notifier mask_notifier; | ||
48 | }; | 50 | }; |
49 | 51 | ||
50 | #define KVM_PIT_BASE_ADDRESS 0x40 | 52 | #define KVM_PIT_BASE_ADDRESS 0x40 |
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 179dcb0103fd..1ccb50c74f18 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -32,11 +32,13 @@ | |||
32 | #include <linux/kvm_host.h> | 32 | #include <linux/kvm_host.h> |
33 | 33 | ||
34 | static void pic_lock(struct kvm_pic *s) | 34 | static void pic_lock(struct kvm_pic *s) |
35 | __acquires(&s->lock) | ||
35 | { | 36 | { |
36 | spin_lock(&s->lock); | 37 | spin_lock(&s->lock); |
37 | } | 38 | } |
38 | 39 | ||
39 | static void pic_unlock(struct kvm_pic *s) | 40 | static void pic_unlock(struct kvm_pic *s) |
41 | __releases(&s->lock) | ||
40 | { | 42 | { |
41 | struct kvm *kvm = s->kvm; | 43 | struct kvm *kvm = s->kvm; |
42 | unsigned acks = s->pending_acks; | 44 | unsigned acks = s->pending_acks; |
@@ -49,7 +51,8 @@ static void pic_unlock(struct kvm_pic *s) | |||
49 | spin_unlock(&s->lock); | 51 | spin_unlock(&s->lock); |
50 | 52 | ||
51 | while (acks) { | 53 | while (acks) { |
52 | kvm_notify_acked_irq(kvm, __ffs(acks)); | 54 | kvm_notify_acked_irq(kvm, SELECT_PIC(__ffs(acks)), |
55 | __ffs(acks)); | ||
53 | acks &= acks - 1; | 56 | acks &= acks - 1; |
54 | } | 57 | } |
55 | 58 | ||
@@ -76,12 +79,13 @@ void kvm_pic_clear_isr_ack(struct kvm *kvm) | |||
76 | /* | 79 | /* |
77 | * set irq level. If an edge is detected, then the IRR is set to 1 | 80 | * set irq level. If an edge is detected, then the IRR is set to 1 |
78 | */ | 81 | */ |
79 | static inline void pic_set_irq1(struct kvm_kpic_state *s, int irq, int level) | 82 | static inline int pic_set_irq1(struct kvm_kpic_state *s, int irq, int level) |
80 | { | 83 | { |
81 | int mask; | 84 | int mask, ret = 1; |
82 | mask = 1 << irq; | 85 | mask = 1 << irq; |
83 | if (s->elcr & mask) /* level triggered */ | 86 | if (s->elcr & mask) /* level triggered */ |
84 | if (level) { | 87 | if (level) { |
88 | ret = !(s->irr & mask); | ||
85 | s->irr |= mask; | 89 | s->irr |= mask; |
86 | s->last_irr |= mask; | 90 | s->last_irr |= mask; |
87 | } else { | 91 | } else { |
@@ -90,11 +94,15 @@ static inline void pic_set_irq1(struct kvm_kpic_state *s, int irq, int level) | |||
90 | } | 94 | } |
91 | else /* edge triggered */ | 95 | else /* edge triggered */ |
92 | if (level) { | 96 | if (level) { |
93 | if ((s->last_irr & mask) == 0) | 97 | if ((s->last_irr & mask) == 0) { |
98 | ret = !(s->irr & mask); | ||
94 | s->irr |= mask; | 99 | s->irr |= mask; |
100 | } | ||
95 | s->last_irr |= mask; | 101 | s->last_irr |= mask; |
96 | } else | 102 | } else |
97 | s->last_irr &= ~mask; | 103 | s->last_irr &= ~mask; |
104 | |||
105 | return (s->imr & mask) ? -1 : ret; | ||
98 | } | 106 | } |
99 | 107 | ||
100 | /* | 108 | /* |
@@ -171,16 +179,19 @@ void kvm_pic_update_irq(struct kvm_pic *s) | |||
171 | pic_unlock(s); | 179 | pic_unlock(s); |
172 | } | 180 | } |
173 | 181 | ||
174 | void kvm_pic_set_irq(void *opaque, int irq, int level) | 182 | int kvm_pic_set_irq(void *opaque, int irq, int level) |
175 | { | 183 | { |
176 | struct kvm_pic *s = opaque; | 184 | struct kvm_pic *s = opaque; |
185 | int ret = -1; | ||
177 | 186 | ||
178 | pic_lock(s); | 187 | pic_lock(s); |
179 | if (irq >= 0 && irq < PIC_NUM_PINS) { | 188 | if (irq >= 0 && irq < PIC_NUM_PINS) { |
180 | pic_set_irq1(&s->pics[irq >> 3], irq & 7, level); | 189 | ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, level); |
181 | pic_update_irq(s); | 190 | pic_update_irq(s); |
182 | } | 191 | } |
183 | pic_unlock(s); | 192 | pic_unlock(s); |
193 | |||
194 | return ret; | ||
184 | } | 195 | } |
185 | 196 | ||
186 | /* | 197 | /* |
@@ -232,7 +243,7 @@ int kvm_pic_read_irq(struct kvm *kvm) | |||
232 | } | 243 | } |
233 | pic_update_irq(s); | 244 | pic_update_irq(s); |
234 | pic_unlock(s); | 245 | pic_unlock(s); |
235 | kvm_notify_acked_irq(kvm, irq); | 246 | kvm_notify_acked_irq(kvm, SELECT_PIC(irq), irq); |
236 | 247 | ||
237 | return intno; | 248 | return intno; |
238 | } | 249 | } |
diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h index 82579ee538d0..9f593188129e 100644 --- a/arch/x86/kvm/irq.h +++ b/arch/x86/kvm/irq.h | |||
@@ -32,6 +32,8 @@ | |||
32 | #include "lapic.h" | 32 | #include "lapic.h" |
33 | 33 | ||
34 | #define PIC_NUM_PINS 16 | 34 | #define PIC_NUM_PINS 16 |
35 | #define SELECT_PIC(irq) \ | ||
36 | ((irq) < 8 ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE) | ||
35 | 37 | ||
36 | struct kvm; | 38 | struct kvm; |
37 | struct kvm_vcpu; | 39 | struct kvm_vcpu; |
diff --git a/arch/x86/kvm/kvm_svm.h b/arch/x86/kvm/kvm_svm.h index 8e5ee99551f6..ed66e4c078dc 100644 --- a/arch/x86/kvm/kvm_svm.h +++ b/arch/x86/kvm/kvm_svm.h | |||
@@ -18,7 +18,6 @@ static const u32 host_save_user_msrs[] = { | |||
18 | }; | 18 | }; |
19 | 19 | ||
20 | #define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs) | 20 | #define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs) |
21 | #define NUM_DB_REGS 4 | ||
22 | 21 | ||
23 | struct kvm_vcpu; | 22 | struct kvm_vcpu; |
24 | 23 | ||
@@ -29,18 +28,23 @@ struct vcpu_svm { | |||
29 | struct svm_cpu_data *svm_data; | 28 | struct svm_cpu_data *svm_data; |
30 | uint64_t asid_generation; | 29 | uint64_t asid_generation; |
31 | 30 | ||
32 | unsigned long db_regs[NUM_DB_REGS]; | ||
33 | |||
34 | u64 next_rip; | 31 | u64 next_rip; |
35 | 32 | ||
36 | u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS]; | 33 | u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS]; |
37 | u64 host_gs_base; | 34 | u64 host_gs_base; |
38 | unsigned long host_cr2; | 35 | unsigned long host_cr2; |
39 | unsigned long host_db_regs[NUM_DB_REGS]; | ||
40 | unsigned long host_dr6; | ||
41 | unsigned long host_dr7; | ||
42 | 36 | ||
43 | u32 *msrpm; | 37 | u32 *msrpm; |
38 | struct vmcb *hsave; | ||
39 | u64 hsave_msr; | ||
40 | |||
41 | u64 nested_vmcb; | ||
42 | |||
43 | /* These are the merged vectors */ | ||
44 | u32 *nested_msrpm; | ||
45 | |||
46 | /* gpa pointers to the real vectors */ | ||
47 | u64 nested_vmcb_msrpm; | ||
44 | }; | 48 | }; |
45 | 49 | ||
46 | #endif | 50 | #endif |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 2d4477c71473..2a36f7f7c4c7 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -145,11 +145,20 @@ struct kvm_rmap_desc { | |||
145 | struct kvm_rmap_desc *more; | 145 | struct kvm_rmap_desc *more; |
146 | }; | 146 | }; |
147 | 147 | ||
148 | struct kvm_shadow_walk { | 148 | struct kvm_shadow_walk_iterator { |
149 | int (*entry)(struct kvm_shadow_walk *walk, struct kvm_vcpu *vcpu, | 149 | u64 addr; |
150 | u64 addr, u64 *spte, int level); | 150 | hpa_t shadow_addr; |
151 | int level; | ||
152 | u64 *sptep; | ||
153 | unsigned index; | ||
151 | }; | 154 | }; |
152 | 155 | ||
156 | #define for_each_shadow_entry(_vcpu, _addr, _walker) \ | ||
157 | for (shadow_walk_init(&(_walker), _vcpu, _addr); \ | ||
158 | shadow_walk_okay(&(_walker)); \ | ||
159 | shadow_walk_next(&(_walker))) | ||
160 | |||
161 | |||
153 | struct kvm_unsync_walk { | 162 | struct kvm_unsync_walk { |
154 | int (*entry) (struct kvm_mmu_page *sp, struct kvm_unsync_walk *walk); | 163 | int (*entry) (struct kvm_mmu_page *sp, struct kvm_unsync_walk *walk); |
155 | }; | 164 | }; |
@@ -343,7 +352,6 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc, | |||
343 | 352 | ||
344 | BUG_ON(!mc->nobjs); | 353 | BUG_ON(!mc->nobjs); |
345 | p = mc->objects[--mc->nobjs]; | 354 | p = mc->objects[--mc->nobjs]; |
346 | memset(p, 0, size); | ||
347 | return p; | 355 | return p; |
348 | } | 356 | } |
349 | 357 | ||
@@ -794,10 +802,8 @@ static struct kvm_mmu_page *kvm_mmu_alloc_page(struct kvm_vcpu *vcpu, | |||
794 | set_page_private(virt_to_page(sp->spt), (unsigned long)sp); | 802 | set_page_private(virt_to_page(sp->spt), (unsigned long)sp); |
795 | list_add(&sp->link, &vcpu->kvm->arch.active_mmu_pages); | 803 | list_add(&sp->link, &vcpu->kvm->arch.active_mmu_pages); |
796 | INIT_LIST_HEAD(&sp->oos_link); | 804 | INIT_LIST_HEAD(&sp->oos_link); |
797 | ASSERT(is_empty_shadow_page(sp->spt)); | ||
798 | bitmap_zero(sp->slot_bitmap, KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS); | 805 | bitmap_zero(sp->slot_bitmap, KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS); |
799 | sp->multimapped = 0; | 806 | sp->multimapped = 0; |
800 | sp->global = 1; | ||
801 | sp->parent_pte = parent_pte; | 807 | sp->parent_pte = parent_pte; |
802 | --vcpu->kvm->arch.n_free_mmu_pages; | 808 | --vcpu->kvm->arch.n_free_mmu_pages; |
803 | return sp; | 809 | return sp; |
@@ -983,8 +989,8 @@ struct kvm_mmu_pages { | |||
983 | idx < 512; \ | 989 | idx < 512; \ |
984 | idx = find_next_bit(bitmap, 512, idx+1)) | 990 | idx = find_next_bit(bitmap, 512, idx+1)) |
985 | 991 | ||
986 | int mmu_pages_add(struct kvm_mmu_pages *pvec, struct kvm_mmu_page *sp, | 992 | static int mmu_pages_add(struct kvm_mmu_pages *pvec, struct kvm_mmu_page *sp, |
987 | int idx) | 993 | int idx) |
988 | { | 994 | { |
989 | int i; | 995 | int i; |
990 | 996 | ||
@@ -1059,7 +1065,7 @@ static struct kvm_mmu_page *kvm_mmu_lookup_page(struct kvm *kvm, gfn_t gfn) | |||
1059 | index = kvm_page_table_hashfn(gfn); | 1065 | index = kvm_page_table_hashfn(gfn); |
1060 | bucket = &kvm->arch.mmu_page_hash[index]; | 1066 | bucket = &kvm->arch.mmu_page_hash[index]; |
1061 | hlist_for_each_entry(sp, node, bucket, hash_link) | 1067 | hlist_for_each_entry(sp, node, bucket, hash_link) |
1062 | if (sp->gfn == gfn && !sp->role.metaphysical | 1068 | if (sp->gfn == gfn && !sp->role.direct |
1063 | && !sp->role.invalid) { | 1069 | && !sp->role.invalid) { |
1064 | pgprintk("%s: found role %x\n", | 1070 | pgprintk("%s: found role %x\n", |
1065 | __func__, sp->role.word); | 1071 | __func__, sp->role.word); |
@@ -1115,8 +1121,9 @@ struct mmu_page_path { | |||
1115 | i < pvec.nr && ({ sp = pvec.page[i].sp; 1;}); \ | 1121 | i < pvec.nr && ({ sp = pvec.page[i].sp; 1;}); \ |
1116 | i = mmu_pages_next(&pvec, &parents, i)) | 1122 | i = mmu_pages_next(&pvec, &parents, i)) |
1117 | 1123 | ||
1118 | int mmu_pages_next(struct kvm_mmu_pages *pvec, struct mmu_page_path *parents, | 1124 | static int mmu_pages_next(struct kvm_mmu_pages *pvec, |
1119 | int i) | 1125 | struct mmu_page_path *parents, |
1126 | int i) | ||
1120 | { | 1127 | { |
1121 | int n; | 1128 | int n; |
1122 | 1129 | ||
@@ -1135,7 +1142,7 @@ int mmu_pages_next(struct kvm_mmu_pages *pvec, struct mmu_page_path *parents, | |||
1135 | return n; | 1142 | return n; |
1136 | } | 1143 | } |
1137 | 1144 | ||
1138 | void mmu_pages_clear_parents(struct mmu_page_path *parents) | 1145 | static void mmu_pages_clear_parents(struct mmu_page_path *parents) |
1139 | { | 1146 | { |
1140 | struct kvm_mmu_page *sp; | 1147 | struct kvm_mmu_page *sp; |
1141 | unsigned int level = 0; | 1148 | unsigned int level = 0; |
@@ -1193,7 +1200,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, | |||
1193 | gfn_t gfn, | 1200 | gfn_t gfn, |
1194 | gva_t gaddr, | 1201 | gva_t gaddr, |
1195 | unsigned level, | 1202 | unsigned level, |
1196 | int metaphysical, | 1203 | int direct, |
1197 | unsigned access, | 1204 | unsigned access, |
1198 | u64 *parent_pte) | 1205 | u64 *parent_pte) |
1199 | { | 1206 | { |
@@ -1204,10 +1211,9 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, | |||
1204 | struct kvm_mmu_page *sp; | 1211 | struct kvm_mmu_page *sp; |
1205 | struct hlist_node *node, *tmp; | 1212 | struct hlist_node *node, *tmp; |
1206 | 1213 | ||
1207 | role.word = 0; | 1214 | role = vcpu->arch.mmu.base_role; |
1208 | role.glevels = vcpu->arch.mmu.root_level; | ||
1209 | role.level = level; | 1215 | role.level = level; |
1210 | role.metaphysical = metaphysical; | 1216 | role.direct = direct; |
1211 | role.access = access; | 1217 | role.access = access; |
1212 | if (vcpu->arch.mmu.root_level <= PT32_ROOT_LEVEL) { | 1218 | if (vcpu->arch.mmu.root_level <= PT32_ROOT_LEVEL) { |
1213 | quadrant = gaddr >> (PAGE_SHIFT + (PT64_PT_BITS * level)); | 1219 | quadrant = gaddr >> (PAGE_SHIFT + (PT64_PT_BITS * level)); |
@@ -1242,8 +1248,9 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, | |||
1242 | pgprintk("%s: adding gfn %lx role %x\n", __func__, gfn, role.word); | 1248 | pgprintk("%s: adding gfn %lx role %x\n", __func__, gfn, role.word); |
1243 | sp->gfn = gfn; | 1249 | sp->gfn = gfn; |
1244 | sp->role = role; | 1250 | sp->role = role; |
1251 | sp->global = role.cr4_pge; | ||
1245 | hlist_add_head(&sp->hash_link, bucket); | 1252 | hlist_add_head(&sp->hash_link, bucket); |
1246 | if (!metaphysical) { | 1253 | if (!direct) { |
1247 | if (rmap_write_protect(vcpu->kvm, gfn)) | 1254 | if (rmap_write_protect(vcpu->kvm, gfn)) |
1248 | kvm_flush_remote_tlbs(vcpu->kvm); | 1255 | kvm_flush_remote_tlbs(vcpu->kvm); |
1249 | account_shadowed(vcpu->kvm, gfn); | 1256 | account_shadowed(vcpu->kvm, gfn); |
@@ -1255,35 +1262,35 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, | |||
1255 | return sp; | 1262 | return sp; |
1256 | } | 1263 | } |
1257 | 1264 | ||
1258 | static int walk_shadow(struct kvm_shadow_walk *walker, | 1265 | static void shadow_walk_init(struct kvm_shadow_walk_iterator *iterator, |
1259 | struct kvm_vcpu *vcpu, u64 addr) | 1266 | struct kvm_vcpu *vcpu, u64 addr) |
1260 | { | 1267 | { |
1261 | hpa_t shadow_addr; | 1268 | iterator->addr = addr; |
1262 | int level; | 1269 | iterator->shadow_addr = vcpu->arch.mmu.root_hpa; |
1263 | int r; | 1270 | iterator->level = vcpu->arch.mmu.shadow_root_level; |
1264 | u64 *sptep; | 1271 | if (iterator->level == PT32E_ROOT_LEVEL) { |
1265 | unsigned index; | 1272 | iterator->shadow_addr |
1266 | 1273 | = vcpu->arch.mmu.pae_root[(addr >> 30) & 3]; | |
1267 | shadow_addr = vcpu->arch.mmu.root_hpa; | 1274 | iterator->shadow_addr &= PT64_BASE_ADDR_MASK; |
1268 | level = vcpu->arch.mmu.shadow_root_level; | 1275 | --iterator->level; |
1269 | if (level == PT32E_ROOT_LEVEL) { | 1276 | if (!iterator->shadow_addr) |
1270 | shadow_addr = vcpu->arch.mmu.pae_root[(addr >> 30) & 3]; | 1277 | iterator->level = 0; |
1271 | shadow_addr &= PT64_BASE_ADDR_MASK; | ||
1272 | if (!shadow_addr) | ||
1273 | return 1; | ||
1274 | --level; | ||
1275 | } | 1278 | } |
1279 | } | ||
1276 | 1280 | ||
1277 | while (level >= PT_PAGE_TABLE_LEVEL) { | 1281 | static bool shadow_walk_okay(struct kvm_shadow_walk_iterator *iterator) |
1278 | index = SHADOW_PT_INDEX(addr, level); | 1282 | { |
1279 | sptep = ((u64 *)__va(shadow_addr)) + index; | 1283 | if (iterator->level < PT_PAGE_TABLE_LEVEL) |
1280 | r = walker->entry(walker, vcpu, addr, sptep, level); | 1284 | return false; |
1281 | if (r) | 1285 | iterator->index = SHADOW_PT_INDEX(iterator->addr, iterator->level); |
1282 | return r; | 1286 | iterator->sptep = ((u64 *)__va(iterator->shadow_addr)) + iterator->index; |
1283 | shadow_addr = *sptep & PT64_BASE_ADDR_MASK; | 1287 | return true; |
1284 | --level; | 1288 | } |
1285 | } | 1289 | |
1286 | return 0; | 1290 | static void shadow_walk_next(struct kvm_shadow_walk_iterator *iterator) |
1291 | { | ||
1292 | iterator->shadow_addr = *iterator->sptep & PT64_BASE_ADDR_MASK; | ||
1293 | --iterator->level; | ||
1287 | } | 1294 | } |
1288 | 1295 | ||
1289 | static void kvm_mmu_page_unlink_children(struct kvm *kvm, | 1296 | static void kvm_mmu_page_unlink_children(struct kvm *kvm, |
@@ -1388,7 +1395,7 @@ static int kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp) | |||
1388 | kvm_mmu_page_unlink_children(kvm, sp); | 1395 | kvm_mmu_page_unlink_children(kvm, sp); |
1389 | kvm_mmu_unlink_parents(kvm, sp); | 1396 | kvm_mmu_unlink_parents(kvm, sp); |
1390 | kvm_flush_remote_tlbs(kvm); | 1397 | kvm_flush_remote_tlbs(kvm); |
1391 | if (!sp->role.invalid && !sp->role.metaphysical) | 1398 | if (!sp->role.invalid && !sp->role.direct) |
1392 | unaccount_shadowed(kvm, sp->gfn); | 1399 | unaccount_shadowed(kvm, sp->gfn); |
1393 | if (sp->unsync) | 1400 | if (sp->unsync) |
1394 | kvm_unlink_unsync_page(kvm, sp); | 1401 | kvm_unlink_unsync_page(kvm, sp); |
@@ -1451,7 +1458,7 @@ static int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn) | |||
1451 | index = kvm_page_table_hashfn(gfn); | 1458 | index = kvm_page_table_hashfn(gfn); |
1452 | bucket = &kvm->arch.mmu_page_hash[index]; | 1459 | bucket = &kvm->arch.mmu_page_hash[index]; |
1453 | hlist_for_each_entry_safe(sp, node, n, bucket, hash_link) | 1460 | hlist_for_each_entry_safe(sp, node, n, bucket, hash_link) |
1454 | if (sp->gfn == gfn && !sp->role.metaphysical) { | 1461 | if (sp->gfn == gfn && !sp->role.direct) { |
1455 | pgprintk("%s: gfn %lx role %x\n", __func__, gfn, | 1462 | pgprintk("%s: gfn %lx role %x\n", __func__, gfn, |
1456 | sp->role.word); | 1463 | sp->role.word); |
1457 | r = 1; | 1464 | r = 1; |
@@ -1463,11 +1470,20 @@ static int kvm_mmu_unprotect_page(struct kvm *kvm, gfn_t gfn) | |||
1463 | 1470 | ||
1464 | static void mmu_unshadow(struct kvm *kvm, gfn_t gfn) | 1471 | static void mmu_unshadow(struct kvm *kvm, gfn_t gfn) |
1465 | { | 1472 | { |
1473 | unsigned index; | ||
1474 | struct hlist_head *bucket; | ||
1466 | struct kvm_mmu_page *sp; | 1475 | struct kvm_mmu_page *sp; |
1476 | struct hlist_node *node, *nn; | ||
1467 | 1477 | ||
1468 | while ((sp = kvm_mmu_lookup_page(kvm, gfn)) != NULL) { | 1478 | index = kvm_page_table_hashfn(gfn); |
1469 | pgprintk("%s: zap %lx %x\n", __func__, gfn, sp->role.word); | 1479 | bucket = &kvm->arch.mmu_page_hash[index]; |
1470 | kvm_mmu_zap_page(kvm, sp); | 1480 | hlist_for_each_entry_safe(sp, node, nn, bucket, hash_link) { |
1481 | if (sp->gfn == gfn && !sp->role.direct | ||
1482 | && !sp->role.invalid) { | ||
1483 | pgprintk("%s: zap %lx %x\n", | ||
1484 | __func__, gfn, sp->role.word); | ||
1485 | kvm_mmu_zap_page(kvm, sp); | ||
1486 | } | ||
1471 | } | 1487 | } |
1472 | } | 1488 | } |
1473 | 1489 | ||
@@ -1622,7 +1638,7 @@ static int kvm_unsync_page(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) | |||
1622 | bucket = &vcpu->kvm->arch.mmu_page_hash[index]; | 1638 | bucket = &vcpu->kvm->arch.mmu_page_hash[index]; |
1623 | /* don't unsync if pagetable is shadowed with multiple roles */ | 1639 | /* don't unsync if pagetable is shadowed with multiple roles */ |
1624 | hlist_for_each_entry_safe(s, node, n, bucket, hash_link) { | 1640 | hlist_for_each_entry_safe(s, node, n, bucket, hash_link) { |
1625 | if (s->gfn != sp->gfn || s->role.metaphysical) | 1641 | if (s->gfn != sp->gfn || s->role.direct) |
1626 | continue; | 1642 | continue; |
1627 | if (s->role.word != sp->role.word) | 1643 | if (s->role.word != sp->role.word) |
1628 | return 1; | 1644 | return 1; |
@@ -1669,8 +1685,6 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | |||
1669 | u64 mt_mask = shadow_mt_mask; | 1685 | u64 mt_mask = shadow_mt_mask; |
1670 | struct kvm_mmu_page *sp = page_header(__pa(shadow_pte)); | 1686 | struct kvm_mmu_page *sp = page_header(__pa(shadow_pte)); |
1671 | 1687 | ||
1672 | if (!(vcpu->arch.cr4 & X86_CR4_PGE)) | ||
1673 | global = 0; | ||
1674 | if (!global && sp->global) { | 1688 | if (!global && sp->global) { |
1675 | sp->global = 0; | 1689 | sp->global = 0; |
1676 | if (sp->unsync) { | 1690 | if (sp->unsync) { |
@@ -1777,12 +1791,8 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | |||
1777 | pgprintk("hfn old %lx new %lx\n", | 1791 | pgprintk("hfn old %lx new %lx\n", |
1778 | spte_to_pfn(*shadow_pte), pfn); | 1792 | spte_to_pfn(*shadow_pte), pfn); |
1779 | rmap_remove(vcpu->kvm, shadow_pte); | 1793 | rmap_remove(vcpu->kvm, shadow_pte); |
1780 | } else { | 1794 | } else |
1781 | if (largepage) | 1795 | was_rmapped = 1; |
1782 | was_rmapped = is_large_pte(*shadow_pte); | ||
1783 | else | ||
1784 | was_rmapped = 1; | ||
1785 | } | ||
1786 | } | 1796 | } |
1787 | if (set_spte(vcpu, shadow_pte, pte_access, user_fault, write_fault, | 1797 | if (set_spte(vcpu, shadow_pte, pte_access, user_fault, write_fault, |
1788 | dirty, largepage, global, gfn, pfn, speculative, true)) { | 1798 | dirty, largepage, global, gfn, pfn, speculative, true)) { |
@@ -1820,67 +1830,42 @@ static void nonpaging_new_cr3(struct kvm_vcpu *vcpu) | |||
1820 | { | 1830 | { |
1821 | } | 1831 | } |
1822 | 1832 | ||
1823 | struct direct_shadow_walk { | 1833 | static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, |
1824 | struct kvm_shadow_walk walker; | 1834 | int largepage, gfn_t gfn, pfn_t pfn) |
1825 | pfn_t pfn; | ||
1826 | int write; | ||
1827 | int largepage; | ||
1828 | int pt_write; | ||
1829 | }; | ||
1830 | |||
1831 | static int direct_map_entry(struct kvm_shadow_walk *_walk, | ||
1832 | struct kvm_vcpu *vcpu, | ||
1833 | u64 addr, u64 *sptep, int level) | ||
1834 | { | 1835 | { |
1835 | struct direct_shadow_walk *walk = | 1836 | struct kvm_shadow_walk_iterator iterator; |
1836 | container_of(_walk, struct direct_shadow_walk, walker); | ||
1837 | struct kvm_mmu_page *sp; | 1837 | struct kvm_mmu_page *sp; |
1838 | int pt_write = 0; | ||
1838 | gfn_t pseudo_gfn; | 1839 | gfn_t pseudo_gfn; |
1839 | gfn_t gfn = addr >> PAGE_SHIFT; | ||
1840 | |||
1841 | if (level == PT_PAGE_TABLE_LEVEL | ||
1842 | || (walk->largepage && level == PT_DIRECTORY_LEVEL)) { | ||
1843 | mmu_set_spte(vcpu, sptep, ACC_ALL, ACC_ALL, | ||
1844 | 0, walk->write, 1, &walk->pt_write, | ||
1845 | walk->largepage, 0, gfn, walk->pfn, false); | ||
1846 | ++vcpu->stat.pf_fixed; | ||
1847 | return 1; | ||
1848 | } | ||
1849 | 1840 | ||
1850 | if (*sptep == shadow_trap_nonpresent_pte) { | 1841 | for_each_shadow_entry(vcpu, (u64)gfn << PAGE_SHIFT, iterator) { |
1851 | pseudo_gfn = (addr & PT64_DIR_BASE_ADDR_MASK) >> PAGE_SHIFT; | 1842 | if (iterator.level == PT_PAGE_TABLE_LEVEL |
1852 | sp = kvm_mmu_get_page(vcpu, pseudo_gfn, (gva_t)addr, level - 1, | 1843 | || (largepage && iterator.level == PT_DIRECTORY_LEVEL)) { |
1853 | 1, ACC_ALL, sptep); | 1844 | mmu_set_spte(vcpu, iterator.sptep, ACC_ALL, ACC_ALL, |
1854 | if (!sp) { | 1845 | 0, write, 1, &pt_write, |
1855 | pgprintk("nonpaging_map: ENOMEM\n"); | 1846 | largepage, 0, gfn, pfn, false); |
1856 | kvm_release_pfn_clean(walk->pfn); | 1847 | ++vcpu->stat.pf_fixed; |
1857 | return -ENOMEM; | 1848 | break; |
1858 | } | 1849 | } |
1859 | 1850 | ||
1860 | set_shadow_pte(sptep, | 1851 | if (*iterator.sptep == shadow_trap_nonpresent_pte) { |
1861 | __pa(sp->spt) | 1852 | pseudo_gfn = (iterator.addr & PT64_DIR_BASE_ADDR_MASK) >> PAGE_SHIFT; |
1862 | | PT_PRESENT_MASK | PT_WRITABLE_MASK | 1853 | sp = kvm_mmu_get_page(vcpu, pseudo_gfn, iterator.addr, |
1863 | | shadow_user_mask | shadow_x_mask); | 1854 | iterator.level - 1, |
1864 | } | 1855 | 1, ACC_ALL, iterator.sptep); |
1865 | return 0; | 1856 | if (!sp) { |
1866 | } | 1857 | pgprintk("nonpaging_map: ENOMEM\n"); |
1858 | kvm_release_pfn_clean(pfn); | ||
1859 | return -ENOMEM; | ||
1860 | } | ||
1867 | 1861 | ||
1868 | static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write, | 1862 | set_shadow_pte(iterator.sptep, |
1869 | int largepage, gfn_t gfn, pfn_t pfn) | 1863 | __pa(sp->spt) |
1870 | { | 1864 | | PT_PRESENT_MASK | PT_WRITABLE_MASK |
1871 | int r; | 1865 | | shadow_user_mask | shadow_x_mask); |
1872 | struct direct_shadow_walk walker = { | 1866 | } |
1873 | .walker = { .entry = direct_map_entry, }, | 1867 | } |
1874 | .pfn = pfn, | 1868 | return pt_write; |
1875 | .largepage = largepage, | ||
1876 | .write = write, | ||
1877 | .pt_write = 0, | ||
1878 | }; | ||
1879 | |||
1880 | r = walk_shadow(&walker.walker, vcpu, gfn << PAGE_SHIFT); | ||
1881 | if (r < 0) | ||
1882 | return r; | ||
1883 | return walker.pt_write; | ||
1884 | } | 1869 | } |
1885 | 1870 | ||
1886 | static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn) | 1871 | static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn) |
@@ -1962,7 +1947,7 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
1962 | int i; | 1947 | int i; |
1963 | gfn_t root_gfn; | 1948 | gfn_t root_gfn; |
1964 | struct kvm_mmu_page *sp; | 1949 | struct kvm_mmu_page *sp; |
1965 | int metaphysical = 0; | 1950 | int direct = 0; |
1966 | 1951 | ||
1967 | root_gfn = vcpu->arch.cr3 >> PAGE_SHIFT; | 1952 | root_gfn = vcpu->arch.cr3 >> PAGE_SHIFT; |
1968 | 1953 | ||
@@ -1971,18 +1956,18 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
1971 | 1956 | ||
1972 | ASSERT(!VALID_PAGE(root)); | 1957 | ASSERT(!VALID_PAGE(root)); |
1973 | if (tdp_enabled) | 1958 | if (tdp_enabled) |
1974 | metaphysical = 1; | 1959 | direct = 1; |
1975 | sp = kvm_mmu_get_page(vcpu, root_gfn, 0, | 1960 | sp = kvm_mmu_get_page(vcpu, root_gfn, 0, |
1976 | PT64_ROOT_LEVEL, metaphysical, | 1961 | PT64_ROOT_LEVEL, direct, |
1977 | ACC_ALL, NULL); | 1962 | ACC_ALL, NULL); |
1978 | root = __pa(sp->spt); | 1963 | root = __pa(sp->spt); |
1979 | ++sp->root_count; | 1964 | ++sp->root_count; |
1980 | vcpu->arch.mmu.root_hpa = root; | 1965 | vcpu->arch.mmu.root_hpa = root; |
1981 | return; | 1966 | return; |
1982 | } | 1967 | } |
1983 | metaphysical = !is_paging(vcpu); | 1968 | direct = !is_paging(vcpu); |
1984 | if (tdp_enabled) | 1969 | if (tdp_enabled) |
1985 | metaphysical = 1; | 1970 | direct = 1; |
1986 | for (i = 0; i < 4; ++i) { | 1971 | for (i = 0; i < 4; ++i) { |
1987 | hpa_t root = vcpu->arch.mmu.pae_root[i]; | 1972 | hpa_t root = vcpu->arch.mmu.pae_root[i]; |
1988 | 1973 | ||
@@ -1996,7 +1981,7 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
1996 | } else if (vcpu->arch.mmu.root_level == 0) | 1981 | } else if (vcpu->arch.mmu.root_level == 0) |
1997 | root_gfn = 0; | 1982 | root_gfn = 0; |
1998 | sp = kvm_mmu_get_page(vcpu, root_gfn, i << 30, | 1983 | sp = kvm_mmu_get_page(vcpu, root_gfn, i << 30, |
1999 | PT32_ROOT_LEVEL, metaphysical, | 1984 | PT32_ROOT_LEVEL, direct, |
2000 | ACC_ALL, NULL); | 1985 | ACC_ALL, NULL); |
2001 | root = __pa(sp->spt); | 1986 | root = __pa(sp->spt); |
2002 | ++sp->root_count; | 1987 | ++sp->root_count; |
@@ -2251,17 +2236,23 @@ static int init_kvm_tdp_mmu(struct kvm_vcpu *vcpu) | |||
2251 | 2236 | ||
2252 | static int init_kvm_softmmu(struct kvm_vcpu *vcpu) | 2237 | static int init_kvm_softmmu(struct kvm_vcpu *vcpu) |
2253 | { | 2238 | { |
2239 | int r; | ||
2240 | |||
2254 | ASSERT(vcpu); | 2241 | ASSERT(vcpu); |
2255 | ASSERT(!VALID_PAGE(vcpu->arch.mmu.root_hpa)); | 2242 | ASSERT(!VALID_PAGE(vcpu->arch.mmu.root_hpa)); |
2256 | 2243 | ||
2257 | if (!is_paging(vcpu)) | 2244 | if (!is_paging(vcpu)) |
2258 | return nonpaging_init_context(vcpu); | 2245 | r = nonpaging_init_context(vcpu); |
2259 | else if (is_long_mode(vcpu)) | 2246 | else if (is_long_mode(vcpu)) |
2260 | return paging64_init_context(vcpu); | 2247 | r = paging64_init_context(vcpu); |
2261 | else if (is_pae(vcpu)) | 2248 | else if (is_pae(vcpu)) |
2262 | return paging32E_init_context(vcpu); | 2249 | r = paging32E_init_context(vcpu); |
2263 | else | 2250 | else |
2264 | return paging32_init_context(vcpu); | 2251 | r = paging32_init_context(vcpu); |
2252 | |||
2253 | vcpu->arch.mmu.base_role.glevels = vcpu->arch.mmu.root_level; | ||
2254 | |||
2255 | return r; | ||
2265 | } | 2256 | } |
2266 | 2257 | ||
2267 | static int init_kvm_mmu(struct kvm_vcpu *vcpu) | 2258 | static int init_kvm_mmu(struct kvm_vcpu *vcpu) |
@@ -2492,7 +2483,7 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
2492 | index = kvm_page_table_hashfn(gfn); | 2483 | index = kvm_page_table_hashfn(gfn); |
2493 | bucket = &vcpu->kvm->arch.mmu_page_hash[index]; | 2484 | bucket = &vcpu->kvm->arch.mmu_page_hash[index]; |
2494 | hlist_for_each_entry_safe(sp, node, n, bucket, hash_link) { | 2485 | hlist_for_each_entry_safe(sp, node, n, bucket, hash_link) { |
2495 | if (sp->gfn != gfn || sp->role.metaphysical || sp->role.invalid) | 2486 | if (sp->gfn != gfn || sp->role.direct || sp->role.invalid) |
2496 | continue; | 2487 | continue; |
2497 | pte_size = sp->role.glevels == PT32_ROOT_LEVEL ? 4 : 8; | 2488 | pte_size = sp->role.glevels == PT32_ROOT_LEVEL ? 4 : 8; |
2498 | misaligned = (offset ^ (offset + bytes - 1)) & ~(pte_size - 1); | 2489 | misaligned = (offset ^ (offset + bytes - 1)) & ~(pte_size - 1); |
@@ -3130,7 +3121,7 @@ static void audit_write_protection(struct kvm_vcpu *vcpu) | |||
3130 | gfn_t gfn; | 3121 | gfn_t gfn; |
3131 | 3122 | ||
3132 | list_for_each_entry(sp, &vcpu->kvm->arch.active_mmu_pages, link) { | 3123 | list_for_each_entry(sp, &vcpu->kvm->arch.active_mmu_pages, link) { |
3133 | if (sp->role.metaphysical) | 3124 | if (sp->role.direct) |
3134 | continue; | 3125 | continue; |
3135 | 3126 | ||
3136 | gfn = unalias_gfn(vcpu->kvm, sp->gfn); | 3127 | gfn = unalias_gfn(vcpu->kvm, sp->gfn); |
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index 258e5d56298e..eaab2145f62b 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h | |||
@@ -54,7 +54,7 @@ static inline int kvm_mmu_reload(struct kvm_vcpu *vcpu) | |||
54 | static inline int is_long_mode(struct kvm_vcpu *vcpu) | 54 | static inline int is_long_mode(struct kvm_vcpu *vcpu) |
55 | { | 55 | { |
56 | #ifdef CONFIG_X86_64 | 56 | #ifdef CONFIG_X86_64 |
57 | return vcpu->arch.shadow_efer & EFER_LME; | 57 | return vcpu->arch.shadow_efer & EFER_LMA; |
58 | #else | 58 | #else |
59 | return 0; | 59 | return 0; |
60 | #endif | 60 | #endif |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 9fd78b6e17ad..6bd70206c561 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
@@ -25,7 +25,6 @@ | |||
25 | #if PTTYPE == 64 | 25 | #if PTTYPE == 64 |
26 | #define pt_element_t u64 | 26 | #define pt_element_t u64 |
27 | #define guest_walker guest_walker64 | 27 | #define guest_walker guest_walker64 |
28 | #define shadow_walker shadow_walker64 | ||
29 | #define FNAME(name) paging##64_##name | 28 | #define FNAME(name) paging##64_##name |
30 | #define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK | 29 | #define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK |
31 | #define PT_DIR_BASE_ADDR_MASK PT64_DIR_BASE_ADDR_MASK | 30 | #define PT_DIR_BASE_ADDR_MASK PT64_DIR_BASE_ADDR_MASK |
@@ -42,7 +41,6 @@ | |||
42 | #elif PTTYPE == 32 | 41 | #elif PTTYPE == 32 |
43 | #define pt_element_t u32 | 42 | #define pt_element_t u32 |
44 | #define guest_walker guest_walker32 | 43 | #define guest_walker guest_walker32 |
45 | #define shadow_walker shadow_walker32 | ||
46 | #define FNAME(name) paging##32_##name | 44 | #define FNAME(name) paging##32_##name |
47 | #define PT_BASE_ADDR_MASK PT32_BASE_ADDR_MASK | 45 | #define PT_BASE_ADDR_MASK PT32_BASE_ADDR_MASK |
48 | #define PT_DIR_BASE_ADDR_MASK PT32_DIR_BASE_ADDR_MASK | 46 | #define PT_DIR_BASE_ADDR_MASK PT32_DIR_BASE_ADDR_MASK |
@@ -73,18 +71,6 @@ struct guest_walker { | |||
73 | u32 error_code; | 71 | u32 error_code; |
74 | }; | 72 | }; |
75 | 73 | ||
76 | struct shadow_walker { | ||
77 | struct kvm_shadow_walk walker; | ||
78 | struct guest_walker *guest_walker; | ||
79 | int user_fault; | ||
80 | int write_fault; | ||
81 | int largepage; | ||
82 | int *ptwrite; | ||
83 | pfn_t pfn; | ||
84 | u64 *sptep; | ||
85 | gpa_t pte_gpa; | ||
86 | }; | ||
87 | |||
88 | static gfn_t gpte_to_gfn(pt_element_t gpte) | 74 | static gfn_t gpte_to_gfn(pt_element_t gpte) |
89 | { | 75 | { |
90 | return (gpte & PT_BASE_ADDR_MASK) >> PAGE_SHIFT; | 76 | return (gpte & PT_BASE_ADDR_MASK) >> PAGE_SHIFT; |
@@ -283,91 +269,79 @@ static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *page, | |||
283 | /* | 269 | /* |
284 | * Fetch a shadow pte for a specific level in the paging hierarchy. | 270 | * Fetch a shadow pte for a specific level in the paging hierarchy. |
285 | */ | 271 | */ |
286 | static int FNAME(shadow_walk_entry)(struct kvm_shadow_walk *_sw, | 272 | static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, |
287 | struct kvm_vcpu *vcpu, u64 addr, | 273 | struct guest_walker *gw, |
288 | u64 *sptep, int level) | 274 | int user_fault, int write_fault, int largepage, |
275 | int *ptwrite, pfn_t pfn) | ||
289 | { | 276 | { |
290 | struct shadow_walker *sw = | ||
291 | container_of(_sw, struct shadow_walker, walker); | ||
292 | struct guest_walker *gw = sw->guest_walker; | ||
293 | unsigned access = gw->pt_access; | 277 | unsigned access = gw->pt_access; |
294 | struct kvm_mmu_page *shadow_page; | 278 | struct kvm_mmu_page *shadow_page; |
295 | u64 spte; | 279 | u64 spte, *sptep; |
296 | int metaphysical; | 280 | int direct; |
297 | gfn_t table_gfn; | 281 | gfn_t table_gfn; |
298 | int r; | 282 | int r; |
283 | int level; | ||
299 | pt_element_t curr_pte; | 284 | pt_element_t curr_pte; |
285 | struct kvm_shadow_walk_iterator iterator; | ||
300 | 286 | ||
301 | if (level == PT_PAGE_TABLE_LEVEL | 287 | if (!is_present_pte(gw->ptes[gw->level - 1])) |
302 | || (sw->largepage && level == PT_DIRECTORY_LEVEL)) { | 288 | return NULL; |
303 | mmu_set_spte(vcpu, sptep, access, gw->pte_access & access, | ||
304 | sw->user_fault, sw->write_fault, | ||
305 | gw->ptes[gw->level-1] & PT_DIRTY_MASK, | ||
306 | sw->ptwrite, sw->largepage, | ||
307 | gw->ptes[gw->level-1] & PT_GLOBAL_MASK, | ||
308 | gw->gfn, sw->pfn, false); | ||
309 | sw->sptep = sptep; | ||
310 | return 1; | ||
311 | } | ||
312 | 289 | ||
313 | if (is_shadow_present_pte(*sptep) && !is_large_pte(*sptep)) | 290 | for_each_shadow_entry(vcpu, addr, iterator) { |
314 | return 0; | 291 | level = iterator.level; |
292 | sptep = iterator.sptep; | ||
293 | if (level == PT_PAGE_TABLE_LEVEL | ||
294 | || (largepage && level == PT_DIRECTORY_LEVEL)) { | ||
295 | mmu_set_spte(vcpu, sptep, access, | ||
296 | gw->pte_access & access, | ||
297 | user_fault, write_fault, | ||
298 | gw->ptes[gw->level-1] & PT_DIRTY_MASK, | ||
299 | ptwrite, largepage, | ||
300 | gw->ptes[gw->level-1] & PT_GLOBAL_MASK, | ||
301 | gw->gfn, pfn, false); | ||
302 | break; | ||
303 | } | ||
315 | 304 | ||
316 | if (is_large_pte(*sptep)) { | 305 | if (is_shadow_present_pte(*sptep) && !is_large_pte(*sptep)) |
317 | set_shadow_pte(sptep, shadow_trap_nonpresent_pte); | 306 | continue; |
318 | kvm_flush_remote_tlbs(vcpu->kvm); | ||
319 | rmap_remove(vcpu->kvm, sptep); | ||
320 | } | ||
321 | 307 | ||
322 | if (level == PT_DIRECTORY_LEVEL && gw->level == PT_DIRECTORY_LEVEL) { | 308 | if (is_large_pte(*sptep)) { |
323 | metaphysical = 1; | 309 | rmap_remove(vcpu->kvm, sptep); |
324 | if (!is_dirty_pte(gw->ptes[level - 1])) | 310 | set_shadow_pte(sptep, shadow_trap_nonpresent_pte); |
325 | access &= ~ACC_WRITE_MASK; | 311 | kvm_flush_remote_tlbs(vcpu->kvm); |
326 | table_gfn = gpte_to_gfn(gw->ptes[level - 1]); | ||
327 | } else { | ||
328 | metaphysical = 0; | ||
329 | table_gfn = gw->table_gfn[level - 2]; | ||
330 | } | ||
331 | shadow_page = kvm_mmu_get_page(vcpu, table_gfn, (gva_t)addr, level-1, | ||
332 | metaphysical, access, sptep); | ||
333 | if (!metaphysical) { | ||
334 | r = kvm_read_guest_atomic(vcpu->kvm, gw->pte_gpa[level - 2], | ||
335 | &curr_pte, sizeof(curr_pte)); | ||
336 | if (r || curr_pte != gw->ptes[level - 2]) { | ||
337 | kvm_mmu_put_page(shadow_page, sptep); | ||
338 | kvm_release_pfn_clean(sw->pfn); | ||
339 | sw->sptep = NULL; | ||
340 | return 1; | ||
341 | } | 312 | } |
342 | } | ||
343 | 313 | ||
344 | spte = __pa(shadow_page->spt) | PT_PRESENT_MASK | PT_ACCESSED_MASK | 314 | if (level == PT_DIRECTORY_LEVEL |
345 | | PT_WRITABLE_MASK | PT_USER_MASK; | 315 | && gw->level == PT_DIRECTORY_LEVEL) { |
346 | *sptep = spte; | 316 | direct = 1; |
347 | return 0; | 317 | if (!is_dirty_pte(gw->ptes[level - 1])) |
348 | } | 318 | access &= ~ACC_WRITE_MASK; |
349 | 319 | table_gfn = gpte_to_gfn(gw->ptes[level - 1]); | |
350 | static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | 320 | } else { |
351 | struct guest_walker *guest_walker, | 321 | direct = 0; |
352 | int user_fault, int write_fault, int largepage, | 322 | table_gfn = gw->table_gfn[level - 2]; |
353 | int *ptwrite, pfn_t pfn) | 323 | } |
354 | { | 324 | shadow_page = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1, |
355 | struct shadow_walker walker = { | 325 | direct, access, sptep); |
356 | .walker = { .entry = FNAME(shadow_walk_entry), }, | 326 | if (!direct) { |
357 | .guest_walker = guest_walker, | 327 | r = kvm_read_guest_atomic(vcpu->kvm, |
358 | .user_fault = user_fault, | 328 | gw->pte_gpa[level - 2], |
359 | .write_fault = write_fault, | 329 | &curr_pte, sizeof(curr_pte)); |
360 | .largepage = largepage, | 330 | if (r || curr_pte != gw->ptes[level - 2]) { |
361 | .ptwrite = ptwrite, | 331 | kvm_mmu_put_page(shadow_page, sptep); |
362 | .pfn = pfn, | 332 | kvm_release_pfn_clean(pfn); |
363 | }; | 333 | sptep = NULL; |
364 | 334 | break; | |
365 | if (!is_present_pte(guest_walker->ptes[guest_walker->level - 1])) | 335 | } |
366 | return NULL; | 336 | } |
367 | 337 | ||
368 | walk_shadow(&walker.walker, vcpu, addr); | 338 | spte = __pa(shadow_page->spt) |
339 | | PT_PRESENT_MASK | PT_ACCESSED_MASK | ||
340 | | PT_WRITABLE_MASK | PT_USER_MASK; | ||
341 | *sptep = spte; | ||
342 | } | ||
369 | 343 | ||
370 | return walker.sptep; | 344 | return sptep; |
371 | } | 345 | } |
372 | 346 | ||
373 | /* | 347 | /* |
@@ -465,54 +439,56 @@ out_unlock: | |||
465 | return 0; | 439 | return 0; |
466 | } | 440 | } |
467 | 441 | ||
468 | static int FNAME(shadow_invlpg_entry)(struct kvm_shadow_walk *_sw, | 442 | static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) |
469 | struct kvm_vcpu *vcpu, u64 addr, | ||
470 | u64 *sptep, int level) | ||
471 | { | 443 | { |
472 | struct shadow_walker *sw = | 444 | struct kvm_shadow_walk_iterator iterator; |
473 | container_of(_sw, struct shadow_walker, walker); | 445 | pt_element_t gpte; |
474 | 446 | gpa_t pte_gpa = -1; | |
475 | /* FIXME: properly handle invlpg on large guest pages */ | 447 | int level; |
476 | if (level == PT_PAGE_TABLE_LEVEL || | 448 | u64 *sptep; |
477 | ((level == PT_DIRECTORY_LEVEL) && is_large_pte(*sptep))) { | 449 | int need_flush = 0; |
478 | struct kvm_mmu_page *sp = page_header(__pa(sptep)); | ||
479 | 450 | ||
480 | sw->pte_gpa = (sp->gfn << PAGE_SHIFT); | 451 | spin_lock(&vcpu->kvm->mmu_lock); |
481 | sw->pte_gpa += (sptep - sp->spt) * sizeof(pt_element_t); | ||
482 | 452 | ||
483 | if (is_shadow_present_pte(*sptep)) { | 453 | for_each_shadow_entry(vcpu, gva, iterator) { |
484 | rmap_remove(vcpu->kvm, sptep); | 454 | level = iterator.level; |
485 | if (is_large_pte(*sptep)) | 455 | sptep = iterator.sptep; |
486 | --vcpu->kvm->stat.lpages; | 456 | |
457 | /* FIXME: properly handle invlpg on large guest pages */ | ||
458 | if (level == PT_PAGE_TABLE_LEVEL || | ||
459 | ((level == PT_DIRECTORY_LEVEL) && is_large_pte(*sptep))) { | ||
460 | struct kvm_mmu_page *sp = page_header(__pa(sptep)); | ||
461 | |||
462 | pte_gpa = (sp->gfn << PAGE_SHIFT); | ||
463 | pte_gpa += (sptep - sp->spt) * sizeof(pt_element_t); | ||
464 | |||
465 | if (is_shadow_present_pte(*sptep)) { | ||
466 | rmap_remove(vcpu->kvm, sptep); | ||
467 | if (is_large_pte(*sptep)) | ||
468 | --vcpu->kvm->stat.lpages; | ||
469 | need_flush = 1; | ||
470 | } | ||
471 | set_shadow_pte(sptep, shadow_trap_nonpresent_pte); | ||
472 | break; | ||
487 | } | 473 | } |
488 | set_shadow_pte(sptep, shadow_trap_nonpresent_pte); | ||
489 | return 1; | ||
490 | } | ||
491 | if (!is_shadow_present_pte(*sptep)) | ||
492 | return 1; | ||
493 | return 0; | ||
494 | } | ||
495 | 474 | ||
496 | static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva) | 475 | if (!is_shadow_present_pte(*sptep)) |
497 | { | 476 | break; |
498 | pt_element_t gpte; | 477 | } |
499 | struct shadow_walker walker = { | ||
500 | .walker = { .entry = FNAME(shadow_invlpg_entry), }, | ||
501 | .pte_gpa = -1, | ||
502 | }; | ||
503 | 478 | ||
504 | spin_lock(&vcpu->kvm->mmu_lock); | 479 | if (need_flush) |
505 | walk_shadow(&walker.walker, vcpu, gva); | 480 | kvm_flush_remote_tlbs(vcpu->kvm); |
506 | spin_unlock(&vcpu->kvm->mmu_lock); | 481 | spin_unlock(&vcpu->kvm->mmu_lock); |
507 | if (walker.pte_gpa == -1) | 482 | |
483 | if (pte_gpa == -1) | ||
508 | return; | 484 | return; |
509 | if (kvm_read_guest_atomic(vcpu->kvm, walker.pte_gpa, &gpte, | 485 | if (kvm_read_guest_atomic(vcpu->kvm, pte_gpa, &gpte, |
510 | sizeof(pt_element_t))) | 486 | sizeof(pt_element_t))) |
511 | return; | 487 | return; |
512 | if (is_present_pte(gpte) && (gpte & PT_ACCESSED_MASK)) { | 488 | if (is_present_pte(gpte) && (gpte & PT_ACCESSED_MASK)) { |
513 | if (mmu_topup_memory_caches(vcpu)) | 489 | if (mmu_topup_memory_caches(vcpu)) |
514 | return; | 490 | return; |
515 | kvm_mmu_pte_write(vcpu, walker.pte_gpa, (const u8 *)&gpte, | 491 | kvm_mmu_pte_write(vcpu, pte_gpa, (const u8 *)&gpte, |
516 | sizeof(pt_element_t), 0); | 492 | sizeof(pt_element_t), 0); |
517 | } | 493 | } |
518 | } | 494 | } |
@@ -540,7 +516,7 @@ static void FNAME(prefetch_page)(struct kvm_vcpu *vcpu, | |||
540 | pt_element_t pt[256 / sizeof(pt_element_t)]; | 516 | pt_element_t pt[256 / sizeof(pt_element_t)]; |
541 | gpa_t pte_gpa; | 517 | gpa_t pte_gpa; |
542 | 518 | ||
543 | if (sp->role.metaphysical | 519 | if (sp->role.direct |
544 | || (PTTYPE == 32 && sp->role.level > PT_PAGE_TABLE_LEVEL)) { | 520 | || (PTTYPE == 32 && sp->role.level > PT_PAGE_TABLE_LEVEL)) { |
545 | nonpaging_prefetch_page(vcpu, sp); | 521 | nonpaging_prefetch_page(vcpu, sp); |
546 | return; | 522 | return; |
@@ -619,7 +595,6 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp) | |||
619 | 595 | ||
620 | #undef pt_element_t | 596 | #undef pt_element_t |
621 | #undef guest_walker | 597 | #undef guest_walker |
622 | #undef shadow_walker | ||
623 | #undef FNAME | 598 | #undef FNAME |
624 | #undef PT_BASE_ADDR_MASK | 599 | #undef PT_BASE_ADDR_MASK |
625 | #undef PT_INDEX | 600 | #undef PT_INDEX |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index a9e769e4e251..1821c2078199 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -38,9 +38,6 @@ MODULE_LICENSE("GPL"); | |||
38 | #define IOPM_ALLOC_ORDER 2 | 38 | #define IOPM_ALLOC_ORDER 2 |
39 | #define MSRPM_ALLOC_ORDER 1 | 39 | #define MSRPM_ALLOC_ORDER 1 |
40 | 40 | ||
41 | #define DR7_GD_MASK (1 << 13) | ||
42 | #define DR6_BD_MASK (1 << 13) | ||
43 | |||
44 | #define SEG_TYPE_LDT 2 | 41 | #define SEG_TYPE_LDT 2 |
45 | #define SEG_TYPE_BUSY_TSS16 3 | 42 | #define SEG_TYPE_BUSY_TSS16 3 |
46 | 43 | ||
@@ -50,6 +47,15 @@ MODULE_LICENSE("GPL"); | |||
50 | 47 | ||
51 | #define DEBUGCTL_RESERVED_BITS (~(0x3fULL)) | 48 | #define DEBUGCTL_RESERVED_BITS (~(0x3fULL)) |
52 | 49 | ||
50 | /* Turn on to get debugging output*/ | ||
51 | /* #define NESTED_DEBUG */ | ||
52 | |||
53 | #ifdef NESTED_DEBUG | ||
54 | #define nsvm_printk(fmt, args...) printk(KERN_INFO fmt, ## args) | ||
55 | #else | ||
56 | #define nsvm_printk(fmt, args...) do {} while(0) | ||
57 | #endif | ||
58 | |||
53 | /* enable NPT for AMD64 and X86 with PAE */ | 59 | /* enable NPT for AMD64 and X86 with PAE */ |
54 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | 60 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) |
55 | static bool npt_enabled = true; | 61 | static bool npt_enabled = true; |
@@ -60,14 +66,29 @@ static int npt = 1; | |||
60 | 66 | ||
61 | module_param(npt, int, S_IRUGO); | 67 | module_param(npt, int, S_IRUGO); |
62 | 68 | ||
69 | static int nested = 0; | ||
70 | module_param(nested, int, S_IRUGO); | ||
71 | |||
63 | static void kvm_reput_irq(struct vcpu_svm *svm); | 72 | static void kvm_reput_irq(struct vcpu_svm *svm); |
64 | static void svm_flush_tlb(struct kvm_vcpu *vcpu); | 73 | static void svm_flush_tlb(struct kvm_vcpu *vcpu); |
65 | 74 | ||
75 | static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override); | ||
76 | static int nested_svm_vmexit(struct vcpu_svm *svm); | ||
77 | static int nested_svm_vmsave(struct vcpu_svm *svm, void *nested_vmcb, | ||
78 | void *arg2, void *opaque); | ||
79 | static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr, | ||
80 | bool has_error_code, u32 error_code); | ||
81 | |||
66 | static inline struct vcpu_svm *to_svm(struct kvm_vcpu *vcpu) | 82 | static inline struct vcpu_svm *to_svm(struct kvm_vcpu *vcpu) |
67 | { | 83 | { |
68 | return container_of(vcpu, struct vcpu_svm, vcpu); | 84 | return container_of(vcpu, struct vcpu_svm, vcpu); |
69 | } | 85 | } |
70 | 86 | ||
87 | static inline bool is_nested(struct vcpu_svm *svm) | ||
88 | { | ||
89 | return svm->nested_vmcb; | ||
90 | } | ||
91 | |||
71 | static unsigned long iopm_base; | 92 | static unsigned long iopm_base; |
72 | 93 | ||
73 | struct kvm_ldttss_desc { | 94 | struct kvm_ldttss_desc { |
@@ -157,32 +178,6 @@ static inline void kvm_write_cr2(unsigned long val) | |||
157 | asm volatile ("mov %0, %%cr2" :: "r" (val)); | 178 | asm volatile ("mov %0, %%cr2" :: "r" (val)); |
158 | } | 179 | } |
159 | 180 | ||
160 | static inline unsigned long read_dr6(void) | ||
161 | { | ||
162 | unsigned long dr6; | ||
163 | |||
164 | asm volatile ("mov %%dr6, %0" : "=r" (dr6)); | ||
165 | return dr6; | ||
166 | } | ||
167 | |||
168 | static inline void write_dr6(unsigned long val) | ||
169 | { | ||
170 | asm volatile ("mov %0, %%dr6" :: "r" (val)); | ||
171 | } | ||
172 | |||
173 | static inline unsigned long read_dr7(void) | ||
174 | { | ||
175 | unsigned long dr7; | ||
176 | |||
177 | asm volatile ("mov %%dr7, %0" : "=r" (dr7)); | ||
178 | return dr7; | ||
179 | } | ||
180 | |||
181 | static inline void write_dr7(unsigned long val) | ||
182 | { | ||
183 | asm volatile ("mov %0, %%dr7" :: "r" (val)); | ||
184 | } | ||
185 | |||
186 | static inline void force_new_asid(struct kvm_vcpu *vcpu) | 181 | static inline void force_new_asid(struct kvm_vcpu *vcpu) |
187 | { | 182 | { |
188 | to_svm(vcpu)->asid_generation--; | 183 | to_svm(vcpu)->asid_generation--; |
@@ -198,7 +193,7 @@ static void svm_set_efer(struct kvm_vcpu *vcpu, u64 efer) | |||
198 | if (!npt_enabled && !(efer & EFER_LMA)) | 193 | if (!npt_enabled && !(efer & EFER_LMA)) |
199 | efer &= ~EFER_LME; | 194 | efer &= ~EFER_LME; |
200 | 195 | ||
201 | to_svm(vcpu)->vmcb->save.efer = efer | MSR_EFER_SVME_MASK; | 196 | to_svm(vcpu)->vmcb->save.efer = efer | EFER_SVME; |
202 | vcpu->arch.shadow_efer = efer; | 197 | vcpu->arch.shadow_efer = efer; |
203 | } | 198 | } |
204 | 199 | ||
@@ -207,6 +202,11 @@ static void svm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr, | |||
207 | { | 202 | { |
208 | struct vcpu_svm *svm = to_svm(vcpu); | 203 | struct vcpu_svm *svm = to_svm(vcpu); |
209 | 204 | ||
205 | /* If we are within a nested VM we'd better #VMEXIT and let the | ||
206 | guest handle the exception */ | ||
207 | if (nested_svm_check_exception(svm, nr, has_error_code, error_code)) | ||
208 | return; | ||
209 | |||
210 | svm->vmcb->control.event_inj = nr | 210 | svm->vmcb->control.event_inj = nr |
211 | | SVM_EVTINJ_VALID | 211 | | SVM_EVTINJ_VALID |
212 | | (has_error_code ? SVM_EVTINJ_VALID_ERR : 0) | 212 | | (has_error_code ? SVM_EVTINJ_VALID_ERR : 0) |
@@ -242,7 +242,7 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) | |||
242 | kvm_rip_write(vcpu, svm->next_rip); | 242 | kvm_rip_write(vcpu, svm->next_rip); |
243 | svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK; | 243 | svm->vmcb->control.int_state &= ~SVM_INTERRUPT_SHADOW_MASK; |
244 | 244 | ||
245 | vcpu->arch.interrupt_window_open = 1; | 245 | vcpu->arch.interrupt_window_open = (svm->vcpu.arch.hflags & HF_GIF_MASK); |
246 | } | 246 | } |
247 | 247 | ||
248 | static int has_svm(void) | 248 | static int has_svm(void) |
@@ -250,7 +250,7 @@ static int has_svm(void) | |||
250 | const char *msg; | 250 | const char *msg; |
251 | 251 | ||
252 | if (!cpu_has_svm(&msg)) { | 252 | if (!cpu_has_svm(&msg)) { |
253 | printk(KERN_INFO "has_svn: %s\n", msg); | 253 | printk(KERN_INFO "has_svm: %s\n", msg); |
254 | return 0; | 254 | return 0; |
255 | } | 255 | } |
256 | 256 | ||
@@ -292,7 +292,7 @@ static void svm_hardware_enable(void *garbage) | |||
292 | svm_data->tss_desc = (struct kvm_ldttss_desc *)(gdt + GDT_ENTRY_TSS); | 292 | svm_data->tss_desc = (struct kvm_ldttss_desc *)(gdt + GDT_ENTRY_TSS); |
293 | 293 | ||
294 | rdmsrl(MSR_EFER, efer); | 294 | rdmsrl(MSR_EFER, efer); |
295 | wrmsrl(MSR_EFER, efer | MSR_EFER_SVME_MASK); | 295 | wrmsrl(MSR_EFER, efer | EFER_SVME); |
296 | 296 | ||
297 | wrmsrl(MSR_VM_HSAVE_PA, | 297 | wrmsrl(MSR_VM_HSAVE_PA, |
298 | page_to_pfn(svm_data->save_area) << PAGE_SHIFT); | 298 | page_to_pfn(svm_data->save_area) << PAGE_SHIFT); |
@@ -417,6 +417,14 @@ static __init int svm_hardware_setup(void) | |||
417 | if (boot_cpu_has(X86_FEATURE_NX)) | 417 | if (boot_cpu_has(X86_FEATURE_NX)) |
418 | kvm_enable_efer_bits(EFER_NX); | 418 | kvm_enable_efer_bits(EFER_NX); |
419 | 419 | ||
420 | if (boot_cpu_has(X86_FEATURE_FXSR_OPT)) | ||
421 | kvm_enable_efer_bits(EFER_FFXSR); | ||
422 | |||
423 | if (nested) { | ||
424 | printk(KERN_INFO "kvm: Nested Virtualization enabled\n"); | ||
425 | kvm_enable_efer_bits(EFER_SVME); | ||
426 | } | ||
427 | |||
420 | for_each_online_cpu(cpu) { | 428 | for_each_online_cpu(cpu) { |
421 | r = svm_cpu_init(cpu); | 429 | r = svm_cpu_init(cpu); |
422 | if (r) | 430 | if (r) |
@@ -559,7 +567,7 @@ static void init_vmcb(struct vcpu_svm *svm) | |||
559 | init_sys_seg(&save->ldtr, SEG_TYPE_LDT); | 567 | init_sys_seg(&save->ldtr, SEG_TYPE_LDT); |
560 | init_sys_seg(&save->tr, SEG_TYPE_BUSY_TSS16); | 568 | init_sys_seg(&save->tr, SEG_TYPE_BUSY_TSS16); |
561 | 569 | ||
562 | save->efer = MSR_EFER_SVME_MASK; | 570 | save->efer = EFER_SVME; |
563 | save->dr6 = 0xffff0ff0; | 571 | save->dr6 = 0xffff0ff0; |
564 | save->dr7 = 0x400; | 572 | save->dr7 = 0x400; |
565 | save->rflags = 2; | 573 | save->rflags = 2; |
@@ -591,6 +599,9 @@ static void init_vmcb(struct vcpu_svm *svm) | |||
591 | save->cr4 = 0; | 599 | save->cr4 = 0; |
592 | } | 600 | } |
593 | force_new_asid(&svm->vcpu); | 601 | force_new_asid(&svm->vcpu); |
602 | |||
603 | svm->nested_vmcb = 0; | ||
604 | svm->vcpu.arch.hflags = HF_GIF_MASK; | ||
594 | } | 605 | } |
595 | 606 | ||
596 | static int svm_vcpu_reset(struct kvm_vcpu *vcpu) | 607 | static int svm_vcpu_reset(struct kvm_vcpu *vcpu) |
@@ -615,6 +626,8 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
615 | struct vcpu_svm *svm; | 626 | struct vcpu_svm *svm; |
616 | struct page *page; | 627 | struct page *page; |
617 | struct page *msrpm_pages; | 628 | struct page *msrpm_pages; |
629 | struct page *hsave_page; | ||
630 | struct page *nested_msrpm_pages; | ||
618 | int err; | 631 | int err; |
619 | 632 | ||
620 | svm = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL); | 633 | svm = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL); |
@@ -637,14 +650,25 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) | |||
637 | msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); | 650 | msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); |
638 | if (!msrpm_pages) | 651 | if (!msrpm_pages) |
639 | goto uninit; | 652 | goto uninit; |
653 | |||
654 | nested_msrpm_pages = alloc_pages(GFP_KERNEL, MSRPM_ALLOC_ORDER); | ||
655 | if (!nested_msrpm_pages) | ||
656 | goto uninit; | ||
657 | |||
640 | svm->msrpm = page_address(msrpm_pages); | 658 | svm->msrpm = page_address(msrpm_pages); |
641 | svm_vcpu_init_msrpm(svm->msrpm); | 659 | svm_vcpu_init_msrpm(svm->msrpm); |
642 | 660 | ||
661 | hsave_page = alloc_page(GFP_KERNEL); | ||
662 | if (!hsave_page) | ||
663 | goto uninit; | ||
664 | svm->hsave = page_address(hsave_page); | ||
665 | |||
666 | svm->nested_msrpm = page_address(nested_msrpm_pages); | ||
667 | |||
643 | svm->vmcb = page_address(page); | 668 | svm->vmcb = page_address(page); |
644 | clear_page(svm->vmcb); | 669 | clear_page(svm->vmcb); |
645 | svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT; | 670 | svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT; |
646 | svm->asid_generation = 0; | 671 | svm->asid_generation = 0; |
647 | memset(svm->db_regs, 0, sizeof(svm->db_regs)); | ||
648 | init_vmcb(svm); | 672 | init_vmcb(svm); |
649 | 673 | ||
650 | fx_init(&svm->vcpu); | 674 | fx_init(&svm->vcpu); |
@@ -669,6 +693,8 @@ static void svm_free_vcpu(struct kvm_vcpu *vcpu) | |||
669 | 693 | ||
670 | __free_page(pfn_to_page(svm->vmcb_pa >> PAGE_SHIFT)); | 694 | __free_page(pfn_to_page(svm->vmcb_pa >> PAGE_SHIFT)); |
671 | __free_pages(virt_to_page(svm->msrpm), MSRPM_ALLOC_ORDER); | 695 | __free_pages(virt_to_page(svm->msrpm), MSRPM_ALLOC_ORDER); |
696 | __free_page(virt_to_page(svm->hsave)); | ||
697 | __free_pages(virt_to_page(svm->nested_msrpm), MSRPM_ALLOC_ORDER); | ||
672 | kvm_vcpu_uninit(vcpu); | 698 | kvm_vcpu_uninit(vcpu); |
673 | kmem_cache_free(kvm_vcpu_cache, svm); | 699 | kmem_cache_free(kvm_vcpu_cache, svm); |
674 | } | 700 | } |
@@ -718,6 +744,16 @@ static void svm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags) | |||
718 | to_svm(vcpu)->vmcb->save.rflags = rflags; | 744 | to_svm(vcpu)->vmcb->save.rflags = rflags; |
719 | } | 745 | } |
720 | 746 | ||
747 | static void svm_set_vintr(struct vcpu_svm *svm) | ||
748 | { | ||
749 | svm->vmcb->control.intercept |= 1ULL << INTERCEPT_VINTR; | ||
750 | } | ||
751 | |||
752 | static void svm_clear_vintr(struct vcpu_svm *svm) | ||
753 | { | ||
754 | svm->vmcb->control.intercept &= ~(1ULL << INTERCEPT_VINTR); | ||
755 | } | ||
756 | |||
721 | static struct vmcb_seg *svm_seg(struct kvm_vcpu *vcpu, int seg) | 757 | static struct vmcb_seg *svm_seg(struct kvm_vcpu *vcpu, int seg) |
722 | { | 758 | { |
723 | struct vmcb_save_area *save = &to_svm(vcpu)->vmcb->save; | 759 | struct vmcb_save_area *save = &to_svm(vcpu)->vmcb->save; |
@@ -760,20 +796,37 @@ static void svm_get_segment(struct kvm_vcpu *vcpu, | |||
760 | var->db = (s->attrib >> SVM_SELECTOR_DB_SHIFT) & 1; | 796 | var->db = (s->attrib >> SVM_SELECTOR_DB_SHIFT) & 1; |
761 | var->g = (s->attrib >> SVM_SELECTOR_G_SHIFT) & 1; | 797 | var->g = (s->attrib >> SVM_SELECTOR_G_SHIFT) & 1; |
762 | 798 | ||
763 | /* | 799 | switch (seg) { |
764 | * SVM always stores 0 for the 'G' bit in the CS selector in | 800 | case VCPU_SREG_CS: |
765 | * the VMCB on a VMEXIT. This hurts cross-vendor migration: | 801 | /* |
766 | * Intel's VMENTRY has a check on the 'G' bit. | 802 | * SVM always stores 0 for the 'G' bit in the CS selector in |
767 | */ | 803 | * the VMCB on a VMEXIT. This hurts cross-vendor migration: |
768 | if (seg == VCPU_SREG_CS) | 804 | * Intel's VMENTRY has a check on the 'G' bit. |
805 | */ | ||
769 | var->g = s->limit > 0xfffff; | 806 | var->g = s->limit > 0xfffff; |
770 | 807 | break; | |
771 | /* | 808 | case VCPU_SREG_TR: |
772 | * Work around a bug where the busy flag in the tr selector | 809 | /* |
773 | * isn't exposed | 810 | * Work around a bug where the busy flag in the tr selector |
774 | */ | 811 | * isn't exposed |
775 | if (seg == VCPU_SREG_TR) | 812 | */ |
776 | var->type |= 0x2; | 813 | var->type |= 0x2; |
814 | break; | ||
815 | case VCPU_SREG_DS: | ||
816 | case VCPU_SREG_ES: | ||
817 | case VCPU_SREG_FS: | ||
818 | case VCPU_SREG_GS: | ||
819 | /* | ||
820 | * The accessed bit must always be set in the segment | ||
821 | * descriptor cache, although it can be cleared in the | ||
822 | * descriptor, the cached bit always remains at 1. Since | ||
823 | * Intel has a check on this, set it here to support | ||
824 | * cross-vendor migration. | ||
825 | */ | ||
826 | if (!var->unusable) | ||
827 | var->type |= 0x1; | ||
828 | break; | ||
829 | } | ||
777 | 830 | ||
778 | var->unusable = !var->present; | 831 | var->unusable = !var->present; |
779 | } | 832 | } |
@@ -905,9 +958,37 @@ static void svm_set_segment(struct kvm_vcpu *vcpu, | |||
905 | 958 | ||
906 | } | 959 | } |
907 | 960 | ||
908 | static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_debug_guest *dbg) | 961 | static int svm_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) |
909 | { | 962 | { |
910 | return -EOPNOTSUPP; | 963 | int old_debug = vcpu->guest_debug; |
964 | struct vcpu_svm *svm = to_svm(vcpu); | ||
965 | |||
966 | vcpu->guest_debug = dbg->control; | ||
967 | |||
968 | svm->vmcb->control.intercept_exceptions &= | ||
969 | ~((1 << DB_VECTOR) | (1 << BP_VECTOR)); | ||
970 | if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { | ||
971 | if (vcpu->guest_debug & | ||
972 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) | ||
973 | svm->vmcb->control.intercept_exceptions |= | ||
974 | 1 << DB_VECTOR; | ||
975 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) | ||
976 | svm->vmcb->control.intercept_exceptions |= | ||
977 | 1 << BP_VECTOR; | ||
978 | } else | ||
979 | vcpu->guest_debug = 0; | ||
980 | |||
981 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) | ||
982 | svm->vmcb->save.dr7 = dbg->arch.debugreg[7]; | ||
983 | else | ||
984 | svm->vmcb->save.dr7 = vcpu->arch.dr7; | ||
985 | |||
986 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) | ||
987 | svm->vmcb->save.rflags |= X86_EFLAGS_TF | X86_EFLAGS_RF; | ||
988 | else if (old_debug & KVM_GUESTDBG_SINGLESTEP) | ||
989 | svm->vmcb->save.rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF); | ||
990 | |||
991 | return 0; | ||
911 | } | 992 | } |
912 | 993 | ||
913 | static int svm_get_irq(struct kvm_vcpu *vcpu) | 994 | static int svm_get_irq(struct kvm_vcpu *vcpu) |
@@ -949,7 +1030,29 @@ static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *svm_data) | |||
949 | 1030 | ||
950 | static unsigned long svm_get_dr(struct kvm_vcpu *vcpu, int dr) | 1031 | static unsigned long svm_get_dr(struct kvm_vcpu *vcpu, int dr) |
951 | { | 1032 | { |
952 | unsigned long val = to_svm(vcpu)->db_regs[dr]; | 1033 | struct vcpu_svm *svm = to_svm(vcpu); |
1034 | unsigned long val; | ||
1035 | |||
1036 | switch (dr) { | ||
1037 | case 0 ... 3: | ||
1038 | val = vcpu->arch.db[dr]; | ||
1039 | break; | ||
1040 | case 6: | ||
1041 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) | ||
1042 | val = vcpu->arch.dr6; | ||
1043 | else | ||
1044 | val = svm->vmcb->save.dr6; | ||
1045 | break; | ||
1046 | case 7: | ||
1047 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) | ||
1048 | val = vcpu->arch.dr7; | ||
1049 | else | ||
1050 | val = svm->vmcb->save.dr7; | ||
1051 | break; | ||
1052 | default: | ||
1053 | val = 0; | ||
1054 | } | ||
1055 | |||
953 | KVMTRACE_2D(DR_READ, vcpu, (u32)dr, (u32)val, handler); | 1056 | KVMTRACE_2D(DR_READ, vcpu, (u32)dr, (u32)val, handler); |
954 | return val; | 1057 | return val; |
955 | } | 1058 | } |
@@ -959,33 +1062,40 @@ static void svm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long value, | |||
959 | { | 1062 | { |
960 | struct vcpu_svm *svm = to_svm(vcpu); | 1063 | struct vcpu_svm *svm = to_svm(vcpu); |
961 | 1064 | ||
962 | *exception = 0; | 1065 | KVMTRACE_2D(DR_WRITE, vcpu, (u32)dr, (u32)value, handler); |
963 | 1066 | ||
964 | if (svm->vmcb->save.dr7 & DR7_GD_MASK) { | 1067 | *exception = 0; |
965 | svm->vmcb->save.dr7 &= ~DR7_GD_MASK; | ||
966 | svm->vmcb->save.dr6 |= DR6_BD_MASK; | ||
967 | *exception = DB_VECTOR; | ||
968 | return; | ||
969 | } | ||
970 | 1068 | ||
971 | switch (dr) { | 1069 | switch (dr) { |
972 | case 0 ... 3: | 1070 | case 0 ... 3: |
973 | svm->db_regs[dr] = value; | 1071 | vcpu->arch.db[dr] = value; |
1072 | if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) | ||
1073 | vcpu->arch.eff_db[dr] = value; | ||
974 | return; | 1074 | return; |
975 | case 4 ... 5: | 1075 | case 4 ... 5: |
976 | if (vcpu->arch.cr4 & X86_CR4_DE) { | 1076 | if (vcpu->arch.cr4 & X86_CR4_DE) |
977 | *exception = UD_VECTOR; | 1077 | *exception = UD_VECTOR; |
1078 | return; | ||
1079 | case 6: | ||
1080 | if (value & 0xffffffff00000000ULL) { | ||
1081 | *exception = GP_VECTOR; | ||
978 | return; | 1082 | return; |
979 | } | 1083 | } |
980 | case 7: { | 1084 | vcpu->arch.dr6 = (value & DR6_VOLATILE) | DR6_FIXED_1; |
981 | if (value & ~((1ULL << 32) - 1)) { | 1085 | return; |
1086 | case 7: | ||
1087 | if (value & 0xffffffff00000000ULL) { | ||
982 | *exception = GP_VECTOR; | 1088 | *exception = GP_VECTOR; |
983 | return; | 1089 | return; |
984 | } | 1090 | } |
985 | svm->vmcb->save.dr7 = value; | 1091 | vcpu->arch.dr7 = (value & DR7_VOLATILE) | DR7_FIXED_1; |
1092 | if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) { | ||
1093 | svm->vmcb->save.dr7 = vcpu->arch.dr7; | ||
1094 | vcpu->arch.switch_db_regs = (value & DR7_BP_EN_MASK); | ||
1095 | } | ||
986 | return; | 1096 | return; |
987 | } | ||
988 | default: | 1097 | default: |
1098 | /* FIXME: Possible case? */ | ||
989 | printk(KERN_DEBUG "%s: unexpected dr %u\n", | 1099 | printk(KERN_DEBUG "%s: unexpected dr %u\n", |
990 | __func__, dr); | 1100 | __func__, dr); |
991 | *exception = UD_VECTOR; | 1101 | *exception = UD_VECTOR; |
@@ -1031,6 +1141,27 @@ static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1031 | return kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code); | 1141 | return kvm_mmu_page_fault(&svm->vcpu, fault_address, error_code); |
1032 | } | 1142 | } |
1033 | 1143 | ||
1144 | static int db_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1145 | { | ||
1146 | if (!(svm->vcpu.guest_debug & | ||
1147 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))) { | ||
1148 | kvm_queue_exception(&svm->vcpu, DB_VECTOR); | ||
1149 | return 1; | ||
1150 | } | ||
1151 | kvm_run->exit_reason = KVM_EXIT_DEBUG; | ||
1152 | kvm_run->debug.arch.pc = svm->vmcb->save.cs.base + svm->vmcb->save.rip; | ||
1153 | kvm_run->debug.arch.exception = DB_VECTOR; | ||
1154 | return 0; | ||
1155 | } | ||
1156 | |||
1157 | static int bp_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1158 | { | ||
1159 | kvm_run->exit_reason = KVM_EXIT_DEBUG; | ||
1160 | kvm_run->debug.arch.pc = svm->vmcb->save.cs.base + svm->vmcb->save.rip; | ||
1161 | kvm_run->debug.arch.exception = BP_VECTOR; | ||
1162 | return 0; | ||
1163 | } | ||
1164 | |||
1034 | static int ud_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1165 | static int ud_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
1035 | { | 1166 | { |
1036 | int er; | 1167 | int er; |
@@ -1080,7 +1211,7 @@ static int shutdown_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1080 | static int io_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | 1211 | static int io_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) |
1081 | { | 1212 | { |
1082 | u32 io_info = svm->vmcb->control.exit_info_1; /* address size bug? */ | 1213 | u32 io_info = svm->vmcb->control.exit_info_1; /* address size bug? */ |
1083 | int size, down, in, string, rep; | 1214 | int size, in, string; |
1084 | unsigned port; | 1215 | unsigned port; |
1085 | 1216 | ||
1086 | ++svm->vcpu.stat.io_exits; | 1217 | ++svm->vcpu.stat.io_exits; |
@@ -1099,8 +1230,6 @@ static int io_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1099 | in = (io_info & SVM_IOIO_TYPE_MASK) != 0; | 1230 | in = (io_info & SVM_IOIO_TYPE_MASK) != 0; |
1100 | port = io_info >> 16; | 1231 | port = io_info >> 16; |
1101 | size = (io_info & SVM_IOIO_SIZE_MASK) >> SVM_IOIO_SIZE_SHIFT; | 1232 | size = (io_info & SVM_IOIO_SIZE_MASK) >> SVM_IOIO_SIZE_SHIFT; |
1102 | rep = (io_info & SVM_IOIO_REP_MASK) != 0; | ||
1103 | down = (svm->vmcb->save.rflags & X86_EFLAGS_DF) != 0; | ||
1104 | 1233 | ||
1105 | skip_emulated_instruction(&svm->vcpu); | 1234 | skip_emulated_instruction(&svm->vcpu); |
1106 | return kvm_emulate_pio(&svm->vcpu, kvm_run, in, size, port); | 1235 | return kvm_emulate_pio(&svm->vcpu, kvm_run, in, size, port); |
@@ -1139,6 +1268,567 @@ static int vmmcall_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | |||
1139 | return 1; | 1268 | return 1; |
1140 | } | 1269 | } |
1141 | 1270 | ||
1271 | static int nested_svm_check_permissions(struct vcpu_svm *svm) | ||
1272 | { | ||
1273 | if (!(svm->vcpu.arch.shadow_efer & EFER_SVME) | ||
1274 | || !is_paging(&svm->vcpu)) { | ||
1275 | kvm_queue_exception(&svm->vcpu, UD_VECTOR); | ||
1276 | return 1; | ||
1277 | } | ||
1278 | |||
1279 | if (svm->vmcb->save.cpl) { | ||
1280 | kvm_inject_gp(&svm->vcpu, 0); | ||
1281 | return 1; | ||
1282 | } | ||
1283 | |||
1284 | return 0; | ||
1285 | } | ||
1286 | |||
1287 | static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr, | ||
1288 | bool has_error_code, u32 error_code) | ||
1289 | { | ||
1290 | if (is_nested(svm)) { | ||
1291 | svm->vmcb->control.exit_code = SVM_EXIT_EXCP_BASE + nr; | ||
1292 | svm->vmcb->control.exit_code_hi = 0; | ||
1293 | svm->vmcb->control.exit_info_1 = error_code; | ||
1294 | svm->vmcb->control.exit_info_2 = svm->vcpu.arch.cr2; | ||
1295 | if (nested_svm_exit_handled(svm, false)) { | ||
1296 | nsvm_printk("VMexit -> EXCP 0x%x\n", nr); | ||
1297 | |||
1298 | nested_svm_vmexit(svm); | ||
1299 | return 1; | ||
1300 | } | ||
1301 | } | ||
1302 | |||
1303 | return 0; | ||
1304 | } | ||
1305 | |||
1306 | static inline int nested_svm_intr(struct vcpu_svm *svm) | ||
1307 | { | ||
1308 | if (is_nested(svm)) { | ||
1309 | if (!(svm->vcpu.arch.hflags & HF_VINTR_MASK)) | ||
1310 | return 0; | ||
1311 | |||
1312 | if (!(svm->vcpu.arch.hflags & HF_HIF_MASK)) | ||
1313 | return 0; | ||
1314 | |||
1315 | svm->vmcb->control.exit_code = SVM_EXIT_INTR; | ||
1316 | |||
1317 | if (nested_svm_exit_handled(svm, false)) { | ||
1318 | nsvm_printk("VMexit -> INTR\n"); | ||
1319 | nested_svm_vmexit(svm); | ||
1320 | return 1; | ||
1321 | } | ||
1322 | } | ||
1323 | |||
1324 | return 0; | ||
1325 | } | ||
1326 | |||
1327 | static struct page *nested_svm_get_page(struct vcpu_svm *svm, u64 gpa) | ||
1328 | { | ||
1329 | struct page *page; | ||
1330 | |||
1331 | down_read(¤t->mm->mmap_sem); | ||
1332 | page = gfn_to_page(svm->vcpu.kvm, gpa >> PAGE_SHIFT); | ||
1333 | up_read(¤t->mm->mmap_sem); | ||
1334 | |||
1335 | if (is_error_page(page)) { | ||
1336 | printk(KERN_INFO "%s: could not find page at 0x%llx\n", | ||
1337 | __func__, gpa); | ||
1338 | kvm_release_page_clean(page); | ||
1339 | kvm_inject_gp(&svm->vcpu, 0); | ||
1340 | return NULL; | ||
1341 | } | ||
1342 | return page; | ||
1343 | } | ||
1344 | |||
1345 | static int nested_svm_do(struct vcpu_svm *svm, | ||
1346 | u64 arg1_gpa, u64 arg2_gpa, void *opaque, | ||
1347 | int (*handler)(struct vcpu_svm *svm, | ||
1348 | void *arg1, | ||
1349 | void *arg2, | ||
1350 | void *opaque)) | ||
1351 | { | ||
1352 | struct page *arg1_page; | ||
1353 | struct page *arg2_page = NULL; | ||
1354 | void *arg1; | ||
1355 | void *arg2 = NULL; | ||
1356 | int retval; | ||
1357 | |||
1358 | arg1_page = nested_svm_get_page(svm, arg1_gpa); | ||
1359 | if(arg1_page == NULL) | ||
1360 | return 1; | ||
1361 | |||
1362 | if (arg2_gpa) { | ||
1363 | arg2_page = nested_svm_get_page(svm, arg2_gpa); | ||
1364 | if(arg2_page == NULL) { | ||
1365 | kvm_release_page_clean(arg1_page); | ||
1366 | return 1; | ||
1367 | } | ||
1368 | } | ||
1369 | |||
1370 | arg1 = kmap_atomic(arg1_page, KM_USER0); | ||
1371 | if (arg2_gpa) | ||
1372 | arg2 = kmap_atomic(arg2_page, KM_USER1); | ||
1373 | |||
1374 | retval = handler(svm, arg1, arg2, opaque); | ||
1375 | |||
1376 | kunmap_atomic(arg1, KM_USER0); | ||
1377 | if (arg2_gpa) | ||
1378 | kunmap_atomic(arg2, KM_USER1); | ||
1379 | |||
1380 | kvm_release_page_dirty(arg1_page); | ||
1381 | if (arg2_gpa) | ||
1382 | kvm_release_page_dirty(arg2_page); | ||
1383 | |||
1384 | return retval; | ||
1385 | } | ||
1386 | |||
1387 | static int nested_svm_exit_handled_real(struct vcpu_svm *svm, | ||
1388 | void *arg1, | ||
1389 | void *arg2, | ||
1390 | void *opaque) | ||
1391 | { | ||
1392 | struct vmcb *nested_vmcb = (struct vmcb *)arg1; | ||
1393 | bool kvm_overrides = *(bool *)opaque; | ||
1394 | u32 exit_code = svm->vmcb->control.exit_code; | ||
1395 | |||
1396 | if (kvm_overrides) { | ||
1397 | switch (exit_code) { | ||
1398 | case SVM_EXIT_INTR: | ||
1399 | case SVM_EXIT_NMI: | ||
1400 | return 0; | ||
1401 | /* For now we are always handling NPFs when using them */ | ||
1402 | case SVM_EXIT_NPF: | ||
1403 | if (npt_enabled) | ||
1404 | return 0; | ||
1405 | break; | ||
1406 | /* When we're shadowing, trap PFs */ | ||
1407 | case SVM_EXIT_EXCP_BASE + PF_VECTOR: | ||
1408 | if (!npt_enabled) | ||
1409 | return 0; | ||
1410 | break; | ||
1411 | default: | ||
1412 | break; | ||
1413 | } | ||
1414 | } | ||
1415 | |||
1416 | switch (exit_code) { | ||
1417 | case SVM_EXIT_READ_CR0 ... SVM_EXIT_READ_CR8: { | ||
1418 | u32 cr_bits = 1 << (exit_code - SVM_EXIT_READ_CR0); | ||
1419 | if (nested_vmcb->control.intercept_cr_read & cr_bits) | ||
1420 | return 1; | ||
1421 | break; | ||
1422 | } | ||
1423 | case SVM_EXIT_WRITE_CR0 ... SVM_EXIT_WRITE_CR8: { | ||
1424 | u32 cr_bits = 1 << (exit_code - SVM_EXIT_WRITE_CR0); | ||
1425 | if (nested_vmcb->control.intercept_cr_write & cr_bits) | ||
1426 | return 1; | ||
1427 | break; | ||
1428 | } | ||
1429 | case SVM_EXIT_READ_DR0 ... SVM_EXIT_READ_DR7: { | ||
1430 | u32 dr_bits = 1 << (exit_code - SVM_EXIT_READ_DR0); | ||
1431 | if (nested_vmcb->control.intercept_dr_read & dr_bits) | ||
1432 | return 1; | ||
1433 | break; | ||
1434 | } | ||
1435 | case SVM_EXIT_WRITE_DR0 ... SVM_EXIT_WRITE_DR7: { | ||
1436 | u32 dr_bits = 1 << (exit_code - SVM_EXIT_WRITE_DR0); | ||
1437 | if (nested_vmcb->control.intercept_dr_write & dr_bits) | ||
1438 | return 1; | ||
1439 | break; | ||
1440 | } | ||
1441 | case SVM_EXIT_EXCP_BASE ... SVM_EXIT_EXCP_BASE + 0x1f: { | ||
1442 | u32 excp_bits = 1 << (exit_code - SVM_EXIT_EXCP_BASE); | ||
1443 | if (nested_vmcb->control.intercept_exceptions & excp_bits) | ||
1444 | return 1; | ||
1445 | break; | ||
1446 | } | ||
1447 | default: { | ||
1448 | u64 exit_bits = 1ULL << (exit_code - SVM_EXIT_INTR); | ||
1449 | nsvm_printk("exit code: 0x%x\n", exit_code); | ||
1450 | if (nested_vmcb->control.intercept & exit_bits) | ||
1451 | return 1; | ||
1452 | } | ||
1453 | } | ||
1454 | |||
1455 | return 0; | ||
1456 | } | ||
1457 | |||
1458 | static int nested_svm_exit_handled_msr(struct vcpu_svm *svm, | ||
1459 | void *arg1, void *arg2, | ||
1460 | void *opaque) | ||
1461 | { | ||
1462 | struct vmcb *nested_vmcb = (struct vmcb *)arg1; | ||
1463 | u8 *msrpm = (u8 *)arg2; | ||
1464 | u32 t0, t1; | ||
1465 | u32 msr = svm->vcpu.arch.regs[VCPU_REGS_RCX]; | ||
1466 | u32 param = svm->vmcb->control.exit_info_1 & 1; | ||
1467 | |||
1468 | if (!(nested_vmcb->control.intercept & (1ULL << INTERCEPT_MSR_PROT))) | ||
1469 | return 0; | ||
1470 | |||
1471 | switch(msr) { | ||
1472 | case 0 ... 0x1fff: | ||
1473 | t0 = (msr * 2) % 8; | ||
1474 | t1 = msr / 8; | ||
1475 | break; | ||
1476 | case 0xc0000000 ... 0xc0001fff: | ||
1477 | t0 = (8192 + msr - 0xc0000000) * 2; | ||
1478 | t1 = (t0 / 8); | ||
1479 | t0 %= 8; | ||
1480 | break; | ||
1481 | case 0xc0010000 ... 0xc0011fff: | ||
1482 | t0 = (16384 + msr - 0xc0010000) * 2; | ||
1483 | t1 = (t0 / 8); | ||
1484 | t0 %= 8; | ||
1485 | break; | ||
1486 | default: | ||
1487 | return 1; | ||
1488 | break; | ||
1489 | } | ||
1490 | if (msrpm[t1] & ((1 << param) << t0)) | ||
1491 | return 1; | ||
1492 | |||
1493 | return 0; | ||
1494 | } | ||
1495 | |||
1496 | static int nested_svm_exit_handled(struct vcpu_svm *svm, bool kvm_override) | ||
1497 | { | ||
1498 | bool k = kvm_override; | ||
1499 | |||
1500 | switch (svm->vmcb->control.exit_code) { | ||
1501 | case SVM_EXIT_MSR: | ||
1502 | return nested_svm_do(svm, svm->nested_vmcb, | ||
1503 | svm->nested_vmcb_msrpm, NULL, | ||
1504 | nested_svm_exit_handled_msr); | ||
1505 | default: break; | ||
1506 | } | ||
1507 | |||
1508 | return nested_svm_do(svm, svm->nested_vmcb, 0, &k, | ||
1509 | nested_svm_exit_handled_real); | ||
1510 | } | ||
1511 | |||
1512 | static int nested_svm_vmexit_real(struct vcpu_svm *svm, void *arg1, | ||
1513 | void *arg2, void *opaque) | ||
1514 | { | ||
1515 | struct vmcb *nested_vmcb = (struct vmcb *)arg1; | ||
1516 | struct vmcb *hsave = svm->hsave; | ||
1517 | u64 nested_save[] = { nested_vmcb->save.cr0, | ||
1518 | nested_vmcb->save.cr3, | ||
1519 | nested_vmcb->save.cr4, | ||
1520 | nested_vmcb->save.efer, | ||
1521 | nested_vmcb->control.intercept_cr_read, | ||
1522 | nested_vmcb->control.intercept_cr_write, | ||
1523 | nested_vmcb->control.intercept_dr_read, | ||
1524 | nested_vmcb->control.intercept_dr_write, | ||
1525 | nested_vmcb->control.intercept_exceptions, | ||
1526 | nested_vmcb->control.intercept, | ||
1527 | nested_vmcb->control.msrpm_base_pa, | ||
1528 | nested_vmcb->control.iopm_base_pa, | ||
1529 | nested_vmcb->control.tsc_offset }; | ||
1530 | |||
1531 | /* Give the current vmcb to the guest */ | ||
1532 | memcpy(nested_vmcb, svm->vmcb, sizeof(struct vmcb)); | ||
1533 | nested_vmcb->save.cr0 = nested_save[0]; | ||
1534 | if (!npt_enabled) | ||
1535 | nested_vmcb->save.cr3 = nested_save[1]; | ||
1536 | nested_vmcb->save.cr4 = nested_save[2]; | ||
1537 | nested_vmcb->save.efer = nested_save[3]; | ||
1538 | nested_vmcb->control.intercept_cr_read = nested_save[4]; | ||
1539 | nested_vmcb->control.intercept_cr_write = nested_save[5]; | ||
1540 | nested_vmcb->control.intercept_dr_read = nested_save[6]; | ||
1541 | nested_vmcb->control.intercept_dr_write = nested_save[7]; | ||
1542 | nested_vmcb->control.intercept_exceptions = nested_save[8]; | ||
1543 | nested_vmcb->control.intercept = nested_save[9]; | ||
1544 | nested_vmcb->control.msrpm_base_pa = nested_save[10]; | ||
1545 | nested_vmcb->control.iopm_base_pa = nested_save[11]; | ||
1546 | nested_vmcb->control.tsc_offset = nested_save[12]; | ||
1547 | |||
1548 | /* We always set V_INTR_MASKING and remember the old value in hflags */ | ||
1549 | if (!(svm->vcpu.arch.hflags & HF_VINTR_MASK)) | ||
1550 | nested_vmcb->control.int_ctl &= ~V_INTR_MASKING_MASK; | ||
1551 | |||
1552 | if ((nested_vmcb->control.int_ctl & V_IRQ_MASK) && | ||
1553 | (nested_vmcb->control.int_vector)) { | ||
1554 | nsvm_printk("WARNING: IRQ 0x%x still enabled on #VMEXIT\n", | ||
1555 | nested_vmcb->control.int_vector); | ||
1556 | } | ||
1557 | |||
1558 | /* Restore the original control entries */ | ||
1559 | svm->vmcb->control = hsave->control; | ||
1560 | |||
1561 | /* Kill any pending exceptions */ | ||
1562 | if (svm->vcpu.arch.exception.pending == true) | ||
1563 | nsvm_printk("WARNING: Pending Exception\n"); | ||
1564 | svm->vcpu.arch.exception.pending = false; | ||
1565 | |||
1566 | /* Restore selected save entries */ | ||
1567 | svm->vmcb->save.es = hsave->save.es; | ||
1568 | svm->vmcb->save.cs = hsave->save.cs; | ||
1569 | svm->vmcb->save.ss = hsave->save.ss; | ||
1570 | svm->vmcb->save.ds = hsave->save.ds; | ||
1571 | svm->vmcb->save.gdtr = hsave->save.gdtr; | ||
1572 | svm->vmcb->save.idtr = hsave->save.idtr; | ||
1573 | svm->vmcb->save.rflags = hsave->save.rflags; | ||
1574 | svm_set_efer(&svm->vcpu, hsave->save.efer); | ||
1575 | svm_set_cr0(&svm->vcpu, hsave->save.cr0 | X86_CR0_PE); | ||
1576 | svm_set_cr4(&svm->vcpu, hsave->save.cr4); | ||
1577 | if (npt_enabled) { | ||
1578 | svm->vmcb->save.cr3 = hsave->save.cr3; | ||
1579 | svm->vcpu.arch.cr3 = hsave->save.cr3; | ||
1580 | } else { | ||
1581 | kvm_set_cr3(&svm->vcpu, hsave->save.cr3); | ||
1582 | } | ||
1583 | kvm_register_write(&svm->vcpu, VCPU_REGS_RAX, hsave->save.rax); | ||
1584 | kvm_register_write(&svm->vcpu, VCPU_REGS_RSP, hsave->save.rsp); | ||
1585 | kvm_register_write(&svm->vcpu, VCPU_REGS_RIP, hsave->save.rip); | ||
1586 | svm->vmcb->save.dr7 = 0; | ||
1587 | svm->vmcb->save.cpl = 0; | ||
1588 | svm->vmcb->control.exit_int_info = 0; | ||
1589 | |||
1590 | svm->vcpu.arch.hflags &= ~HF_GIF_MASK; | ||
1591 | /* Exit nested SVM mode */ | ||
1592 | svm->nested_vmcb = 0; | ||
1593 | |||
1594 | return 0; | ||
1595 | } | ||
1596 | |||
1597 | static int nested_svm_vmexit(struct vcpu_svm *svm) | ||
1598 | { | ||
1599 | nsvm_printk("VMexit\n"); | ||
1600 | if (nested_svm_do(svm, svm->nested_vmcb, 0, | ||
1601 | NULL, nested_svm_vmexit_real)) | ||
1602 | return 1; | ||
1603 | |||
1604 | kvm_mmu_reset_context(&svm->vcpu); | ||
1605 | kvm_mmu_load(&svm->vcpu); | ||
1606 | |||
1607 | return 0; | ||
1608 | } | ||
1609 | |||
1610 | static int nested_svm_vmrun_msrpm(struct vcpu_svm *svm, void *arg1, | ||
1611 | void *arg2, void *opaque) | ||
1612 | { | ||
1613 | int i; | ||
1614 | u32 *nested_msrpm = (u32*)arg1; | ||
1615 | for (i=0; i< PAGE_SIZE * (1 << MSRPM_ALLOC_ORDER) / 4; i++) | ||
1616 | svm->nested_msrpm[i] = svm->msrpm[i] | nested_msrpm[i]; | ||
1617 | svm->vmcb->control.msrpm_base_pa = __pa(svm->nested_msrpm); | ||
1618 | |||
1619 | return 0; | ||
1620 | } | ||
1621 | |||
1622 | static int nested_svm_vmrun(struct vcpu_svm *svm, void *arg1, | ||
1623 | void *arg2, void *opaque) | ||
1624 | { | ||
1625 | struct vmcb *nested_vmcb = (struct vmcb *)arg1; | ||
1626 | struct vmcb *hsave = svm->hsave; | ||
1627 | |||
1628 | /* nested_vmcb is our indicator if nested SVM is activated */ | ||
1629 | svm->nested_vmcb = svm->vmcb->save.rax; | ||
1630 | |||
1631 | /* Clear internal status */ | ||
1632 | svm->vcpu.arch.exception.pending = false; | ||
1633 | |||
1634 | /* Save the old vmcb, so we don't need to pick what we save, but | ||
1635 | can restore everything when a VMEXIT occurs */ | ||
1636 | memcpy(hsave, svm->vmcb, sizeof(struct vmcb)); | ||
1637 | /* We need to remember the original CR3 in the SPT case */ | ||
1638 | if (!npt_enabled) | ||
1639 | hsave->save.cr3 = svm->vcpu.arch.cr3; | ||
1640 | hsave->save.cr4 = svm->vcpu.arch.cr4; | ||
1641 | hsave->save.rip = svm->next_rip; | ||
1642 | |||
1643 | if (svm->vmcb->save.rflags & X86_EFLAGS_IF) | ||
1644 | svm->vcpu.arch.hflags |= HF_HIF_MASK; | ||
1645 | else | ||
1646 | svm->vcpu.arch.hflags &= ~HF_HIF_MASK; | ||
1647 | |||
1648 | /* Load the nested guest state */ | ||
1649 | svm->vmcb->save.es = nested_vmcb->save.es; | ||
1650 | svm->vmcb->save.cs = nested_vmcb->save.cs; | ||
1651 | svm->vmcb->save.ss = nested_vmcb->save.ss; | ||
1652 | svm->vmcb->save.ds = nested_vmcb->save.ds; | ||
1653 | svm->vmcb->save.gdtr = nested_vmcb->save.gdtr; | ||
1654 | svm->vmcb->save.idtr = nested_vmcb->save.idtr; | ||
1655 | svm->vmcb->save.rflags = nested_vmcb->save.rflags; | ||
1656 | svm_set_efer(&svm->vcpu, nested_vmcb->save.efer); | ||
1657 | svm_set_cr0(&svm->vcpu, nested_vmcb->save.cr0); | ||
1658 | svm_set_cr4(&svm->vcpu, nested_vmcb->save.cr4); | ||
1659 | if (npt_enabled) { | ||
1660 | svm->vmcb->save.cr3 = nested_vmcb->save.cr3; | ||
1661 | svm->vcpu.arch.cr3 = nested_vmcb->save.cr3; | ||
1662 | } else { | ||
1663 | kvm_set_cr3(&svm->vcpu, nested_vmcb->save.cr3); | ||
1664 | kvm_mmu_reset_context(&svm->vcpu); | ||
1665 | } | ||
1666 | svm->vmcb->save.cr2 = nested_vmcb->save.cr2; | ||
1667 | kvm_register_write(&svm->vcpu, VCPU_REGS_RAX, nested_vmcb->save.rax); | ||
1668 | kvm_register_write(&svm->vcpu, VCPU_REGS_RSP, nested_vmcb->save.rsp); | ||
1669 | kvm_register_write(&svm->vcpu, VCPU_REGS_RIP, nested_vmcb->save.rip); | ||
1670 | /* In case we don't even reach vcpu_run, the fields are not updated */ | ||
1671 | svm->vmcb->save.rax = nested_vmcb->save.rax; | ||
1672 | svm->vmcb->save.rsp = nested_vmcb->save.rsp; | ||
1673 | svm->vmcb->save.rip = nested_vmcb->save.rip; | ||
1674 | svm->vmcb->save.dr7 = nested_vmcb->save.dr7; | ||
1675 | svm->vmcb->save.dr6 = nested_vmcb->save.dr6; | ||
1676 | svm->vmcb->save.cpl = nested_vmcb->save.cpl; | ||
1677 | |||
1678 | /* We don't want a nested guest to be more powerful than the guest, | ||
1679 | so all intercepts are ORed */ | ||
1680 | svm->vmcb->control.intercept_cr_read |= | ||
1681 | nested_vmcb->control.intercept_cr_read; | ||
1682 | svm->vmcb->control.intercept_cr_write |= | ||
1683 | nested_vmcb->control.intercept_cr_write; | ||
1684 | svm->vmcb->control.intercept_dr_read |= | ||
1685 | nested_vmcb->control.intercept_dr_read; | ||
1686 | svm->vmcb->control.intercept_dr_write |= | ||
1687 | nested_vmcb->control.intercept_dr_write; | ||
1688 | svm->vmcb->control.intercept_exceptions |= | ||
1689 | nested_vmcb->control.intercept_exceptions; | ||
1690 | |||
1691 | svm->vmcb->control.intercept |= nested_vmcb->control.intercept; | ||
1692 | |||
1693 | svm->nested_vmcb_msrpm = nested_vmcb->control.msrpm_base_pa; | ||
1694 | |||
1695 | force_new_asid(&svm->vcpu); | ||
1696 | svm->vmcb->control.exit_int_info = nested_vmcb->control.exit_int_info; | ||
1697 | svm->vmcb->control.exit_int_info_err = nested_vmcb->control.exit_int_info_err; | ||
1698 | svm->vmcb->control.int_ctl = nested_vmcb->control.int_ctl | V_INTR_MASKING_MASK; | ||
1699 | if (nested_vmcb->control.int_ctl & V_IRQ_MASK) { | ||
1700 | nsvm_printk("nSVM Injecting Interrupt: 0x%x\n", | ||
1701 | nested_vmcb->control.int_ctl); | ||
1702 | } | ||
1703 | if (nested_vmcb->control.int_ctl & V_INTR_MASKING_MASK) | ||
1704 | svm->vcpu.arch.hflags |= HF_VINTR_MASK; | ||
1705 | else | ||
1706 | svm->vcpu.arch.hflags &= ~HF_VINTR_MASK; | ||
1707 | |||
1708 | nsvm_printk("nSVM exit_int_info: 0x%x | int_state: 0x%x\n", | ||
1709 | nested_vmcb->control.exit_int_info, | ||
1710 | nested_vmcb->control.int_state); | ||
1711 | |||
1712 | svm->vmcb->control.int_vector = nested_vmcb->control.int_vector; | ||
1713 | svm->vmcb->control.int_state = nested_vmcb->control.int_state; | ||
1714 | svm->vmcb->control.tsc_offset += nested_vmcb->control.tsc_offset; | ||
1715 | if (nested_vmcb->control.event_inj & SVM_EVTINJ_VALID) | ||
1716 | nsvm_printk("Injecting Event: 0x%x\n", | ||
1717 | nested_vmcb->control.event_inj); | ||
1718 | svm->vmcb->control.event_inj = nested_vmcb->control.event_inj; | ||
1719 | svm->vmcb->control.event_inj_err = nested_vmcb->control.event_inj_err; | ||
1720 | |||
1721 | svm->vcpu.arch.hflags |= HF_GIF_MASK; | ||
1722 | |||
1723 | return 0; | ||
1724 | } | ||
1725 | |||
1726 | static int nested_svm_vmloadsave(struct vmcb *from_vmcb, struct vmcb *to_vmcb) | ||
1727 | { | ||
1728 | to_vmcb->save.fs = from_vmcb->save.fs; | ||
1729 | to_vmcb->save.gs = from_vmcb->save.gs; | ||
1730 | to_vmcb->save.tr = from_vmcb->save.tr; | ||
1731 | to_vmcb->save.ldtr = from_vmcb->save.ldtr; | ||
1732 | to_vmcb->save.kernel_gs_base = from_vmcb->save.kernel_gs_base; | ||
1733 | to_vmcb->save.star = from_vmcb->save.star; | ||
1734 | to_vmcb->save.lstar = from_vmcb->save.lstar; | ||
1735 | to_vmcb->save.cstar = from_vmcb->save.cstar; | ||
1736 | to_vmcb->save.sfmask = from_vmcb->save.sfmask; | ||
1737 | to_vmcb->save.sysenter_cs = from_vmcb->save.sysenter_cs; | ||
1738 | to_vmcb->save.sysenter_esp = from_vmcb->save.sysenter_esp; | ||
1739 | to_vmcb->save.sysenter_eip = from_vmcb->save.sysenter_eip; | ||
1740 | |||
1741 | return 1; | ||
1742 | } | ||
1743 | |||
1744 | static int nested_svm_vmload(struct vcpu_svm *svm, void *nested_vmcb, | ||
1745 | void *arg2, void *opaque) | ||
1746 | { | ||
1747 | return nested_svm_vmloadsave((struct vmcb *)nested_vmcb, svm->vmcb); | ||
1748 | } | ||
1749 | |||
1750 | static int nested_svm_vmsave(struct vcpu_svm *svm, void *nested_vmcb, | ||
1751 | void *arg2, void *opaque) | ||
1752 | { | ||
1753 | return nested_svm_vmloadsave(svm->vmcb, (struct vmcb *)nested_vmcb); | ||
1754 | } | ||
1755 | |||
1756 | static int vmload_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1757 | { | ||
1758 | if (nested_svm_check_permissions(svm)) | ||
1759 | return 1; | ||
1760 | |||
1761 | svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; | ||
1762 | skip_emulated_instruction(&svm->vcpu); | ||
1763 | |||
1764 | nested_svm_do(svm, svm->vmcb->save.rax, 0, NULL, nested_svm_vmload); | ||
1765 | |||
1766 | return 1; | ||
1767 | } | ||
1768 | |||
1769 | static int vmsave_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1770 | { | ||
1771 | if (nested_svm_check_permissions(svm)) | ||
1772 | return 1; | ||
1773 | |||
1774 | svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; | ||
1775 | skip_emulated_instruction(&svm->vcpu); | ||
1776 | |||
1777 | nested_svm_do(svm, svm->vmcb->save.rax, 0, NULL, nested_svm_vmsave); | ||
1778 | |||
1779 | return 1; | ||
1780 | } | ||
1781 | |||
1782 | static int vmrun_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1783 | { | ||
1784 | nsvm_printk("VMrun\n"); | ||
1785 | if (nested_svm_check_permissions(svm)) | ||
1786 | return 1; | ||
1787 | |||
1788 | svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; | ||
1789 | skip_emulated_instruction(&svm->vcpu); | ||
1790 | |||
1791 | if (nested_svm_do(svm, svm->vmcb->save.rax, 0, | ||
1792 | NULL, nested_svm_vmrun)) | ||
1793 | return 1; | ||
1794 | |||
1795 | if (nested_svm_do(svm, svm->nested_vmcb_msrpm, 0, | ||
1796 | NULL, nested_svm_vmrun_msrpm)) | ||
1797 | return 1; | ||
1798 | |||
1799 | return 1; | ||
1800 | } | ||
1801 | |||
1802 | static int stgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1803 | { | ||
1804 | if (nested_svm_check_permissions(svm)) | ||
1805 | return 1; | ||
1806 | |||
1807 | svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; | ||
1808 | skip_emulated_instruction(&svm->vcpu); | ||
1809 | |||
1810 | svm->vcpu.arch.hflags |= HF_GIF_MASK; | ||
1811 | |||
1812 | return 1; | ||
1813 | } | ||
1814 | |||
1815 | static int clgi_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) | ||
1816 | { | ||
1817 | if (nested_svm_check_permissions(svm)) | ||
1818 | return 1; | ||
1819 | |||
1820 | svm->next_rip = kvm_rip_read(&svm->vcpu) + 3; | ||
1821 | skip_emulated_instruction(&svm->vcpu); | ||
1822 | |||
1823 | svm->vcpu.arch.hflags &= ~HF_GIF_MASK; | ||
1824 | |||
1825 | /* After a CLGI no interrupts should come */ | ||
1826 | svm_clear_vintr(svm); | ||
1827 | svm->vmcb->control.int_ctl &= ~V_IRQ_MASK; | ||
1828 | |||
1829 | return 1; | ||
1830 | } | ||
1831 | |||
1142 | static int invalid_op_interception(struct vcpu_svm *svm, | 1832 | static int invalid_op_interception(struct vcpu_svm *svm, |
1143 | struct kvm_run *kvm_run) | 1833 | struct kvm_run *kvm_run) |
1144 | { | 1834 | { |
@@ -1250,6 +1940,15 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data) | |||
1250 | case MSR_IA32_LASTINTTOIP: | 1940 | case MSR_IA32_LASTINTTOIP: |
1251 | *data = svm->vmcb->save.last_excp_to; | 1941 | *data = svm->vmcb->save.last_excp_to; |
1252 | break; | 1942 | break; |
1943 | case MSR_VM_HSAVE_PA: | ||
1944 | *data = svm->hsave_msr; | ||
1945 | break; | ||
1946 | case MSR_VM_CR: | ||
1947 | *data = 0; | ||
1948 | break; | ||
1949 | case MSR_IA32_UCODE_REV: | ||
1950 | *data = 0x01000065; | ||
1951 | break; | ||
1253 | default: | 1952 | default: |
1254 | return kvm_get_msr_common(vcpu, ecx, data); | 1953 | return kvm_get_msr_common(vcpu, ecx, data); |
1255 | } | 1954 | } |
@@ -1344,6 +2043,9 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data) | |||
1344 | pr_unimpl(vcpu, "unimplemented perfctr wrmsr: 0x%x data 0x%llx\n", ecx, data); | 2043 | pr_unimpl(vcpu, "unimplemented perfctr wrmsr: 0x%x data 0x%llx\n", ecx, data); |
1345 | 2044 | ||
1346 | break; | 2045 | break; |
2046 | case MSR_VM_HSAVE_PA: | ||
2047 | svm->hsave_msr = data; | ||
2048 | break; | ||
1347 | default: | 2049 | default: |
1348 | return kvm_set_msr_common(vcpu, ecx, data); | 2050 | return kvm_set_msr_common(vcpu, ecx, data); |
1349 | } | 2051 | } |
@@ -1380,7 +2082,7 @@ static int interrupt_window_interception(struct vcpu_svm *svm, | |||
1380 | { | 2082 | { |
1381 | KVMTRACE_0D(PEND_INTR, &svm->vcpu, handler); | 2083 | KVMTRACE_0D(PEND_INTR, &svm->vcpu, handler); |
1382 | 2084 | ||
1383 | svm->vmcb->control.intercept &= ~(1ULL << INTERCEPT_VINTR); | 2085 | svm_clear_vintr(svm); |
1384 | svm->vmcb->control.int_ctl &= ~V_IRQ_MASK; | 2086 | svm->vmcb->control.int_ctl &= ~V_IRQ_MASK; |
1385 | /* | 2087 | /* |
1386 | * If the user space waits to inject interrupts, exit as soon as | 2088 | * If the user space waits to inject interrupts, exit as soon as |
@@ -1417,6 +2119,8 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm, | |||
1417 | [SVM_EXIT_WRITE_DR3] = emulate_on_interception, | 2119 | [SVM_EXIT_WRITE_DR3] = emulate_on_interception, |
1418 | [SVM_EXIT_WRITE_DR5] = emulate_on_interception, | 2120 | [SVM_EXIT_WRITE_DR5] = emulate_on_interception, |
1419 | [SVM_EXIT_WRITE_DR7] = emulate_on_interception, | 2121 | [SVM_EXIT_WRITE_DR7] = emulate_on_interception, |
2122 | [SVM_EXIT_EXCP_BASE + DB_VECTOR] = db_interception, | ||
2123 | [SVM_EXIT_EXCP_BASE + BP_VECTOR] = bp_interception, | ||
1420 | [SVM_EXIT_EXCP_BASE + UD_VECTOR] = ud_interception, | 2124 | [SVM_EXIT_EXCP_BASE + UD_VECTOR] = ud_interception, |
1421 | [SVM_EXIT_EXCP_BASE + PF_VECTOR] = pf_interception, | 2125 | [SVM_EXIT_EXCP_BASE + PF_VECTOR] = pf_interception, |
1422 | [SVM_EXIT_EXCP_BASE + NM_VECTOR] = nm_interception, | 2126 | [SVM_EXIT_EXCP_BASE + NM_VECTOR] = nm_interception, |
@@ -1436,12 +2140,12 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm, | |||
1436 | [SVM_EXIT_MSR] = msr_interception, | 2140 | [SVM_EXIT_MSR] = msr_interception, |
1437 | [SVM_EXIT_TASK_SWITCH] = task_switch_interception, | 2141 | [SVM_EXIT_TASK_SWITCH] = task_switch_interception, |
1438 | [SVM_EXIT_SHUTDOWN] = shutdown_interception, | 2142 | [SVM_EXIT_SHUTDOWN] = shutdown_interception, |
1439 | [SVM_EXIT_VMRUN] = invalid_op_interception, | 2143 | [SVM_EXIT_VMRUN] = vmrun_interception, |
1440 | [SVM_EXIT_VMMCALL] = vmmcall_interception, | 2144 | [SVM_EXIT_VMMCALL] = vmmcall_interception, |
1441 | [SVM_EXIT_VMLOAD] = invalid_op_interception, | 2145 | [SVM_EXIT_VMLOAD] = vmload_interception, |
1442 | [SVM_EXIT_VMSAVE] = invalid_op_interception, | 2146 | [SVM_EXIT_VMSAVE] = vmsave_interception, |
1443 | [SVM_EXIT_STGI] = invalid_op_interception, | 2147 | [SVM_EXIT_STGI] = stgi_interception, |
1444 | [SVM_EXIT_CLGI] = invalid_op_interception, | 2148 | [SVM_EXIT_CLGI] = clgi_interception, |
1445 | [SVM_EXIT_SKINIT] = invalid_op_interception, | 2149 | [SVM_EXIT_SKINIT] = invalid_op_interception, |
1446 | [SVM_EXIT_WBINVD] = emulate_on_interception, | 2150 | [SVM_EXIT_WBINVD] = emulate_on_interception, |
1447 | [SVM_EXIT_MONITOR] = invalid_op_interception, | 2151 | [SVM_EXIT_MONITOR] = invalid_op_interception, |
@@ -1457,6 +2161,17 @@ static int handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
1457 | KVMTRACE_3D(VMEXIT, vcpu, exit_code, (u32)svm->vmcb->save.rip, | 2161 | KVMTRACE_3D(VMEXIT, vcpu, exit_code, (u32)svm->vmcb->save.rip, |
1458 | (u32)((u64)svm->vmcb->save.rip >> 32), entryexit); | 2162 | (u32)((u64)svm->vmcb->save.rip >> 32), entryexit); |
1459 | 2163 | ||
2164 | if (is_nested(svm)) { | ||
2165 | nsvm_printk("nested handle_exit: 0x%x | 0x%lx | 0x%lx | 0x%lx\n", | ||
2166 | exit_code, svm->vmcb->control.exit_info_1, | ||
2167 | svm->vmcb->control.exit_info_2, svm->vmcb->save.rip); | ||
2168 | if (nested_svm_exit_handled(svm, true)) { | ||
2169 | nested_svm_vmexit(svm); | ||
2170 | nsvm_printk("-> #VMEXIT\n"); | ||
2171 | return 1; | ||
2172 | } | ||
2173 | } | ||
2174 | |||
1460 | if (npt_enabled) { | 2175 | if (npt_enabled) { |
1461 | int mmu_reload = 0; | 2176 | int mmu_reload = 0; |
1462 | if ((vcpu->arch.cr0 ^ svm->vmcb->save.cr0) & X86_CR0_PG) { | 2177 | if ((vcpu->arch.cr0 ^ svm->vmcb->save.cr0) & X86_CR0_PG) { |
@@ -1544,6 +2259,8 @@ static void svm_set_irq(struct kvm_vcpu *vcpu, int irq) | |||
1544 | { | 2259 | { |
1545 | struct vcpu_svm *svm = to_svm(vcpu); | 2260 | struct vcpu_svm *svm = to_svm(vcpu); |
1546 | 2261 | ||
2262 | nested_svm_intr(svm); | ||
2263 | |||
1547 | svm_inject_irq(svm, irq); | 2264 | svm_inject_irq(svm, irq); |
1548 | } | 2265 | } |
1549 | 2266 | ||
@@ -1589,11 +2306,17 @@ static void svm_intr_assist(struct kvm_vcpu *vcpu) | |||
1589 | if (!kvm_cpu_has_interrupt(vcpu)) | 2306 | if (!kvm_cpu_has_interrupt(vcpu)) |
1590 | goto out; | 2307 | goto out; |
1591 | 2308 | ||
2309 | if (nested_svm_intr(svm)) | ||
2310 | goto out; | ||
2311 | |||
2312 | if (!(svm->vcpu.arch.hflags & HF_GIF_MASK)) | ||
2313 | goto out; | ||
2314 | |||
1592 | if (!(vmcb->save.rflags & X86_EFLAGS_IF) || | 2315 | if (!(vmcb->save.rflags & X86_EFLAGS_IF) || |
1593 | (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) || | 2316 | (vmcb->control.int_state & SVM_INTERRUPT_SHADOW_MASK) || |
1594 | (vmcb->control.event_inj & SVM_EVTINJ_VALID)) { | 2317 | (vmcb->control.event_inj & SVM_EVTINJ_VALID)) { |
1595 | /* unable to deliver irq, set pending irq */ | 2318 | /* unable to deliver irq, set pending irq */ |
1596 | vmcb->control.intercept |= (1ULL << INTERCEPT_VINTR); | 2319 | svm_set_vintr(svm); |
1597 | svm_inject_irq(svm, 0x0); | 2320 | svm_inject_irq(svm, 0x0); |
1598 | goto out; | 2321 | goto out; |
1599 | } | 2322 | } |
@@ -1615,7 +2338,8 @@ static void kvm_reput_irq(struct vcpu_svm *svm) | |||
1615 | } | 2338 | } |
1616 | 2339 | ||
1617 | svm->vcpu.arch.interrupt_window_open = | 2340 | svm->vcpu.arch.interrupt_window_open = |
1618 | !(control->int_state & SVM_INTERRUPT_SHADOW_MASK); | 2341 | !(control->int_state & SVM_INTERRUPT_SHADOW_MASK) && |
2342 | (svm->vcpu.arch.hflags & HF_GIF_MASK); | ||
1619 | } | 2343 | } |
1620 | 2344 | ||
1621 | static void svm_do_inject_vector(struct vcpu_svm *svm) | 2345 | static void svm_do_inject_vector(struct vcpu_svm *svm) |
@@ -1637,9 +2361,13 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu, | |||
1637 | struct vcpu_svm *svm = to_svm(vcpu); | 2361 | struct vcpu_svm *svm = to_svm(vcpu); |
1638 | struct vmcb_control_area *control = &svm->vmcb->control; | 2362 | struct vmcb_control_area *control = &svm->vmcb->control; |
1639 | 2363 | ||
2364 | if (nested_svm_intr(svm)) | ||
2365 | return; | ||
2366 | |||
1640 | svm->vcpu.arch.interrupt_window_open = | 2367 | svm->vcpu.arch.interrupt_window_open = |
1641 | (!(control->int_state & SVM_INTERRUPT_SHADOW_MASK) && | 2368 | (!(control->int_state & SVM_INTERRUPT_SHADOW_MASK) && |
1642 | (svm->vmcb->save.rflags & X86_EFLAGS_IF)); | 2369 | (svm->vmcb->save.rflags & X86_EFLAGS_IF) && |
2370 | (svm->vcpu.arch.hflags & HF_GIF_MASK)); | ||
1643 | 2371 | ||
1644 | if (svm->vcpu.arch.interrupt_window_open && svm->vcpu.arch.irq_summary) | 2372 | if (svm->vcpu.arch.interrupt_window_open && svm->vcpu.arch.irq_summary) |
1645 | /* | 2373 | /* |
@@ -1652,9 +2380,9 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu, | |||
1652 | */ | 2380 | */ |
1653 | if (!svm->vcpu.arch.interrupt_window_open && | 2381 | if (!svm->vcpu.arch.interrupt_window_open && |
1654 | (svm->vcpu.arch.irq_summary || kvm_run->request_interrupt_window)) | 2382 | (svm->vcpu.arch.irq_summary || kvm_run->request_interrupt_window)) |
1655 | control->intercept |= 1ULL << INTERCEPT_VINTR; | 2383 | svm_set_vintr(svm); |
1656 | else | 2384 | else |
1657 | control->intercept &= ~(1ULL << INTERCEPT_VINTR); | 2385 | svm_clear_vintr(svm); |
1658 | } | 2386 | } |
1659 | 2387 | ||
1660 | static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) | 2388 | static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) |
@@ -1662,22 +2390,6 @@ static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr) | |||
1662 | return 0; | 2390 | return 0; |
1663 | } | 2391 | } |
1664 | 2392 | ||
1665 | static void save_db_regs(unsigned long *db_regs) | ||
1666 | { | ||
1667 | asm volatile ("mov %%dr0, %0" : "=r"(db_regs[0])); | ||
1668 | asm volatile ("mov %%dr1, %0" : "=r"(db_regs[1])); | ||
1669 | asm volatile ("mov %%dr2, %0" : "=r"(db_regs[2])); | ||
1670 | asm volatile ("mov %%dr3, %0" : "=r"(db_regs[3])); | ||
1671 | } | ||
1672 | |||
1673 | static void load_db_regs(unsigned long *db_regs) | ||
1674 | { | ||
1675 | asm volatile ("mov %0, %%dr0" : : "r"(db_regs[0])); | ||
1676 | asm volatile ("mov %0, %%dr1" : : "r"(db_regs[1])); | ||
1677 | asm volatile ("mov %0, %%dr2" : : "r"(db_regs[2])); | ||
1678 | asm volatile ("mov %0, %%dr3" : : "r"(db_regs[3])); | ||
1679 | } | ||
1680 | |||
1681 | static void svm_flush_tlb(struct kvm_vcpu *vcpu) | 2393 | static void svm_flush_tlb(struct kvm_vcpu *vcpu) |
1682 | { | 2394 | { |
1683 | force_new_asid(vcpu); | 2395 | force_new_asid(vcpu); |
@@ -1736,19 +2448,12 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1736 | gs_selector = kvm_read_gs(); | 2448 | gs_selector = kvm_read_gs(); |
1737 | ldt_selector = kvm_read_ldt(); | 2449 | ldt_selector = kvm_read_ldt(); |
1738 | svm->host_cr2 = kvm_read_cr2(); | 2450 | svm->host_cr2 = kvm_read_cr2(); |
1739 | svm->host_dr6 = read_dr6(); | 2451 | if (!is_nested(svm)) |
1740 | svm->host_dr7 = read_dr7(); | 2452 | svm->vmcb->save.cr2 = vcpu->arch.cr2; |
1741 | svm->vmcb->save.cr2 = vcpu->arch.cr2; | ||
1742 | /* required for live migration with NPT */ | 2453 | /* required for live migration with NPT */ |
1743 | if (npt_enabled) | 2454 | if (npt_enabled) |
1744 | svm->vmcb->save.cr3 = vcpu->arch.cr3; | 2455 | svm->vmcb->save.cr3 = vcpu->arch.cr3; |
1745 | 2456 | ||
1746 | if (svm->vmcb->save.dr7 & 0xff) { | ||
1747 | write_dr7(0); | ||
1748 | save_db_regs(svm->host_db_regs); | ||
1749 | load_db_regs(svm->db_regs); | ||
1750 | } | ||
1751 | |||
1752 | clgi(); | 2457 | clgi(); |
1753 | 2458 | ||
1754 | local_irq_enable(); | 2459 | local_irq_enable(); |
@@ -1824,16 +2529,11 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
1824 | #endif | 2529 | #endif |
1825 | ); | 2530 | ); |
1826 | 2531 | ||
1827 | if ((svm->vmcb->save.dr7 & 0xff)) | ||
1828 | load_db_regs(svm->host_db_regs); | ||
1829 | |||
1830 | vcpu->arch.cr2 = svm->vmcb->save.cr2; | 2532 | vcpu->arch.cr2 = svm->vmcb->save.cr2; |
1831 | vcpu->arch.regs[VCPU_REGS_RAX] = svm->vmcb->save.rax; | 2533 | vcpu->arch.regs[VCPU_REGS_RAX] = svm->vmcb->save.rax; |
1832 | vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; | 2534 | vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; |
1833 | vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; | 2535 | vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; |
1834 | 2536 | ||
1835 | write_dr6(svm->host_dr6); | ||
1836 | write_dr7(svm->host_dr7); | ||
1837 | kvm_write_cr2(svm->host_cr2); | 2537 | kvm_write_cr2(svm->host_cr2); |
1838 | 2538 | ||
1839 | kvm_load_fs(fs_selector); | 2539 | kvm_load_fs(fs_selector); |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 7611af576829..bb481330716f 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -91,6 +91,7 @@ struct vcpu_vmx { | |||
91 | } rmode; | 91 | } rmode; |
92 | int vpid; | 92 | int vpid; |
93 | bool emulation_required; | 93 | bool emulation_required; |
94 | enum emulation_result invalid_state_emulation_result; | ||
94 | 95 | ||
95 | /* Support for vnmi-less CPUs */ | 96 | /* Support for vnmi-less CPUs */ |
96 | int soft_vnmi_blocked; | 97 | int soft_vnmi_blocked; |
@@ -189,21 +190,21 @@ static inline int is_page_fault(u32 intr_info) | |||
189 | { | 190 | { |
190 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | | 191 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | |
191 | INTR_INFO_VALID_MASK)) == | 192 | INTR_INFO_VALID_MASK)) == |
192 | (INTR_TYPE_EXCEPTION | PF_VECTOR | INTR_INFO_VALID_MASK); | 193 | (INTR_TYPE_HARD_EXCEPTION | PF_VECTOR | INTR_INFO_VALID_MASK); |
193 | } | 194 | } |
194 | 195 | ||
195 | static inline int is_no_device(u32 intr_info) | 196 | static inline int is_no_device(u32 intr_info) |
196 | { | 197 | { |
197 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | | 198 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | |
198 | INTR_INFO_VALID_MASK)) == | 199 | INTR_INFO_VALID_MASK)) == |
199 | (INTR_TYPE_EXCEPTION | NM_VECTOR | INTR_INFO_VALID_MASK); | 200 | (INTR_TYPE_HARD_EXCEPTION | NM_VECTOR | INTR_INFO_VALID_MASK); |
200 | } | 201 | } |
201 | 202 | ||
202 | static inline int is_invalid_opcode(u32 intr_info) | 203 | static inline int is_invalid_opcode(u32 intr_info) |
203 | { | 204 | { |
204 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | | 205 | return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK | |
205 | INTR_INFO_VALID_MASK)) == | 206 | INTR_INFO_VALID_MASK)) == |
206 | (INTR_TYPE_EXCEPTION | UD_VECTOR | INTR_INFO_VALID_MASK); | 207 | (INTR_TYPE_HARD_EXCEPTION | UD_VECTOR | INTR_INFO_VALID_MASK); |
207 | } | 208 | } |
208 | 209 | ||
209 | static inline int is_external_interrupt(u32 intr_info) | 210 | static inline int is_external_interrupt(u32 intr_info) |
@@ -480,8 +481,13 @@ static void update_exception_bitmap(struct kvm_vcpu *vcpu) | |||
480 | eb = (1u << PF_VECTOR) | (1u << UD_VECTOR); | 481 | eb = (1u << PF_VECTOR) | (1u << UD_VECTOR); |
481 | if (!vcpu->fpu_active) | 482 | if (!vcpu->fpu_active) |
482 | eb |= 1u << NM_VECTOR; | 483 | eb |= 1u << NM_VECTOR; |
483 | if (vcpu->guest_debug.enabled) | 484 | if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) { |
484 | eb |= 1u << DB_VECTOR; | 485 | if (vcpu->guest_debug & |
486 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) | ||
487 | eb |= 1u << DB_VECTOR; | ||
488 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) | ||
489 | eb |= 1u << BP_VECTOR; | ||
490 | } | ||
485 | if (vcpu->arch.rmode.active) | 491 | if (vcpu->arch.rmode.active) |
486 | eb = ~0; | 492 | eb = ~0; |
487 | if (vm_need_ept()) | 493 | if (vm_need_ept()) |
@@ -747,29 +753,33 @@ static void vmx_queue_exception(struct kvm_vcpu *vcpu, unsigned nr, | |||
747 | bool has_error_code, u32 error_code) | 753 | bool has_error_code, u32 error_code) |
748 | { | 754 | { |
749 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 755 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
756 | u32 intr_info = nr | INTR_INFO_VALID_MASK; | ||
750 | 757 | ||
751 | if (has_error_code) | 758 | if (has_error_code) { |
752 | vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); | 759 | vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); |
760 | intr_info |= INTR_INFO_DELIVER_CODE_MASK; | ||
761 | } | ||
753 | 762 | ||
754 | if (vcpu->arch.rmode.active) { | 763 | if (vcpu->arch.rmode.active) { |
755 | vmx->rmode.irq.pending = true; | 764 | vmx->rmode.irq.pending = true; |
756 | vmx->rmode.irq.vector = nr; | 765 | vmx->rmode.irq.vector = nr; |
757 | vmx->rmode.irq.rip = kvm_rip_read(vcpu); | 766 | vmx->rmode.irq.rip = kvm_rip_read(vcpu); |
758 | if (nr == BP_VECTOR) | 767 | if (nr == BP_VECTOR || nr == OF_VECTOR) |
759 | vmx->rmode.irq.rip++; | 768 | vmx->rmode.irq.rip++; |
760 | vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, | 769 | intr_info |= INTR_TYPE_SOFT_INTR; |
761 | nr | INTR_TYPE_SOFT_INTR | 770 | vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, intr_info); |
762 | | (has_error_code ? INTR_INFO_DELIVER_CODE_MASK : 0) | ||
763 | | INTR_INFO_VALID_MASK); | ||
764 | vmcs_write32(VM_ENTRY_INSTRUCTION_LEN, 1); | 771 | vmcs_write32(VM_ENTRY_INSTRUCTION_LEN, 1); |
765 | kvm_rip_write(vcpu, vmx->rmode.irq.rip - 1); | 772 | kvm_rip_write(vcpu, vmx->rmode.irq.rip - 1); |
766 | return; | 773 | return; |
767 | } | 774 | } |
768 | 775 | ||
769 | vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, | 776 | if (nr == BP_VECTOR || nr == OF_VECTOR) { |
770 | nr | INTR_TYPE_EXCEPTION | 777 | vmcs_write32(VM_ENTRY_INSTRUCTION_LEN, 1); |
771 | | (has_error_code ? INTR_INFO_DELIVER_CODE_MASK : 0) | 778 | intr_info |= INTR_TYPE_SOFT_EXCEPTION; |
772 | | INTR_INFO_VALID_MASK); | 779 | } else |
780 | intr_info |= INTR_TYPE_HARD_EXCEPTION; | ||
781 | |||
782 | vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, intr_info); | ||
773 | } | 783 | } |
774 | 784 | ||
775 | static bool vmx_exception_injected(struct kvm_vcpu *vcpu) | 785 | static bool vmx_exception_injected(struct kvm_vcpu *vcpu) |
@@ -856,11 +866,8 @@ static u64 guest_read_tsc(void) | |||
856 | * writes 'guest_tsc' into guest's timestamp counter "register" | 866 | * writes 'guest_tsc' into guest's timestamp counter "register" |
857 | * guest_tsc = host_tsc + tsc_offset ==> tsc_offset = guest_tsc - host_tsc | 867 | * guest_tsc = host_tsc + tsc_offset ==> tsc_offset = guest_tsc - host_tsc |
858 | */ | 868 | */ |
859 | static void guest_write_tsc(u64 guest_tsc) | 869 | static void guest_write_tsc(u64 guest_tsc, u64 host_tsc) |
860 | { | 870 | { |
861 | u64 host_tsc; | ||
862 | |||
863 | rdtscll(host_tsc); | ||
864 | vmcs_write64(TSC_OFFSET, guest_tsc - host_tsc); | 871 | vmcs_write64(TSC_OFFSET, guest_tsc - host_tsc); |
865 | } | 872 | } |
866 | 873 | ||
@@ -925,14 +932,15 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) | |||
925 | { | 932 | { |
926 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 933 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
927 | struct kvm_msr_entry *msr; | 934 | struct kvm_msr_entry *msr; |
935 | u64 host_tsc; | ||
928 | int ret = 0; | 936 | int ret = 0; |
929 | 937 | ||
930 | switch (msr_index) { | 938 | switch (msr_index) { |
931 | #ifdef CONFIG_X86_64 | ||
932 | case MSR_EFER: | 939 | case MSR_EFER: |
933 | vmx_load_host_state(vmx); | 940 | vmx_load_host_state(vmx); |
934 | ret = kvm_set_msr_common(vcpu, msr_index, data); | 941 | ret = kvm_set_msr_common(vcpu, msr_index, data); |
935 | break; | 942 | break; |
943 | #ifdef CONFIG_X86_64 | ||
936 | case MSR_FS_BASE: | 944 | case MSR_FS_BASE: |
937 | vmcs_writel(GUEST_FS_BASE, data); | 945 | vmcs_writel(GUEST_FS_BASE, data); |
938 | break; | 946 | break; |
@@ -950,7 +958,8 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) | |||
950 | vmcs_writel(GUEST_SYSENTER_ESP, data); | 958 | vmcs_writel(GUEST_SYSENTER_ESP, data); |
951 | break; | 959 | break; |
952 | case MSR_IA32_TIME_STAMP_COUNTER: | 960 | case MSR_IA32_TIME_STAMP_COUNTER: |
953 | guest_write_tsc(data); | 961 | rdtscll(host_tsc); |
962 | guest_write_tsc(data, host_tsc); | ||
954 | break; | 963 | break; |
955 | case MSR_P6_PERFCTR0: | 964 | case MSR_P6_PERFCTR0: |
956 | case MSR_P6_PERFCTR1: | 965 | case MSR_P6_PERFCTR1: |
@@ -999,40 +1008,28 @@ static void vmx_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg) | |||
999 | } | 1008 | } |
1000 | } | 1009 | } |
1001 | 1010 | ||
1002 | static int set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_debug_guest *dbg) | 1011 | static int set_guest_debug(struct kvm_vcpu *vcpu, struct kvm_guest_debug *dbg) |
1003 | { | 1012 | { |
1004 | unsigned long dr7 = 0x400; | 1013 | int old_debug = vcpu->guest_debug; |
1005 | int old_singlestep; | 1014 | unsigned long flags; |
1006 | |||
1007 | old_singlestep = vcpu->guest_debug.singlestep; | ||
1008 | |||
1009 | vcpu->guest_debug.enabled = dbg->enabled; | ||
1010 | if (vcpu->guest_debug.enabled) { | ||
1011 | int i; | ||
1012 | 1015 | ||
1013 | dr7 |= 0x200; /* exact */ | 1016 | vcpu->guest_debug = dbg->control; |
1014 | for (i = 0; i < 4; ++i) { | 1017 | if (!(vcpu->guest_debug & KVM_GUESTDBG_ENABLE)) |
1015 | if (!dbg->breakpoints[i].enabled) | 1018 | vcpu->guest_debug = 0; |
1016 | continue; | ||
1017 | vcpu->guest_debug.bp[i] = dbg->breakpoints[i].address; | ||
1018 | dr7 |= 2 << (i*2); /* global enable */ | ||
1019 | dr7 |= 0 << (i*4+16); /* execution breakpoint */ | ||
1020 | } | ||
1021 | 1019 | ||
1022 | vcpu->guest_debug.singlestep = dbg->singlestep; | 1020 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) |
1023 | } else | 1021 | vmcs_writel(GUEST_DR7, dbg->arch.debugreg[7]); |
1024 | vcpu->guest_debug.singlestep = 0; | 1022 | else |
1025 | 1023 | vmcs_writel(GUEST_DR7, vcpu->arch.dr7); | |
1026 | if (old_singlestep && !vcpu->guest_debug.singlestep) { | ||
1027 | unsigned long flags; | ||
1028 | 1024 | ||
1029 | flags = vmcs_readl(GUEST_RFLAGS); | 1025 | flags = vmcs_readl(GUEST_RFLAGS); |
1026 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) | ||
1027 | flags |= X86_EFLAGS_TF | X86_EFLAGS_RF; | ||
1028 | else if (old_debug & KVM_GUESTDBG_SINGLESTEP) | ||
1030 | flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF); | 1029 | flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF); |
1031 | vmcs_writel(GUEST_RFLAGS, flags); | 1030 | vmcs_writel(GUEST_RFLAGS, flags); |
1032 | } | ||
1033 | 1031 | ||
1034 | update_exception_bitmap(vcpu); | 1032 | update_exception_bitmap(vcpu); |
1035 | vmcs_writel(GUEST_DR7, dr7); | ||
1036 | 1033 | ||
1037 | return 0; | 1034 | return 0; |
1038 | } | 1035 | } |
@@ -1433,6 +1430,29 @@ continue_rmode: | |||
1433 | init_rmode(vcpu->kvm); | 1430 | init_rmode(vcpu->kvm); |
1434 | } | 1431 | } |
1435 | 1432 | ||
1433 | static void vmx_set_efer(struct kvm_vcpu *vcpu, u64 efer) | ||
1434 | { | ||
1435 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
1436 | struct kvm_msr_entry *msr = find_msr_entry(vmx, MSR_EFER); | ||
1437 | |||
1438 | vcpu->arch.shadow_efer = efer; | ||
1439 | if (!msr) | ||
1440 | return; | ||
1441 | if (efer & EFER_LMA) { | ||
1442 | vmcs_write32(VM_ENTRY_CONTROLS, | ||
1443 | vmcs_read32(VM_ENTRY_CONTROLS) | | ||
1444 | VM_ENTRY_IA32E_MODE); | ||
1445 | msr->data = efer; | ||
1446 | } else { | ||
1447 | vmcs_write32(VM_ENTRY_CONTROLS, | ||
1448 | vmcs_read32(VM_ENTRY_CONTROLS) & | ||
1449 | ~VM_ENTRY_IA32E_MODE); | ||
1450 | |||
1451 | msr->data = efer & ~EFER_LME; | ||
1452 | } | ||
1453 | setup_msrs(vmx); | ||
1454 | } | ||
1455 | |||
1436 | #ifdef CONFIG_X86_64 | 1456 | #ifdef CONFIG_X86_64 |
1437 | 1457 | ||
1438 | static void enter_lmode(struct kvm_vcpu *vcpu) | 1458 | static void enter_lmode(struct kvm_vcpu *vcpu) |
@@ -1447,13 +1467,8 @@ static void enter_lmode(struct kvm_vcpu *vcpu) | |||
1447 | (guest_tr_ar & ~AR_TYPE_MASK) | 1467 | (guest_tr_ar & ~AR_TYPE_MASK) |
1448 | | AR_TYPE_BUSY_64_TSS); | 1468 | | AR_TYPE_BUSY_64_TSS); |
1449 | } | 1469 | } |
1450 | |||
1451 | vcpu->arch.shadow_efer |= EFER_LMA; | 1470 | vcpu->arch.shadow_efer |= EFER_LMA; |
1452 | 1471 | vmx_set_efer(vcpu, vcpu->arch.shadow_efer); | |
1453 | find_msr_entry(to_vmx(vcpu), MSR_EFER)->data |= EFER_LMA | EFER_LME; | ||
1454 | vmcs_write32(VM_ENTRY_CONTROLS, | ||
1455 | vmcs_read32(VM_ENTRY_CONTROLS) | ||
1456 | | VM_ENTRY_IA32E_MODE); | ||
1457 | } | 1472 | } |
1458 | 1473 | ||
1459 | static void exit_lmode(struct kvm_vcpu *vcpu) | 1474 | static void exit_lmode(struct kvm_vcpu *vcpu) |
@@ -1612,30 +1627,6 @@ static void vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
1612 | vmcs_writel(GUEST_CR4, hw_cr4); | 1627 | vmcs_writel(GUEST_CR4, hw_cr4); |
1613 | } | 1628 | } |
1614 | 1629 | ||
1615 | static void vmx_set_efer(struct kvm_vcpu *vcpu, u64 efer) | ||
1616 | { | ||
1617 | struct vcpu_vmx *vmx = to_vmx(vcpu); | ||
1618 | struct kvm_msr_entry *msr = find_msr_entry(vmx, MSR_EFER); | ||
1619 | |||
1620 | vcpu->arch.shadow_efer = efer; | ||
1621 | if (!msr) | ||
1622 | return; | ||
1623 | if (efer & EFER_LMA) { | ||
1624 | vmcs_write32(VM_ENTRY_CONTROLS, | ||
1625 | vmcs_read32(VM_ENTRY_CONTROLS) | | ||
1626 | VM_ENTRY_IA32E_MODE); | ||
1627 | msr->data = efer; | ||
1628 | |||
1629 | } else { | ||
1630 | vmcs_write32(VM_ENTRY_CONTROLS, | ||
1631 | vmcs_read32(VM_ENTRY_CONTROLS) & | ||
1632 | ~VM_ENTRY_IA32E_MODE); | ||
1633 | |||
1634 | msr->data = efer & ~EFER_LME; | ||
1635 | } | ||
1636 | setup_msrs(vmx); | ||
1637 | } | ||
1638 | |||
1639 | static u64 vmx_get_segment_base(struct kvm_vcpu *vcpu, int seg) | 1630 | static u64 vmx_get_segment_base(struct kvm_vcpu *vcpu, int seg) |
1640 | { | 1631 | { |
1641 | struct kvm_vmx_segment_field *sf = &kvm_vmx_segment_fields[seg]; | 1632 | struct kvm_vmx_segment_field *sf = &kvm_vmx_segment_fields[seg]; |
@@ -1653,7 +1644,7 @@ static void vmx_get_segment(struct kvm_vcpu *vcpu, | |||
1653 | var->limit = vmcs_read32(sf->limit); | 1644 | var->limit = vmcs_read32(sf->limit); |
1654 | var->selector = vmcs_read16(sf->selector); | 1645 | var->selector = vmcs_read16(sf->selector); |
1655 | ar = vmcs_read32(sf->ar_bytes); | 1646 | ar = vmcs_read32(sf->ar_bytes); |
1656 | if (ar & AR_UNUSABLE_MASK) | 1647 | if ((ar & AR_UNUSABLE_MASK) && !emulate_invalid_guest_state) |
1657 | ar = 0; | 1648 | ar = 0; |
1658 | var->type = ar & 15; | 1649 | var->type = ar & 15; |
1659 | var->s = (ar >> 4) & 1; | 1650 | var->s = (ar >> 4) & 1; |
@@ -1788,14 +1779,16 @@ static bool code_segment_valid(struct kvm_vcpu *vcpu) | |||
1788 | vmx_get_segment(vcpu, &cs, VCPU_SREG_CS); | 1779 | vmx_get_segment(vcpu, &cs, VCPU_SREG_CS); |
1789 | cs_rpl = cs.selector & SELECTOR_RPL_MASK; | 1780 | cs_rpl = cs.selector & SELECTOR_RPL_MASK; |
1790 | 1781 | ||
1782 | if (cs.unusable) | ||
1783 | return false; | ||
1791 | if (~cs.type & (AR_TYPE_CODE_MASK|AR_TYPE_ACCESSES_MASK)) | 1784 | if (~cs.type & (AR_TYPE_CODE_MASK|AR_TYPE_ACCESSES_MASK)) |
1792 | return false; | 1785 | return false; |
1793 | if (!cs.s) | 1786 | if (!cs.s) |
1794 | return false; | 1787 | return false; |
1795 | if (!(~cs.type & (AR_TYPE_CODE_MASK|AR_TYPE_WRITEABLE_MASK))) { | 1788 | if (cs.type & AR_TYPE_WRITEABLE_MASK) { |
1796 | if (cs.dpl > cs_rpl) | 1789 | if (cs.dpl > cs_rpl) |
1797 | return false; | 1790 | return false; |
1798 | } else if (cs.type & AR_TYPE_CODE_MASK) { | 1791 | } else { |
1799 | if (cs.dpl != cs_rpl) | 1792 | if (cs.dpl != cs_rpl) |
1800 | return false; | 1793 | return false; |
1801 | } | 1794 | } |
@@ -1814,7 +1807,9 @@ static bool stack_segment_valid(struct kvm_vcpu *vcpu) | |||
1814 | vmx_get_segment(vcpu, &ss, VCPU_SREG_SS); | 1807 | vmx_get_segment(vcpu, &ss, VCPU_SREG_SS); |
1815 | ss_rpl = ss.selector & SELECTOR_RPL_MASK; | 1808 | ss_rpl = ss.selector & SELECTOR_RPL_MASK; |
1816 | 1809 | ||
1817 | if ((ss.type != 3) || (ss.type != 7)) | 1810 | if (ss.unusable) |
1811 | return true; | ||
1812 | if (ss.type != 3 && ss.type != 7) | ||
1818 | return false; | 1813 | return false; |
1819 | if (!ss.s) | 1814 | if (!ss.s) |
1820 | return false; | 1815 | return false; |
@@ -1834,6 +1829,8 @@ static bool data_segment_valid(struct kvm_vcpu *vcpu, int seg) | |||
1834 | vmx_get_segment(vcpu, &var, seg); | 1829 | vmx_get_segment(vcpu, &var, seg); |
1835 | rpl = var.selector & SELECTOR_RPL_MASK; | 1830 | rpl = var.selector & SELECTOR_RPL_MASK; |
1836 | 1831 | ||
1832 | if (var.unusable) | ||
1833 | return true; | ||
1837 | if (!var.s) | 1834 | if (!var.s) |
1838 | return false; | 1835 | return false; |
1839 | if (!var.present) | 1836 | if (!var.present) |
@@ -1855,9 +1852,11 @@ static bool tr_valid(struct kvm_vcpu *vcpu) | |||
1855 | 1852 | ||
1856 | vmx_get_segment(vcpu, &tr, VCPU_SREG_TR); | 1853 | vmx_get_segment(vcpu, &tr, VCPU_SREG_TR); |
1857 | 1854 | ||
1855 | if (tr.unusable) | ||
1856 | return false; | ||
1858 | if (tr.selector & SELECTOR_TI_MASK) /* TI = 1 */ | 1857 | if (tr.selector & SELECTOR_TI_MASK) /* TI = 1 */ |
1859 | return false; | 1858 | return false; |
1860 | if ((tr.type != 3) || (tr.type != 11)) /* TODO: Check if guest is in IA32e mode */ | 1859 | if (tr.type != 3 && tr.type != 11) /* TODO: Check if guest is in IA32e mode */ |
1861 | return false; | 1860 | return false; |
1862 | if (!tr.present) | 1861 | if (!tr.present) |
1863 | return false; | 1862 | return false; |
@@ -1871,6 +1870,8 @@ static bool ldtr_valid(struct kvm_vcpu *vcpu) | |||
1871 | 1870 | ||
1872 | vmx_get_segment(vcpu, &ldtr, VCPU_SREG_LDTR); | 1871 | vmx_get_segment(vcpu, &ldtr, VCPU_SREG_LDTR); |
1873 | 1872 | ||
1873 | if (ldtr.unusable) | ||
1874 | return true; | ||
1874 | if (ldtr.selector & SELECTOR_TI_MASK) /* TI = 1 */ | 1875 | if (ldtr.selector & SELECTOR_TI_MASK) /* TI = 1 */ |
1875 | return false; | 1876 | return false; |
1876 | if (ldtr.type != 2) | 1877 | if (ldtr.type != 2) |
@@ -2112,7 +2113,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) | |||
2112 | { | 2113 | { |
2113 | u32 host_sysenter_cs, msr_low, msr_high; | 2114 | u32 host_sysenter_cs, msr_low, msr_high; |
2114 | u32 junk; | 2115 | u32 junk; |
2115 | u64 host_pat; | 2116 | u64 host_pat, tsc_this, tsc_base; |
2116 | unsigned long a; | 2117 | unsigned long a; |
2117 | struct descriptor_table dt; | 2118 | struct descriptor_table dt; |
2118 | int i; | 2119 | int i; |
@@ -2240,6 +2241,12 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) | |||
2240 | vmcs_writel(CR0_GUEST_HOST_MASK, ~0UL); | 2241 | vmcs_writel(CR0_GUEST_HOST_MASK, ~0UL); |
2241 | vmcs_writel(CR4_GUEST_HOST_MASK, KVM_GUEST_CR4_MASK); | 2242 | vmcs_writel(CR4_GUEST_HOST_MASK, KVM_GUEST_CR4_MASK); |
2242 | 2243 | ||
2244 | tsc_base = vmx->vcpu.kvm->arch.vm_init_tsc; | ||
2245 | rdtscll(tsc_this); | ||
2246 | if (tsc_this < vmx->vcpu.kvm->arch.vm_init_tsc) | ||
2247 | tsc_base = tsc_this; | ||
2248 | |||
2249 | guest_write_tsc(0, tsc_base); | ||
2243 | 2250 | ||
2244 | return 0; | 2251 | return 0; |
2245 | } | 2252 | } |
@@ -2319,7 +2326,6 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu) | |||
2319 | kvm_rip_write(vcpu, 0); | 2326 | kvm_rip_write(vcpu, 0); |
2320 | kvm_register_write(vcpu, VCPU_REGS_RSP, 0); | 2327 | kvm_register_write(vcpu, VCPU_REGS_RSP, 0); |
2321 | 2328 | ||
2322 | /* todo: dr0 = dr1 = dr2 = dr3 = 0; dr6 = 0xffff0ff0 */ | ||
2323 | vmcs_writel(GUEST_DR7, 0x400); | 2329 | vmcs_writel(GUEST_DR7, 0x400); |
2324 | 2330 | ||
2325 | vmcs_writel(GUEST_GDTR_BASE, 0); | 2331 | vmcs_writel(GUEST_GDTR_BASE, 0); |
@@ -2332,8 +2338,6 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu) | |||
2332 | vmcs_write32(GUEST_INTERRUPTIBILITY_INFO, 0); | 2338 | vmcs_write32(GUEST_INTERRUPTIBILITY_INFO, 0); |
2333 | vmcs_write32(GUEST_PENDING_DBG_EXCEPTIONS, 0); | 2339 | vmcs_write32(GUEST_PENDING_DBG_EXCEPTIONS, 0); |
2334 | 2340 | ||
2335 | guest_write_tsc(0); | ||
2336 | |||
2337 | /* Special registers */ | 2341 | /* Special registers */ |
2338 | vmcs_write64(GUEST_IA32_DEBUGCTL, 0); | 2342 | vmcs_write64(GUEST_IA32_DEBUGCTL, 0); |
2339 | 2343 | ||
@@ -2486,6 +2490,11 @@ static void do_interrupt_requests(struct kvm_vcpu *vcpu, | |||
2486 | { | 2490 | { |
2487 | vmx_update_window_states(vcpu); | 2491 | vmx_update_window_states(vcpu); |
2488 | 2492 | ||
2493 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) | ||
2494 | vmcs_clear_bits(GUEST_INTERRUPTIBILITY_INFO, | ||
2495 | GUEST_INTR_STATE_STI | | ||
2496 | GUEST_INTR_STATE_MOV_SS); | ||
2497 | |||
2489 | if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) { | 2498 | if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) { |
2490 | if (vcpu->arch.interrupt.pending) { | 2499 | if (vcpu->arch.interrupt.pending) { |
2491 | enable_nmi_window(vcpu); | 2500 | enable_nmi_window(vcpu); |
@@ -2536,24 +2545,6 @@ static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr) | |||
2536 | return 0; | 2545 | return 0; |
2537 | } | 2546 | } |
2538 | 2547 | ||
2539 | static void kvm_guest_debug_pre(struct kvm_vcpu *vcpu) | ||
2540 | { | ||
2541 | struct kvm_guest_debug *dbg = &vcpu->guest_debug; | ||
2542 | |||
2543 | set_debugreg(dbg->bp[0], 0); | ||
2544 | set_debugreg(dbg->bp[1], 1); | ||
2545 | set_debugreg(dbg->bp[2], 2); | ||
2546 | set_debugreg(dbg->bp[3], 3); | ||
2547 | |||
2548 | if (dbg->singlestep) { | ||
2549 | unsigned long flags; | ||
2550 | |||
2551 | flags = vmcs_readl(GUEST_RFLAGS); | ||
2552 | flags |= X86_EFLAGS_TF | X86_EFLAGS_RF; | ||
2553 | vmcs_writel(GUEST_RFLAGS, flags); | ||
2554 | } | ||
2555 | } | ||
2556 | |||
2557 | static int handle_rmode_exception(struct kvm_vcpu *vcpu, | 2548 | static int handle_rmode_exception(struct kvm_vcpu *vcpu, |
2558 | int vec, u32 err_code) | 2549 | int vec, u32 err_code) |
2559 | { | 2550 | { |
@@ -2570,9 +2561,17 @@ static int handle_rmode_exception(struct kvm_vcpu *vcpu, | |||
2570 | * the required debugging infrastructure rework. | 2561 | * the required debugging infrastructure rework. |
2571 | */ | 2562 | */ |
2572 | switch (vec) { | 2563 | switch (vec) { |
2573 | case DE_VECTOR: | ||
2574 | case DB_VECTOR: | 2564 | case DB_VECTOR: |
2565 | if (vcpu->guest_debug & | ||
2566 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP)) | ||
2567 | return 0; | ||
2568 | kvm_queue_exception(vcpu, vec); | ||
2569 | return 1; | ||
2575 | case BP_VECTOR: | 2570 | case BP_VECTOR: |
2571 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP) | ||
2572 | return 0; | ||
2573 | /* fall through */ | ||
2574 | case DE_VECTOR: | ||
2576 | case OF_VECTOR: | 2575 | case OF_VECTOR: |
2577 | case BR_VECTOR: | 2576 | case BR_VECTOR: |
2578 | case UD_VECTOR: | 2577 | case UD_VECTOR: |
@@ -2589,8 +2588,8 @@ static int handle_rmode_exception(struct kvm_vcpu *vcpu, | |||
2589 | static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 2588 | static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
2590 | { | 2589 | { |
2591 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 2590 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
2592 | u32 intr_info, error_code; | 2591 | u32 intr_info, ex_no, error_code; |
2593 | unsigned long cr2, rip; | 2592 | unsigned long cr2, rip, dr6; |
2594 | u32 vect_info; | 2593 | u32 vect_info; |
2595 | enum emulation_result er; | 2594 | enum emulation_result er; |
2596 | 2595 | ||
@@ -2649,14 +2648,30 @@ static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2649 | return 1; | 2648 | return 1; |
2650 | } | 2649 | } |
2651 | 2650 | ||
2652 | if ((intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK)) == | 2651 | ex_no = intr_info & INTR_INFO_VECTOR_MASK; |
2653 | (INTR_TYPE_EXCEPTION | 1)) { | 2652 | switch (ex_no) { |
2653 | case DB_VECTOR: | ||
2654 | dr6 = vmcs_readl(EXIT_QUALIFICATION); | ||
2655 | if (!(vcpu->guest_debug & | ||
2656 | (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))) { | ||
2657 | vcpu->arch.dr6 = dr6 | DR6_FIXED_1; | ||
2658 | kvm_queue_exception(vcpu, DB_VECTOR); | ||
2659 | return 1; | ||
2660 | } | ||
2661 | kvm_run->debug.arch.dr6 = dr6 | DR6_FIXED_1; | ||
2662 | kvm_run->debug.arch.dr7 = vmcs_readl(GUEST_DR7); | ||
2663 | /* fall through */ | ||
2664 | case BP_VECTOR: | ||
2654 | kvm_run->exit_reason = KVM_EXIT_DEBUG; | 2665 | kvm_run->exit_reason = KVM_EXIT_DEBUG; |
2655 | return 0; | 2666 | kvm_run->debug.arch.pc = vmcs_readl(GUEST_CS_BASE) + rip; |
2667 | kvm_run->debug.arch.exception = ex_no; | ||
2668 | break; | ||
2669 | default: | ||
2670 | kvm_run->exit_reason = KVM_EXIT_EXCEPTION; | ||
2671 | kvm_run->ex.exception = ex_no; | ||
2672 | kvm_run->ex.error_code = error_code; | ||
2673 | break; | ||
2656 | } | 2674 | } |
2657 | kvm_run->exit_reason = KVM_EXIT_EXCEPTION; | ||
2658 | kvm_run->ex.exception = intr_info & INTR_INFO_VECTOR_MASK; | ||
2659 | kvm_run->ex.error_code = error_code; | ||
2660 | return 0; | 2675 | return 0; |
2661 | } | 2676 | } |
2662 | 2677 | ||
@@ -2677,7 +2692,7 @@ static int handle_triple_fault(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2677 | static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 2692 | static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
2678 | { | 2693 | { |
2679 | unsigned long exit_qualification; | 2694 | unsigned long exit_qualification; |
2680 | int size, down, in, string, rep; | 2695 | int size, in, string; |
2681 | unsigned port; | 2696 | unsigned port; |
2682 | 2697 | ||
2683 | ++vcpu->stat.io_exits; | 2698 | ++vcpu->stat.io_exits; |
@@ -2693,8 +2708,6 @@ static int handle_io(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2693 | 2708 | ||
2694 | size = (exit_qualification & 7) + 1; | 2709 | size = (exit_qualification & 7) + 1; |
2695 | in = (exit_qualification & 8) != 0; | 2710 | in = (exit_qualification & 8) != 0; |
2696 | down = (vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_DF) != 0; | ||
2697 | rep = (exit_qualification & 32) != 0; | ||
2698 | port = exit_qualification >> 16; | 2711 | port = exit_qualification >> 16; |
2699 | 2712 | ||
2700 | skip_emulated_instruction(vcpu); | 2713 | skip_emulated_instruction(vcpu); |
@@ -2795,21 +2808,44 @@ static int handle_dr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2795 | unsigned long val; | 2808 | unsigned long val; |
2796 | int dr, reg; | 2809 | int dr, reg; |
2797 | 2810 | ||
2798 | /* | 2811 | dr = vmcs_readl(GUEST_DR7); |
2799 | * FIXME: this code assumes the host is debugging the guest. | 2812 | if (dr & DR7_GD) { |
2800 | * need to deal with guest debugging itself too. | 2813 | /* |
2801 | */ | 2814 | * As the vm-exit takes precedence over the debug trap, we |
2815 | * need to emulate the latter, either for the host or the | ||
2816 | * guest debugging itself. | ||
2817 | */ | ||
2818 | if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) { | ||
2819 | kvm_run->debug.arch.dr6 = vcpu->arch.dr6; | ||
2820 | kvm_run->debug.arch.dr7 = dr; | ||
2821 | kvm_run->debug.arch.pc = | ||
2822 | vmcs_readl(GUEST_CS_BASE) + | ||
2823 | vmcs_readl(GUEST_RIP); | ||
2824 | kvm_run->debug.arch.exception = DB_VECTOR; | ||
2825 | kvm_run->exit_reason = KVM_EXIT_DEBUG; | ||
2826 | return 0; | ||
2827 | } else { | ||
2828 | vcpu->arch.dr7 &= ~DR7_GD; | ||
2829 | vcpu->arch.dr6 |= DR6_BD; | ||
2830 | vmcs_writel(GUEST_DR7, vcpu->arch.dr7); | ||
2831 | kvm_queue_exception(vcpu, DB_VECTOR); | ||
2832 | return 1; | ||
2833 | } | ||
2834 | } | ||
2835 | |||
2802 | exit_qualification = vmcs_readl(EXIT_QUALIFICATION); | 2836 | exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
2803 | dr = exit_qualification & 7; | 2837 | dr = exit_qualification & DEBUG_REG_ACCESS_NUM; |
2804 | reg = (exit_qualification >> 8) & 15; | 2838 | reg = DEBUG_REG_ACCESS_REG(exit_qualification); |
2805 | if (exit_qualification & 16) { | 2839 | if (exit_qualification & TYPE_MOV_FROM_DR) { |
2806 | /* mov from dr */ | ||
2807 | switch (dr) { | 2840 | switch (dr) { |
2841 | case 0 ... 3: | ||
2842 | val = vcpu->arch.db[dr]; | ||
2843 | break; | ||
2808 | case 6: | 2844 | case 6: |
2809 | val = 0xffff0ff0; | 2845 | val = vcpu->arch.dr6; |
2810 | break; | 2846 | break; |
2811 | case 7: | 2847 | case 7: |
2812 | val = 0x400; | 2848 | val = vcpu->arch.dr7; |
2813 | break; | 2849 | break; |
2814 | default: | 2850 | default: |
2815 | val = 0; | 2851 | val = 0; |
@@ -2817,7 +2853,38 @@ static int handle_dr(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2817 | kvm_register_write(vcpu, reg, val); | 2853 | kvm_register_write(vcpu, reg, val); |
2818 | KVMTRACE_2D(DR_READ, vcpu, (u32)dr, (u32)val, handler); | 2854 | KVMTRACE_2D(DR_READ, vcpu, (u32)dr, (u32)val, handler); |
2819 | } else { | 2855 | } else { |
2820 | /* mov to dr */ | 2856 | val = vcpu->arch.regs[reg]; |
2857 | switch (dr) { | ||
2858 | case 0 ... 3: | ||
2859 | vcpu->arch.db[dr] = val; | ||
2860 | if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) | ||
2861 | vcpu->arch.eff_db[dr] = val; | ||
2862 | break; | ||
2863 | case 4 ... 5: | ||
2864 | if (vcpu->arch.cr4 & X86_CR4_DE) | ||
2865 | kvm_queue_exception(vcpu, UD_VECTOR); | ||
2866 | break; | ||
2867 | case 6: | ||
2868 | if (val & 0xffffffff00000000ULL) { | ||
2869 | kvm_queue_exception(vcpu, GP_VECTOR); | ||
2870 | break; | ||
2871 | } | ||
2872 | vcpu->arch.dr6 = (val & DR6_VOLATILE) | DR6_FIXED_1; | ||
2873 | break; | ||
2874 | case 7: | ||
2875 | if (val & 0xffffffff00000000ULL) { | ||
2876 | kvm_queue_exception(vcpu, GP_VECTOR); | ||
2877 | break; | ||
2878 | } | ||
2879 | vcpu->arch.dr7 = (val & DR7_VOLATILE) | DR7_FIXED_1; | ||
2880 | if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) { | ||
2881 | vmcs_writel(GUEST_DR7, vcpu->arch.dr7); | ||
2882 | vcpu->arch.switch_db_regs = | ||
2883 | (val & DR7_BP_EN_MASK); | ||
2884 | } | ||
2885 | break; | ||
2886 | } | ||
2887 | KVMTRACE_2D(DR_WRITE, vcpu, (u32)dr, (u32)val, handler); | ||
2821 | } | 2888 | } |
2822 | skip_emulated_instruction(vcpu); | 2889 | skip_emulated_instruction(vcpu); |
2823 | return 1; | 2890 | return 1; |
@@ -2968,17 +3035,25 @@ static int handle_task_switch(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2968 | } | 3035 | } |
2969 | tss_selector = exit_qualification; | 3036 | tss_selector = exit_qualification; |
2970 | 3037 | ||
2971 | return kvm_task_switch(vcpu, tss_selector, reason); | 3038 | if (!kvm_task_switch(vcpu, tss_selector, reason)) |
3039 | return 0; | ||
3040 | |||
3041 | /* clear all local breakpoint enable flags */ | ||
3042 | vmcs_writel(GUEST_DR7, vmcs_readl(GUEST_DR7) & ~55); | ||
3043 | |||
3044 | /* | ||
3045 | * TODO: What about debug traps on tss switch? | ||
3046 | * Are we supposed to inject them and update dr6? | ||
3047 | */ | ||
3048 | |||
3049 | return 1; | ||
2972 | } | 3050 | } |
2973 | 3051 | ||
2974 | static int handle_ept_violation(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 3052 | static int handle_ept_violation(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
2975 | { | 3053 | { |
2976 | u64 exit_qualification; | 3054 | u64 exit_qualification; |
2977 | enum emulation_result er; | ||
2978 | gpa_t gpa; | 3055 | gpa_t gpa; |
2979 | unsigned long hva; | ||
2980 | int gla_validity; | 3056 | int gla_validity; |
2981 | int r; | ||
2982 | 3057 | ||
2983 | exit_qualification = vmcs_read64(EXIT_QUALIFICATION); | 3058 | exit_qualification = vmcs_read64(EXIT_QUALIFICATION); |
2984 | 3059 | ||
@@ -3001,32 +3076,7 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3001 | } | 3076 | } |
3002 | 3077 | ||
3003 | gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS); | 3078 | gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS); |
3004 | hva = gfn_to_hva(vcpu->kvm, gpa >> PAGE_SHIFT); | 3079 | return kvm_mmu_page_fault(vcpu, gpa & PAGE_MASK, 0); |
3005 | if (!kvm_is_error_hva(hva)) { | ||
3006 | r = kvm_mmu_page_fault(vcpu, gpa & PAGE_MASK, 0); | ||
3007 | if (r < 0) { | ||
3008 | printk(KERN_ERR "EPT: Not enough memory!\n"); | ||
3009 | return -ENOMEM; | ||
3010 | } | ||
3011 | return 1; | ||
3012 | } else { | ||
3013 | /* must be MMIO */ | ||
3014 | er = emulate_instruction(vcpu, kvm_run, 0, 0, 0); | ||
3015 | |||
3016 | if (er == EMULATE_FAIL) { | ||
3017 | printk(KERN_ERR | ||
3018 | "EPT: Fail to handle EPT violation vmexit!er is %d\n", | ||
3019 | er); | ||
3020 | printk(KERN_ERR "EPT: GPA: 0x%lx, GVA: 0x%lx\n", | ||
3021 | (long unsigned int)vmcs_read64(GUEST_PHYSICAL_ADDRESS), | ||
3022 | (long unsigned int)vmcs_read64(GUEST_LINEAR_ADDRESS)); | ||
3023 | printk(KERN_ERR "EPT: Exit qualification is 0x%lx\n", | ||
3024 | (long unsigned int)exit_qualification); | ||
3025 | return -ENOTSUPP; | ||
3026 | } else if (er == EMULATE_DO_MMIO) | ||
3027 | return 0; | ||
3028 | } | ||
3029 | return 1; | ||
3030 | } | 3080 | } |
3031 | 3081 | ||
3032 | static int handle_nmi_window(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 3082 | static int handle_nmi_window(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
@@ -3046,7 +3096,7 @@ static void handle_invalid_guest_state(struct kvm_vcpu *vcpu, | |||
3046 | struct kvm_run *kvm_run) | 3096 | struct kvm_run *kvm_run) |
3047 | { | 3097 | { |
3048 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 3098 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
3049 | int err; | 3099 | enum emulation_result err = EMULATE_DONE; |
3050 | 3100 | ||
3051 | preempt_enable(); | 3101 | preempt_enable(); |
3052 | local_irq_enable(); | 3102 | local_irq_enable(); |
@@ -3071,10 +3121,7 @@ static void handle_invalid_guest_state(struct kvm_vcpu *vcpu, | |||
3071 | local_irq_disable(); | 3121 | local_irq_disable(); |
3072 | preempt_disable(); | 3122 | preempt_disable(); |
3073 | 3123 | ||
3074 | /* Guest state should be valid now except if we need to | 3124 | vmx->invalid_state_emulation_result = err; |
3075 | * emulate an MMIO */ | ||
3076 | if (guest_state_valid(vcpu)) | ||
3077 | vmx->emulation_required = 0; | ||
3078 | } | 3125 | } |
3079 | 3126 | ||
3080 | /* | 3127 | /* |
@@ -3123,8 +3170,11 @@ static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) | |||
3123 | 3170 | ||
3124 | /* If we need to emulate an MMIO from handle_invalid_guest_state | 3171 | /* If we need to emulate an MMIO from handle_invalid_guest_state |
3125 | * we just return 0 */ | 3172 | * we just return 0 */ |
3126 | if (vmx->emulation_required && emulate_invalid_guest_state) | 3173 | if (vmx->emulation_required && emulate_invalid_guest_state) { |
3127 | return 0; | 3174 | if (guest_state_valid(vcpu)) |
3175 | vmx->emulation_required = 0; | ||
3176 | return vmx->invalid_state_emulation_result != EMULATE_DO_MMIO; | ||
3177 | } | ||
3128 | 3178 | ||
3129 | /* Access CR3 don't cause VMExit in paging mode, so we need | 3179 | /* Access CR3 don't cause VMExit in paging mode, so we need |
3130 | * to sync with guest real CR3. */ | 3180 | * to sync with guest real CR3. */ |
@@ -3238,7 +3288,8 @@ static void vmx_complete_interrupts(struct vcpu_vmx *vmx) | |||
3238 | vmx->vcpu.arch.nmi_injected = false; | 3288 | vmx->vcpu.arch.nmi_injected = false; |
3239 | } | 3289 | } |
3240 | kvm_clear_exception_queue(&vmx->vcpu); | 3290 | kvm_clear_exception_queue(&vmx->vcpu); |
3241 | if (idtv_info_valid && type == INTR_TYPE_EXCEPTION) { | 3291 | if (idtv_info_valid && (type == INTR_TYPE_HARD_EXCEPTION || |
3292 | type == INTR_TYPE_SOFT_EXCEPTION)) { | ||
3242 | if (idt_vectoring_info & VECTORING_INFO_DELIVER_CODE_MASK) { | 3293 | if (idt_vectoring_info & VECTORING_INFO_DELIVER_CODE_MASK) { |
3243 | error = vmcs_read32(IDT_VECTORING_ERROR_CODE); | 3294 | error = vmcs_read32(IDT_VECTORING_ERROR_CODE); |
3244 | kvm_queue_exception_e(&vmx->vcpu, vector, error); | 3295 | kvm_queue_exception_e(&vmx->vcpu, vector, error); |
@@ -3259,6 +3310,11 @@ static void vmx_intr_assist(struct kvm_vcpu *vcpu) | |||
3259 | 3310 | ||
3260 | vmx_update_window_states(vcpu); | 3311 | vmx_update_window_states(vcpu); |
3261 | 3312 | ||
3313 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) | ||
3314 | vmcs_clear_bits(GUEST_INTERRUPTIBILITY_INFO, | ||
3315 | GUEST_INTR_STATE_STI | | ||
3316 | GUEST_INTR_STATE_MOV_SS); | ||
3317 | |||
3262 | if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) { | 3318 | if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) { |
3263 | if (vcpu->arch.interrupt.pending) { | 3319 | if (vcpu->arch.interrupt.pending) { |
3264 | enable_nmi_window(vcpu); | 3320 | enable_nmi_window(vcpu); |
@@ -3347,6 +3403,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3347 | */ | 3403 | */ |
3348 | vmcs_writel(HOST_CR0, read_cr0()); | 3404 | vmcs_writel(HOST_CR0, read_cr0()); |
3349 | 3405 | ||
3406 | set_debugreg(vcpu->arch.dr6, 6); | ||
3407 | |||
3350 | asm( | 3408 | asm( |
3351 | /* Store host registers */ | 3409 | /* Store host registers */ |
3352 | "push %%"R"dx; push %%"R"bp;" | 3410 | "push %%"R"dx; push %%"R"bp;" |
@@ -3441,6 +3499,8 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3441 | vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)); | 3499 | vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)); |
3442 | vcpu->arch.regs_dirty = 0; | 3500 | vcpu->arch.regs_dirty = 0; |
3443 | 3501 | ||
3502 | get_debugreg(vcpu->arch.dr6, 6); | ||
3503 | |||
3444 | vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); | 3504 | vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); |
3445 | if (vmx->rmode.irq.pending) | 3505 | if (vmx->rmode.irq.pending) |
3446 | fixup_rmode_irq(vmx); | 3506 | fixup_rmode_irq(vmx); |
@@ -3595,7 +3655,6 @@ static struct kvm_x86_ops vmx_x86_ops = { | |||
3595 | .vcpu_put = vmx_vcpu_put, | 3655 | .vcpu_put = vmx_vcpu_put, |
3596 | 3656 | ||
3597 | .set_guest_debug = set_guest_debug, | 3657 | .set_guest_debug = set_guest_debug, |
3598 | .guest_debug_pre = kvm_guest_debug_pre, | ||
3599 | .get_msr = vmx_get_msr, | 3658 | .get_msr = vmx_get_msr, |
3600 | .set_msr = vmx_set_msr, | 3659 | .set_msr = vmx_set_msr, |
3601 | .get_segment_base = vmx_get_segment_base, | 3660 | .get_segment_base = vmx_get_segment_base, |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 758b7a155ae9..8ca100a9ecac 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/highmem.h> | 36 | #include <linux/highmem.h> |
37 | #include <linux/iommu.h> | 37 | #include <linux/iommu.h> |
38 | #include <linux/intel-iommu.h> | 38 | #include <linux/intel-iommu.h> |
39 | #include <linux/cpufreq.h> | ||
39 | 40 | ||
40 | #include <asm/uaccess.h> | 41 | #include <asm/uaccess.h> |
41 | #include <asm/msr.h> | 42 | #include <asm/msr.h> |
@@ -69,6 +70,8 @@ static u64 __read_mostly efer_reserved_bits = 0xfffffffffffffffeULL; | |||
69 | 70 | ||
70 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | 71 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, |
71 | struct kvm_cpuid_entry2 __user *entries); | 72 | struct kvm_cpuid_entry2 __user *entries); |
73 | struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, | ||
74 | u32 function, u32 index); | ||
72 | 75 | ||
73 | struct kvm_x86_ops *kvm_x86_ops; | 76 | struct kvm_x86_ops *kvm_x86_ops; |
74 | EXPORT_SYMBOL_GPL(kvm_x86_ops); | 77 | EXPORT_SYMBOL_GPL(kvm_x86_ops); |
@@ -173,6 +176,7 @@ void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long addr, | |||
173 | u32 error_code) | 176 | u32 error_code) |
174 | { | 177 | { |
175 | ++vcpu->stat.pf_guest; | 178 | ++vcpu->stat.pf_guest; |
179 | |||
176 | if (vcpu->arch.exception.pending) { | 180 | if (vcpu->arch.exception.pending) { |
177 | if (vcpu->arch.exception.nr == PF_VECTOR) { | 181 | if (vcpu->arch.exception.nr == PF_VECTOR) { |
178 | printk(KERN_DEBUG "kvm: inject_page_fault:" | 182 | printk(KERN_DEBUG "kvm: inject_page_fault:" |
@@ -361,6 +365,7 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
361 | } | 365 | } |
362 | kvm_x86_ops->set_cr4(vcpu, cr4); | 366 | kvm_x86_ops->set_cr4(vcpu, cr4); |
363 | vcpu->arch.cr4 = cr4; | 367 | vcpu->arch.cr4 = cr4; |
368 | vcpu->arch.mmu.base_role.cr4_pge = (cr4 & X86_CR4_PGE) && !tdp_enabled; | ||
364 | kvm_mmu_sync_global(vcpu); | 369 | kvm_mmu_sync_global(vcpu); |
365 | kvm_mmu_reset_context(vcpu); | 370 | kvm_mmu_reset_context(vcpu); |
366 | } | 371 | } |
@@ -442,6 +447,11 @@ unsigned long kvm_get_cr8(struct kvm_vcpu *vcpu) | |||
442 | } | 447 | } |
443 | EXPORT_SYMBOL_GPL(kvm_get_cr8); | 448 | EXPORT_SYMBOL_GPL(kvm_get_cr8); |
444 | 449 | ||
450 | static inline u32 bit(int bitno) | ||
451 | { | ||
452 | return 1 << (bitno & 31); | ||
453 | } | ||
454 | |||
445 | /* | 455 | /* |
446 | * List of msr numbers which we expose to userspace through KVM_GET_MSRS | 456 | * List of msr numbers which we expose to userspace through KVM_GET_MSRS |
447 | * and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST. | 457 | * and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST. |
@@ -456,7 +466,7 @@ static u32 msrs_to_save[] = { | |||
456 | MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, | 466 | MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, |
457 | #endif | 467 | #endif |
458 | MSR_IA32_TIME_STAMP_COUNTER, MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, | 468 | MSR_IA32_TIME_STAMP_COUNTER, MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, |
459 | MSR_IA32_PERF_STATUS, MSR_IA32_CR_PAT | 469 | MSR_IA32_PERF_STATUS, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA |
460 | }; | 470 | }; |
461 | 471 | ||
462 | static unsigned num_msrs_to_save; | 472 | static unsigned num_msrs_to_save; |
@@ -481,6 +491,28 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer) | |||
481 | return; | 491 | return; |
482 | } | 492 | } |
483 | 493 | ||
494 | if (efer & EFER_FFXSR) { | ||
495 | struct kvm_cpuid_entry2 *feat; | ||
496 | |||
497 | feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); | ||
498 | if (!feat || !(feat->edx & bit(X86_FEATURE_FXSR_OPT))) { | ||
499 | printk(KERN_DEBUG "set_efer: #GP, enable FFXSR w/o CPUID capability\n"); | ||
500 | kvm_inject_gp(vcpu, 0); | ||
501 | return; | ||
502 | } | ||
503 | } | ||
504 | |||
505 | if (efer & EFER_SVME) { | ||
506 | struct kvm_cpuid_entry2 *feat; | ||
507 | |||
508 | feat = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); | ||
509 | if (!feat || !(feat->ecx & bit(X86_FEATURE_SVM))) { | ||
510 | printk(KERN_DEBUG "set_efer: #GP, enable SVM w/o SVM\n"); | ||
511 | kvm_inject_gp(vcpu, 0); | ||
512 | return; | ||
513 | } | ||
514 | } | ||
515 | |||
484 | kvm_x86_ops->set_efer(vcpu, efer); | 516 | kvm_x86_ops->set_efer(vcpu, efer); |
485 | 517 | ||
486 | efer &= ~EFER_LMA; | 518 | efer &= ~EFER_LMA; |
@@ -586,6 +618,8 @@ static void kvm_set_time_scale(uint32_t tsc_khz, struct pvclock_vcpu_time_info * | |||
586 | hv_clock->tsc_to_system_mul); | 618 | hv_clock->tsc_to_system_mul); |
587 | } | 619 | } |
588 | 620 | ||
621 | static DEFINE_PER_CPU(unsigned long, cpu_tsc_khz); | ||
622 | |||
589 | static void kvm_write_guest_time(struct kvm_vcpu *v) | 623 | static void kvm_write_guest_time(struct kvm_vcpu *v) |
590 | { | 624 | { |
591 | struct timespec ts; | 625 | struct timespec ts; |
@@ -596,9 +630,9 @@ static void kvm_write_guest_time(struct kvm_vcpu *v) | |||
596 | if ((!vcpu->time_page)) | 630 | if ((!vcpu->time_page)) |
597 | return; | 631 | return; |
598 | 632 | ||
599 | if (unlikely(vcpu->hv_clock_tsc_khz != tsc_khz)) { | 633 | if (unlikely(vcpu->hv_clock_tsc_khz != __get_cpu_var(cpu_tsc_khz))) { |
600 | kvm_set_time_scale(tsc_khz, &vcpu->hv_clock); | 634 | kvm_set_time_scale(__get_cpu_var(cpu_tsc_khz), &vcpu->hv_clock); |
601 | vcpu->hv_clock_tsc_khz = tsc_khz; | 635 | vcpu->hv_clock_tsc_khz = __get_cpu_var(cpu_tsc_khz); |
602 | } | 636 | } |
603 | 637 | ||
604 | /* Keep irq disabled to prevent changes to the clock */ | 638 | /* Keep irq disabled to prevent changes to the clock */ |
@@ -629,6 +663,16 @@ static void kvm_write_guest_time(struct kvm_vcpu *v) | |||
629 | mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT); | 663 | mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT); |
630 | } | 664 | } |
631 | 665 | ||
666 | static int kvm_request_guest_time_update(struct kvm_vcpu *v) | ||
667 | { | ||
668 | struct kvm_vcpu_arch *vcpu = &v->arch; | ||
669 | |||
670 | if (!vcpu->time_page) | ||
671 | return 0; | ||
672 | set_bit(KVM_REQ_KVMCLOCK_UPDATE, &v->requests); | ||
673 | return 1; | ||
674 | } | ||
675 | |||
632 | static bool msr_mtrr_valid(unsigned msr) | 676 | static bool msr_mtrr_valid(unsigned msr) |
633 | { | 677 | { |
634 | switch (msr) { | 678 | switch (msr) { |
@@ -722,6 +766,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
722 | break; | 766 | break; |
723 | case MSR_IA32_UCODE_REV: | 767 | case MSR_IA32_UCODE_REV: |
724 | case MSR_IA32_UCODE_WRITE: | 768 | case MSR_IA32_UCODE_WRITE: |
769 | case MSR_VM_HSAVE_PA: | ||
725 | break; | 770 | break; |
726 | case 0x200 ... 0x2ff: | 771 | case 0x200 ... 0x2ff: |
727 | return set_msr_mtrr(vcpu, msr, data); | 772 | return set_msr_mtrr(vcpu, msr, data); |
@@ -758,7 +803,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
758 | vcpu->arch.time_page = NULL; | 803 | vcpu->arch.time_page = NULL; |
759 | } | 804 | } |
760 | 805 | ||
761 | kvm_write_guest_time(vcpu); | 806 | kvm_request_guest_time_update(vcpu); |
762 | break; | 807 | break; |
763 | } | 808 | } |
764 | default: | 809 | default: |
@@ -843,6 +888,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
843 | case MSR_IA32_LASTBRANCHTOIP: | 888 | case MSR_IA32_LASTBRANCHTOIP: |
844 | case MSR_IA32_LASTINTFROMIP: | 889 | case MSR_IA32_LASTINTFROMIP: |
845 | case MSR_IA32_LASTINTTOIP: | 890 | case MSR_IA32_LASTINTTOIP: |
891 | case MSR_VM_HSAVE_PA: | ||
846 | data = 0; | 892 | data = 0; |
847 | break; | 893 | break; |
848 | case MSR_MTRRcap: | 894 | case MSR_MTRRcap: |
@@ -967,10 +1013,13 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
967 | case KVM_CAP_MMU_SHADOW_CACHE_CONTROL: | 1013 | case KVM_CAP_MMU_SHADOW_CACHE_CONTROL: |
968 | case KVM_CAP_SET_TSS_ADDR: | 1014 | case KVM_CAP_SET_TSS_ADDR: |
969 | case KVM_CAP_EXT_CPUID: | 1015 | case KVM_CAP_EXT_CPUID: |
1016 | case KVM_CAP_CLOCKSOURCE: | ||
970 | case KVM_CAP_PIT: | 1017 | case KVM_CAP_PIT: |
971 | case KVM_CAP_NOP_IO_DELAY: | 1018 | case KVM_CAP_NOP_IO_DELAY: |
972 | case KVM_CAP_MP_STATE: | 1019 | case KVM_CAP_MP_STATE: |
973 | case KVM_CAP_SYNC_MMU: | 1020 | case KVM_CAP_SYNC_MMU: |
1021 | case KVM_CAP_REINJECT_CONTROL: | ||
1022 | case KVM_CAP_IRQ_INJECT_STATUS: | ||
974 | r = 1; | 1023 | r = 1; |
975 | break; | 1024 | break; |
976 | case KVM_CAP_COALESCED_MMIO: | 1025 | case KVM_CAP_COALESCED_MMIO: |
@@ -991,9 +1040,6 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
991 | case KVM_CAP_IOMMU: | 1040 | case KVM_CAP_IOMMU: |
992 | r = iommu_found(); | 1041 | r = iommu_found(); |
993 | break; | 1042 | break; |
994 | case KVM_CAP_CLOCKSOURCE: | ||
995 | r = boot_cpu_has(X86_FEATURE_CONSTANT_TSC); | ||
996 | break; | ||
997 | default: | 1043 | default: |
998 | r = 0; | 1044 | r = 0; |
999 | break; | 1045 | break; |
@@ -1044,7 +1090,7 @@ long kvm_arch_dev_ioctl(struct file *filp, | |||
1044 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) | 1090 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) |
1045 | goto out; | 1091 | goto out; |
1046 | r = kvm_dev_ioctl_get_supported_cpuid(&cpuid, | 1092 | r = kvm_dev_ioctl_get_supported_cpuid(&cpuid, |
1047 | cpuid_arg->entries); | 1093 | cpuid_arg->entries); |
1048 | if (r) | 1094 | if (r) |
1049 | goto out; | 1095 | goto out; |
1050 | 1096 | ||
@@ -1064,7 +1110,7 @@ out: | |||
1064 | void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | 1110 | void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
1065 | { | 1111 | { |
1066 | kvm_x86_ops->vcpu_load(vcpu, cpu); | 1112 | kvm_x86_ops->vcpu_load(vcpu, cpu); |
1067 | kvm_write_guest_time(vcpu); | 1113 | kvm_request_guest_time_update(vcpu); |
1068 | } | 1114 | } |
1069 | 1115 | ||
1070 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) | 1116 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) |
@@ -1142,8 +1188,8 @@ out: | |||
1142 | } | 1188 | } |
1143 | 1189 | ||
1144 | static int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, | 1190 | static int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu, |
1145 | struct kvm_cpuid2 *cpuid, | 1191 | struct kvm_cpuid2 *cpuid, |
1146 | struct kvm_cpuid_entry2 __user *entries) | 1192 | struct kvm_cpuid_entry2 __user *entries) |
1147 | { | 1193 | { |
1148 | int r; | 1194 | int r; |
1149 | 1195 | ||
@@ -1162,8 +1208,8 @@ out: | |||
1162 | } | 1208 | } |
1163 | 1209 | ||
1164 | static int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, | 1210 | static int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, |
1165 | struct kvm_cpuid2 *cpuid, | 1211 | struct kvm_cpuid2 *cpuid, |
1166 | struct kvm_cpuid_entry2 __user *entries) | 1212 | struct kvm_cpuid_entry2 __user *entries) |
1167 | { | 1213 | { |
1168 | int r; | 1214 | int r; |
1169 | 1215 | ||
@@ -1172,7 +1218,7 @@ static int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu, | |||
1172 | goto out; | 1218 | goto out; |
1173 | r = -EFAULT; | 1219 | r = -EFAULT; |
1174 | if (copy_to_user(entries, &vcpu->arch.cpuid_entries, | 1220 | if (copy_to_user(entries, &vcpu->arch.cpuid_entries, |
1175 | vcpu->arch.cpuid_nent * sizeof(struct kvm_cpuid_entry2))) | 1221 | vcpu->arch.cpuid_nent * sizeof(struct kvm_cpuid_entry2))) |
1176 | goto out; | 1222 | goto out; |
1177 | return 0; | 1223 | return 0; |
1178 | 1224 | ||
@@ -1181,18 +1227,13 @@ out: | |||
1181 | return r; | 1227 | return r; |
1182 | } | 1228 | } |
1183 | 1229 | ||
1184 | static inline u32 bit(int bitno) | ||
1185 | { | ||
1186 | return 1 << (bitno & 31); | ||
1187 | } | ||
1188 | |||
1189 | static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function, | 1230 | static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function, |
1190 | u32 index) | 1231 | u32 index) |
1191 | { | 1232 | { |
1192 | entry->function = function; | 1233 | entry->function = function; |
1193 | entry->index = index; | 1234 | entry->index = index; |
1194 | cpuid_count(entry->function, entry->index, | 1235 | cpuid_count(entry->function, entry->index, |
1195 | &entry->eax, &entry->ebx, &entry->ecx, &entry->edx); | 1236 | &entry->eax, &entry->ebx, &entry->ecx, &entry->edx); |
1196 | entry->flags = 0; | 1237 | entry->flags = 0; |
1197 | } | 1238 | } |
1198 | 1239 | ||
@@ -1222,15 +1263,17 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
1222 | #ifdef CONFIG_X86_64 | 1263 | #ifdef CONFIG_X86_64 |
1223 | bit(X86_FEATURE_LM) | | 1264 | bit(X86_FEATURE_LM) | |
1224 | #endif | 1265 | #endif |
1266 | bit(X86_FEATURE_FXSR_OPT) | | ||
1225 | bit(X86_FEATURE_MMXEXT) | | 1267 | bit(X86_FEATURE_MMXEXT) | |
1226 | bit(X86_FEATURE_3DNOWEXT) | | 1268 | bit(X86_FEATURE_3DNOWEXT) | |
1227 | bit(X86_FEATURE_3DNOW); | 1269 | bit(X86_FEATURE_3DNOW); |
1228 | const u32 kvm_supported_word3_x86_features = | 1270 | const u32 kvm_supported_word3_x86_features = |
1229 | bit(X86_FEATURE_XMM3) | bit(X86_FEATURE_CX16); | 1271 | bit(X86_FEATURE_XMM3) | bit(X86_FEATURE_CX16); |
1230 | const u32 kvm_supported_word6_x86_features = | 1272 | const u32 kvm_supported_word6_x86_features = |
1231 | bit(X86_FEATURE_LAHF_LM) | bit(X86_FEATURE_CMP_LEGACY); | 1273 | bit(X86_FEATURE_LAHF_LM) | bit(X86_FEATURE_CMP_LEGACY) | |
1274 | bit(X86_FEATURE_SVM); | ||
1232 | 1275 | ||
1233 | /* all func 2 cpuid_count() should be called on the same cpu */ | 1276 | /* all calls to cpuid_count() should be made on the same cpu */ |
1234 | get_cpu(); | 1277 | get_cpu(); |
1235 | do_cpuid_1_ent(entry, function, index); | 1278 | do_cpuid_1_ent(entry, function, index); |
1236 | ++*nent; | 1279 | ++*nent; |
@@ -1304,7 +1347,7 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
1304 | } | 1347 | } |
1305 | 1348 | ||
1306 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | 1349 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, |
1307 | struct kvm_cpuid_entry2 __user *entries) | 1350 | struct kvm_cpuid_entry2 __user *entries) |
1308 | { | 1351 | { |
1309 | struct kvm_cpuid_entry2 *cpuid_entries; | 1352 | struct kvm_cpuid_entry2 *cpuid_entries; |
1310 | int limit, nent = 0, r = -E2BIG; | 1353 | int limit, nent = 0, r = -E2BIG; |
@@ -1321,7 +1364,7 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | |||
1321 | limit = cpuid_entries[0].eax; | 1364 | limit = cpuid_entries[0].eax; |
1322 | for (func = 1; func <= limit && nent < cpuid->nent; ++func) | 1365 | for (func = 1; func <= limit && nent < cpuid->nent; ++func) |
1323 | do_cpuid_ent(&cpuid_entries[nent], func, 0, | 1366 | do_cpuid_ent(&cpuid_entries[nent], func, 0, |
1324 | &nent, cpuid->nent); | 1367 | &nent, cpuid->nent); |
1325 | r = -E2BIG; | 1368 | r = -E2BIG; |
1326 | if (nent >= cpuid->nent) | 1369 | if (nent >= cpuid->nent) |
1327 | goto out_free; | 1370 | goto out_free; |
@@ -1330,10 +1373,10 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | |||
1330 | limit = cpuid_entries[nent - 1].eax; | 1373 | limit = cpuid_entries[nent - 1].eax; |
1331 | for (func = 0x80000001; func <= limit && nent < cpuid->nent; ++func) | 1374 | for (func = 0x80000001; func <= limit && nent < cpuid->nent; ++func) |
1332 | do_cpuid_ent(&cpuid_entries[nent], func, 0, | 1375 | do_cpuid_ent(&cpuid_entries[nent], func, 0, |
1333 | &nent, cpuid->nent); | 1376 | &nent, cpuid->nent); |
1334 | r = -EFAULT; | 1377 | r = -EFAULT; |
1335 | if (copy_to_user(entries, cpuid_entries, | 1378 | if (copy_to_user(entries, cpuid_entries, |
1336 | nent * sizeof(struct kvm_cpuid_entry2))) | 1379 | nent * sizeof(struct kvm_cpuid_entry2))) |
1337 | goto out_free; | 1380 | goto out_free; |
1338 | cpuid->nent = nent; | 1381 | cpuid->nent = nent; |
1339 | r = 0; | 1382 | r = 0; |
@@ -1477,7 +1520,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
1477 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) | 1520 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) |
1478 | goto out; | 1521 | goto out; |
1479 | r = kvm_vcpu_ioctl_set_cpuid2(vcpu, &cpuid, | 1522 | r = kvm_vcpu_ioctl_set_cpuid2(vcpu, &cpuid, |
1480 | cpuid_arg->entries); | 1523 | cpuid_arg->entries); |
1481 | if (r) | 1524 | if (r) |
1482 | goto out; | 1525 | goto out; |
1483 | break; | 1526 | break; |
@@ -1490,7 +1533,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
1490 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) | 1533 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) |
1491 | goto out; | 1534 | goto out; |
1492 | r = kvm_vcpu_ioctl_get_cpuid2(vcpu, &cpuid, | 1535 | r = kvm_vcpu_ioctl_get_cpuid2(vcpu, &cpuid, |
1493 | cpuid_arg->entries); | 1536 | cpuid_arg->entries); |
1494 | if (r) | 1537 | if (r) |
1495 | goto out; | 1538 | goto out; |
1496 | r = -EFAULT; | 1539 | r = -EFAULT; |
@@ -1710,6 +1753,15 @@ static int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps) | |||
1710 | return r; | 1753 | return r; |
1711 | } | 1754 | } |
1712 | 1755 | ||
1756 | static int kvm_vm_ioctl_reinject(struct kvm *kvm, | ||
1757 | struct kvm_reinject_control *control) | ||
1758 | { | ||
1759 | if (!kvm->arch.vpit) | ||
1760 | return -ENXIO; | ||
1761 | kvm->arch.vpit->pit_state.pit_timer.reinject = control->pit_reinject; | ||
1762 | return 0; | ||
1763 | } | ||
1764 | |||
1713 | /* | 1765 | /* |
1714 | * Get (and clear) the dirty memory log for a memory slot. | 1766 | * Get (and clear) the dirty memory log for a memory slot. |
1715 | */ | 1767 | */ |
@@ -1807,13 +1859,26 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
1807 | } | 1859 | } |
1808 | } else | 1860 | } else |
1809 | goto out; | 1861 | goto out; |
1862 | r = kvm_setup_default_irq_routing(kvm); | ||
1863 | if (r) { | ||
1864 | kfree(kvm->arch.vpic); | ||
1865 | kfree(kvm->arch.vioapic); | ||
1866 | goto out; | ||
1867 | } | ||
1810 | break; | 1868 | break; |
1811 | case KVM_CREATE_PIT: | 1869 | case KVM_CREATE_PIT: |
1870 | mutex_lock(&kvm->lock); | ||
1871 | r = -EEXIST; | ||
1872 | if (kvm->arch.vpit) | ||
1873 | goto create_pit_unlock; | ||
1812 | r = -ENOMEM; | 1874 | r = -ENOMEM; |
1813 | kvm->arch.vpit = kvm_create_pit(kvm); | 1875 | kvm->arch.vpit = kvm_create_pit(kvm); |
1814 | if (kvm->arch.vpit) | 1876 | if (kvm->arch.vpit) |
1815 | r = 0; | 1877 | r = 0; |
1878 | create_pit_unlock: | ||
1879 | mutex_unlock(&kvm->lock); | ||
1816 | break; | 1880 | break; |
1881 | case KVM_IRQ_LINE_STATUS: | ||
1817 | case KVM_IRQ_LINE: { | 1882 | case KVM_IRQ_LINE: { |
1818 | struct kvm_irq_level irq_event; | 1883 | struct kvm_irq_level irq_event; |
1819 | 1884 | ||
@@ -1821,10 +1886,17 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
1821 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) | 1886 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) |
1822 | goto out; | 1887 | goto out; |
1823 | if (irqchip_in_kernel(kvm)) { | 1888 | if (irqchip_in_kernel(kvm)) { |
1889 | __s32 status; | ||
1824 | mutex_lock(&kvm->lock); | 1890 | mutex_lock(&kvm->lock); |
1825 | kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, | 1891 | status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, |
1826 | irq_event.irq, irq_event.level); | 1892 | irq_event.irq, irq_event.level); |
1827 | mutex_unlock(&kvm->lock); | 1893 | mutex_unlock(&kvm->lock); |
1894 | if (ioctl == KVM_IRQ_LINE_STATUS) { | ||
1895 | irq_event.status = status; | ||
1896 | if (copy_to_user(argp, &irq_event, | ||
1897 | sizeof irq_event)) | ||
1898 | goto out; | ||
1899 | } | ||
1828 | r = 0; | 1900 | r = 0; |
1829 | } | 1901 | } |
1830 | break; | 1902 | break; |
@@ -1907,6 +1979,17 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
1907 | r = 0; | 1979 | r = 0; |
1908 | break; | 1980 | break; |
1909 | } | 1981 | } |
1982 | case KVM_REINJECT_CONTROL: { | ||
1983 | struct kvm_reinject_control control; | ||
1984 | r = -EFAULT; | ||
1985 | if (copy_from_user(&control, argp, sizeof(control))) | ||
1986 | goto out; | ||
1987 | r = kvm_vm_ioctl_reinject(kvm, &control); | ||
1988 | if (r) | ||
1989 | goto out; | ||
1990 | r = 0; | ||
1991 | break; | ||
1992 | } | ||
1910 | default: | 1993 | default: |
1911 | ; | 1994 | ; |
1912 | } | 1995 | } |
@@ -1960,10 +2043,38 @@ static struct kvm_io_device *vcpu_find_mmio_dev(struct kvm_vcpu *vcpu, | |||
1960 | return dev; | 2043 | return dev; |
1961 | } | 2044 | } |
1962 | 2045 | ||
1963 | int emulator_read_std(unsigned long addr, | 2046 | static int kvm_read_guest_virt(gva_t addr, void *val, unsigned int bytes, |
1964 | void *val, | 2047 | struct kvm_vcpu *vcpu) |
1965 | unsigned int bytes, | 2048 | { |
1966 | struct kvm_vcpu *vcpu) | 2049 | void *data = val; |
2050 | int r = X86EMUL_CONTINUE; | ||
2051 | |||
2052 | while (bytes) { | ||
2053 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); | ||
2054 | unsigned offset = addr & (PAGE_SIZE-1); | ||
2055 | unsigned toread = min(bytes, (unsigned)PAGE_SIZE - offset); | ||
2056 | int ret; | ||
2057 | |||
2058 | if (gpa == UNMAPPED_GVA) { | ||
2059 | r = X86EMUL_PROPAGATE_FAULT; | ||
2060 | goto out; | ||
2061 | } | ||
2062 | ret = kvm_read_guest(vcpu->kvm, gpa, data, toread); | ||
2063 | if (ret < 0) { | ||
2064 | r = X86EMUL_UNHANDLEABLE; | ||
2065 | goto out; | ||
2066 | } | ||
2067 | |||
2068 | bytes -= toread; | ||
2069 | data += toread; | ||
2070 | addr += toread; | ||
2071 | } | ||
2072 | out: | ||
2073 | return r; | ||
2074 | } | ||
2075 | |||
2076 | static int kvm_write_guest_virt(gva_t addr, void *val, unsigned int bytes, | ||
2077 | struct kvm_vcpu *vcpu) | ||
1967 | { | 2078 | { |
1968 | void *data = val; | 2079 | void *data = val; |
1969 | int r = X86EMUL_CONTINUE; | 2080 | int r = X86EMUL_CONTINUE; |
@@ -1971,27 +2082,27 @@ int emulator_read_std(unsigned long addr, | |||
1971 | while (bytes) { | 2082 | while (bytes) { |
1972 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); | 2083 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); |
1973 | unsigned offset = addr & (PAGE_SIZE-1); | 2084 | unsigned offset = addr & (PAGE_SIZE-1); |
1974 | unsigned tocopy = min(bytes, (unsigned)PAGE_SIZE - offset); | 2085 | unsigned towrite = min(bytes, (unsigned)PAGE_SIZE - offset); |
1975 | int ret; | 2086 | int ret; |
1976 | 2087 | ||
1977 | if (gpa == UNMAPPED_GVA) { | 2088 | if (gpa == UNMAPPED_GVA) { |
1978 | r = X86EMUL_PROPAGATE_FAULT; | 2089 | r = X86EMUL_PROPAGATE_FAULT; |
1979 | goto out; | 2090 | goto out; |
1980 | } | 2091 | } |
1981 | ret = kvm_read_guest(vcpu->kvm, gpa, data, tocopy); | 2092 | ret = kvm_write_guest(vcpu->kvm, gpa, data, towrite); |
1982 | if (ret < 0) { | 2093 | if (ret < 0) { |
1983 | r = X86EMUL_UNHANDLEABLE; | 2094 | r = X86EMUL_UNHANDLEABLE; |
1984 | goto out; | 2095 | goto out; |
1985 | } | 2096 | } |
1986 | 2097 | ||
1987 | bytes -= tocopy; | 2098 | bytes -= towrite; |
1988 | data += tocopy; | 2099 | data += towrite; |
1989 | addr += tocopy; | 2100 | addr += towrite; |
1990 | } | 2101 | } |
1991 | out: | 2102 | out: |
1992 | return r; | 2103 | return r; |
1993 | } | 2104 | } |
1994 | EXPORT_SYMBOL_GPL(emulator_read_std); | 2105 | |
1995 | 2106 | ||
1996 | static int emulator_read_emulated(unsigned long addr, | 2107 | static int emulator_read_emulated(unsigned long addr, |
1997 | void *val, | 2108 | void *val, |
@@ -2013,8 +2124,8 @@ static int emulator_read_emulated(unsigned long addr, | |||
2013 | if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE) | 2124 | if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE) |
2014 | goto mmio; | 2125 | goto mmio; |
2015 | 2126 | ||
2016 | if (emulator_read_std(addr, val, bytes, vcpu) | 2127 | if (kvm_read_guest_virt(addr, val, bytes, vcpu) |
2017 | == X86EMUL_CONTINUE) | 2128 | == X86EMUL_CONTINUE) |
2018 | return X86EMUL_CONTINUE; | 2129 | return X86EMUL_CONTINUE; |
2019 | if (gpa == UNMAPPED_GVA) | 2130 | if (gpa == UNMAPPED_GVA) |
2020 | return X86EMUL_PROPAGATE_FAULT; | 2131 | return X86EMUL_PROPAGATE_FAULT; |
@@ -2217,7 +2328,7 @@ void kvm_report_emulation_failure(struct kvm_vcpu *vcpu, const char *context) | |||
2217 | 2328 | ||
2218 | rip_linear = rip + get_segment_base(vcpu, VCPU_SREG_CS); | 2329 | rip_linear = rip + get_segment_base(vcpu, VCPU_SREG_CS); |
2219 | 2330 | ||
2220 | emulator_read_std(rip_linear, (void *)opcodes, 4, vcpu); | 2331 | kvm_read_guest_virt(rip_linear, (void *)opcodes, 4, vcpu); |
2221 | 2332 | ||
2222 | printk(KERN_ERR "emulation failed (%s) rip %lx %02x %02x %02x %02x\n", | 2333 | printk(KERN_ERR "emulation failed (%s) rip %lx %02x %02x %02x %02x\n", |
2223 | context, rip, opcodes[0], opcodes[1], opcodes[2], opcodes[3]); | 2334 | context, rip, opcodes[0], opcodes[1], opcodes[2], opcodes[3]); |
@@ -2225,7 +2336,7 @@ void kvm_report_emulation_failure(struct kvm_vcpu *vcpu, const char *context) | |||
2225 | EXPORT_SYMBOL_GPL(kvm_report_emulation_failure); | 2336 | EXPORT_SYMBOL_GPL(kvm_report_emulation_failure); |
2226 | 2337 | ||
2227 | static struct x86_emulate_ops emulate_ops = { | 2338 | static struct x86_emulate_ops emulate_ops = { |
2228 | .read_std = emulator_read_std, | 2339 | .read_std = kvm_read_guest_virt, |
2229 | .read_emulated = emulator_read_emulated, | 2340 | .read_emulated = emulator_read_emulated, |
2230 | .write_emulated = emulator_write_emulated, | 2341 | .write_emulated = emulator_write_emulated, |
2231 | .cmpxchg_emulated = emulator_cmpxchg_emulated, | 2342 | .cmpxchg_emulated = emulator_cmpxchg_emulated, |
@@ -2327,40 +2438,19 @@ int emulate_instruction(struct kvm_vcpu *vcpu, | |||
2327 | } | 2438 | } |
2328 | EXPORT_SYMBOL_GPL(emulate_instruction); | 2439 | EXPORT_SYMBOL_GPL(emulate_instruction); |
2329 | 2440 | ||
2330 | static void free_pio_guest_pages(struct kvm_vcpu *vcpu) | ||
2331 | { | ||
2332 | int i; | ||
2333 | |||
2334 | for (i = 0; i < ARRAY_SIZE(vcpu->arch.pio.guest_pages); ++i) | ||
2335 | if (vcpu->arch.pio.guest_pages[i]) { | ||
2336 | kvm_release_page_dirty(vcpu->arch.pio.guest_pages[i]); | ||
2337 | vcpu->arch.pio.guest_pages[i] = NULL; | ||
2338 | } | ||
2339 | } | ||
2340 | |||
2341 | static int pio_copy_data(struct kvm_vcpu *vcpu) | 2441 | static int pio_copy_data(struct kvm_vcpu *vcpu) |
2342 | { | 2442 | { |
2343 | void *p = vcpu->arch.pio_data; | 2443 | void *p = vcpu->arch.pio_data; |
2344 | void *q; | 2444 | gva_t q = vcpu->arch.pio.guest_gva; |
2345 | unsigned bytes; | 2445 | unsigned bytes; |
2346 | int nr_pages = vcpu->arch.pio.guest_pages[1] ? 2 : 1; | 2446 | int ret; |
2347 | 2447 | ||
2348 | q = vmap(vcpu->arch.pio.guest_pages, nr_pages, VM_READ|VM_WRITE, | ||
2349 | PAGE_KERNEL); | ||
2350 | if (!q) { | ||
2351 | free_pio_guest_pages(vcpu); | ||
2352 | return -ENOMEM; | ||
2353 | } | ||
2354 | q += vcpu->arch.pio.guest_page_offset; | ||
2355 | bytes = vcpu->arch.pio.size * vcpu->arch.pio.cur_count; | 2448 | bytes = vcpu->arch.pio.size * vcpu->arch.pio.cur_count; |
2356 | if (vcpu->arch.pio.in) | 2449 | if (vcpu->arch.pio.in) |
2357 | memcpy(q, p, bytes); | 2450 | ret = kvm_write_guest_virt(q, p, bytes, vcpu); |
2358 | else | 2451 | else |
2359 | memcpy(p, q, bytes); | 2452 | ret = kvm_read_guest_virt(q, p, bytes, vcpu); |
2360 | q -= vcpu->arch.pio.guest_page_offset; | 2453 | return ret; |
2361 | vunmap(q); | ||
2362 | free_pio_guest_pages(vcpu); | ||
2363 | return 0; | ||
2364 | } | 2454 | } |
2365 | 2455 | ||
2366 | int complete_pio(struct kvm_vcpu *vcpu) | 2456 | int complete_pio(struct kvm_vcpu *vcpu) |
@@ -2471,7 +2561,6 @@ int kvm_emulate_pio(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2471 | vcpu->arch.pio.in = in; | 2561 | vcpu->arch.pio.in = in; |
2472 | vcpu->arch.pio.string = 0; | 2562 | vcpu->arch.pio.string = 0; |
2473 | vcpu->arch.pio.down = 0; | 2563 | vcpu->arch.pio.down = 0; |
2474 | vcpu->arch.pio.guest_page_offset = 0; | ||
2475 | vcpu->arch.pio.rep = 0; | 2564 | vcpu->arch.pio.rep = 0; |
2476 | 2565 | ||
2477 | if (vcpu->run->io.direction == KVM_EXIT_IO_IN) | 2566 | if (vcpu->run->io.direction == KVM_EXIT_IO_IN) |
@@ -2499,9 +2588,7 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2499 | gva_t address, int rep, unsigned port) | 2588 | gva_t address, int rep, unsigned port) |
2500 | { | 2589 | { |
2501 | unsigned now, in_page; | 2590 | unsigned now, in_page; |
2502 | int i, ret = 0; | 2591 | int ret = 0; |
2503 | int nr_pages = 1; | ||
2504 | struct page *page; | ||
2505 | struct kvm_io_device *pio_dev; | 2592 | struct kvm_io_device *pio_dev; |
2506 | 2593 | ||
2507 | vcpu->run->exit_reason = KVM_EXIT_IO; | 2594 | vcpu->run->exit_reason = KVM_EXIT_IO; |
@@ -2513,7 +2600,6 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2513 | vcpu->arch.pio.in = in; | 2600 | vcpu->arch.pio.in = in; |
2514 | vcpu->arch.pio.string = 1; | 2601 | vcpu->arch.pio.string = 1; |
2515 | vcpu->arch.pio.down = down; | 2602 | vcpu->arch.pio.down = down; |
2516 | vcpu->arch.pio.guest_page_offset = offset_in_page(address); | ||
2517 | vcpu->arch.pio.rep = rep; | 2603 | vcpu->arch.pio.rep = rep; |
2518 | 2604 | ||
2519 | if (vcpu->run->io.direction == KVM_EXIT_IO_IN) | 2605 | if (vcpu->run->io.direction == KVM_EXIT_IO_IN) |
@@ -2533,15 +2619,8 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2533 | else | 2619 | else |
2534 | in_page = offset_in_page(address) + size; | 2620 | in_page = offset_in_page(address) + size; |
2535 | now = min(count, (unsigned long)in_page / size); | 2621 | now = min(count, (unsigned long)in_page / size); |
2536 | if (!now) { | 2622 | if (!now) |
2537 | /* | ||
2538 | * String I/O straddles page boundary. Pin two guest pages | ||
2539 | * so that we satisfy atomicity constraints. Do just one | ||
2540 | * transaction to avoid complexity. | ||
2541 | */ | ||
2542 | nr_pages = 2; | ||
2543 | now = 1; | 2623 | now = 1; |
2544 | } | ||
2545 | if (down) { | 2624 | if (down) { |
2546 | /* | 2625 | /* |
2547 | * String I/O in reverse. Yuck. Kill the guest, fix later. | 2626 | * String I/O in reverse. Yuck. Kill the guest, fix later. |
@@ -2556,15 +2635,7 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2556 | if (vcpu->arch.pio.cur_count == vcpu->arch.pio.count) | 2635 | if (vcpu->arch.pio.cur_count == vcpu->arch.pio.count) |
2557 | kvm_x86_ops->skip_emulated_instruction(vcpu); | 2636 | kvm_x86_ops->skip_emulated_instruction(vcpu); |
2558 | 2637 | ||
2559 | for (i = 0; i < nr_pages; ++i) { | 2638 | vcpu->arch.pio.guest_gva = address; |
2560 | page = gva_to_page(vcpu, address + i * PAGE_SIZE); | ||
2561 | vcpu->arch.pio.guest_pages[i] = page; | ||
2562 | if (!page) { | ||
2563 | kvm_inject_gp(vcpu, 0); | ||
2564 | free_pio_guest_pages(vcpu); | ||
2565 | return 1; | ||
2566 | } | ||
2567 | } | ||
2568 | 2639 | ||
2569 | pio_dev = vcpu_find_pio_dev(vcpu, port, | 2640 | pio_dev = vcpu_find_pio_dev(vcpu, port, |
2570 | vcpu->arch.pio.cur_count, | 2641 | vcpu->arch.pio.cur_count, |
@@ -2572,7 +2643,11 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2572 | if (!vcpu->arch.pio.in) { | 2643 | if (!vcpu->arch.pio.in) { |
2573 | /* string PIO write */ | 2644 | /* string PIO write */ |
2574 | ret = pio_copy_data(vcpu); | 2645 | ret = pio_copy_data(vcpu); |
2575 | if (ret >= 0 && pio_dev) { | 2646 | if (ret == X86EMUL_PROPAGATE_FAULT) { |
2647 | kvm_inject_gp(vcpu, 0); | ||
2648 | return 1; | ||
2649 | } | ||
2650 | if (ret == 0 && pio_dev) { | ||
2576 | pio_string_write(pio_dev, vcpu); | 2651 | pio_string_write(pio_dev, vcpu); |
2577 | complete_pio(vcpu); | 2652 | complete_pio(vcpu); |
2578 | if (vcpu->arch.pio.count == 0) | 2653 | if (vcpu->arch.pio.count == 0) |
@@ -2587,9 +2662,72 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2587 | } | 2662 | } |
2588 | EXPORT_SYMBOL_GPL(kvm_emulate_pio_string); | 2663 | EXPORT_SYMBOL_GPL(kvm_emulate_pio_string); |
2589 | 2664 | ||
2665 | static void bounce_off(void *info) | ||
2666 | { | ||
2667 | /* nothing */ | ||
2668 | } | ||
2669 | |||
2670 | static unsigned int ref_freq; | ||
2671 | static unsigned long tsc_khz_ref; | ||
2672 | |||
2673 | static int kvmclock_cpufreq_notifier(struct notifier_block *nb, unsigned long val, | ||
2674 | void *data) | ||
2675 | { | ||
2676 | struct cpufreq_freqs *freq = data; | ||
2677 | struct kvm *kvm; | ||
2678 | struct kvm_vcpu *vcpu; | ||
2679 | int i, send_ipi = 0; | ||
2680 | |||
2681 | if (!ref_freq) | ||
2682 | ref_freq = freq->old; | ||
2683 | |||
2684 | if (val == CPUFREQ_PRECHANGE && freq->old > freq->new) | ||
2685 | return 0; | ||
2686 | if (val == CPUFREQ_POSTCHANGE && freq->old < freq->new) | ||
2687 | return 0; | ||
2688 | per_cpu(cpu_tsc_khz, freq->cpu) = cpufreq_scale(tsc_khz_ref, ref_freq, freq->new); | ||
2689 | |||
2690 | spin_lock(&kvm_lock); | ||
2691 | list_for_each_entry(kvm, &vm_list, vm_list) { | ||
2692 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | ||
2693 | vcpu = kvm->vcpus[i]; | ||
2694 | if (!vcpu) | ||
2695 | continue; | ||
2696 | if (vcpu->cpu != freq->cpu) | ||
2697 | continue; | ||
2698 | if (!kvm_request_guest_time_update(vcpu)) | ||
2699 | continue; | ||
2700 | if (vcpu->cpu != smp_processor_id()) | ||
2701 | send_ipi++; | ||
2702 | } | ||
2703 | } | ||
2704 | spin_unlock(&kvm_lock); | ||
2705 | |||
2706 | if (freq->old < freq->new && send_ipi) { | ||
2707 | /* | ||
2708 | * We upscale the frequency. Must make the guest | ||
2709 | * doesn't see old kvmclock values while running with | ||
2710 | * the new frequency, otherwise we risk the guest sees | ||
2711 | * time go backwards. | ||
2712 | * | ||
2713 | * In case we update the frequency for another cpu | ||
2714 | * (which might be in guest context) send an interrupt | ||
2715 | * to kick the cpu out of guest context. Next time | ||
2716 | * guest context is entered kvmclock will be updated, | ||
2717 | * so the guest will not see stale values. | ||
2718 | */ | ||
2719 | smp_call_function_single(freq->cpu, bounce_off, NULL, 1); | ||
2720 | } | ||
2721 | return 0; | ||
2722 | } | ||
2723 | |||
2724 | static struct notifier_block kvmclock_cpufreq_notifier_block = { | ||
2725 | .notifier_call = kvmclock_cpufreq_notifier | ||
2726 | }; | ||
2727 | |||
2590 | int kvm_arch_init(void *opaque) | 2728 | int kvm_arch_init(void *opaque) |
2591 | { | 2729 | { |
2592 | int r; | 2730 | int r, cpu; |
2593 | struct kvm_x86_ops *ops = (struct kvm_x86_ops *)opaque; | 2731 | struct kvm_x86_ops *ops = (struct kvm_x86_ops *)opaque; |
2594 | 2732 | ||
2595 | if (kvm_x86_ops) { | 2733 | if (kvm_x86_ops) { |
@@ -2620,6 +2758,15 @@ int kvm_arch_init(void *opaque) | |||
2620 | kvm_mmu_set_base_ptes(PT_PRESENT_MASK); | 2758 | kvm_mmu_set_base_ptes(PT_PRESENT_MASK); |
2621 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, | 2759 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, |
2622 | PT_DIRTY_MASK, PT64_NX_MASK, 0, 0); | 2760 | PT_DIRTY_MASK, PT64_NX_MASK, 0, 0); |
2761 | |||
2762 | for_each_possible_cpu(cpu) | ||
2763 | per_cpu(cpu_tsc_khz, cpu) = tsc_khz; | ||
2764 | if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) { | ||
2765 | tsc_khz_ref = tsc_khz; | ||
2766 | cpufreq_register_notifier(&kvmclock_cpufreq_notifier_block, | ||
2767 | CPUFREQ_TRANSITION_NOTIFIER); | ||
2768 | } | ||
2769 | |||
2623 | return 0; | 2770 | return 0; |
2624 | 2771 | ||
2625 | out: | 2772 | out: |
@@ -2827,25 +2974,20 @@ static int is_matching_cpuid_entry(struct kvm_cpuid_entry2 *e, | |||
2827 | if ((e->flags & KVM_CPUID_FLAG_SIGNIFCANT_INDEX) && e->index != index) | 2974 | if ((e->flags & KVM_CPUID_FLAG_SIGNIFCANT_INDEX) && e->index != index) |
2828 | return 0; | 2975 | return 0; |
2829 | if ((e->flags & KVM_CPUID_FLAG_STATEFUL_FUNC) && | 2976 | if ((e->flags & KVM_CPUID_FLAG_STATEFUL_FUNC) && |
2830 | !(e->flags & KVM_CPUID_FLAG_STATE_READ_NEXT)) | 2977 | !(e->flags & KVM_CPUID_FLAG_STATE_READ_NEXT)) |
2831 | return 0; | 2978 | return 0; |
2832 | return 1; | 2979 | return 1; |
2833 | } | 2980 | } |
2834 | 2981 | ||
2835 | void kvm_emulate_cpuid(struct kvm_vcpu *vcpu) | 2982 | struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, |
2983 | u32 function, u32 index) | ||
2836 | { | 2984 | { |
2837 | int i; | 2985 | int i; |
2838 | u32 function, index; | 2986 | struct kvm_cpuid_entry2 *best = NULL; |
2839 | struct kvm_cpuid_entry2 *e, *best; | ||
2840 | 2987 | ||
2841 | function = kvm_register_read(vcpu, VCPU_REGS_RAX); | ||
2842 | index = kvm_register_read(vcpu, VCPU_REGS_RCX); | ||
2843 | kvm_register_write(vcpu, VCPU_REGS_RAX, 0); | ||
2844 | kvm_register_write(vcpu, VCPU_REGS_RBX, 0); | ||
2845 | kvm_register_write(vcpu, VCPU_REGS_RCX, 0); | ||
2846 | kvm_register_write(vcpu, VCPU_REGS_RDX, 0); | ||
2847 | best = NULL; | ||
2848 | for (i = 0; i < vcpu->arch.cpuid_nent; ++i) { | 2988 | for (i = 0; i < vcpu->arch.cpuid_nent; ++i) { |
2989 | struct kvm_cpuid_entry2 *e; | ||
2990 | |||
2849 | e = &vcpu->arch.cpuid_entries[i]; | 2991 | e = &vcpu->arch.cpuid_entries[i]; |
2850 | if (is_matching_cpuid_entry(e, function, index)) { | 2992 | if (is_matching_cpuid_entry(e, function, index)) { |
2851 | if (e->flags & KVM_CPUID_FLAG_STATEFUL_FUNC) | 2993 | if (e->flags & KVM_CPUID_FLAG_STATEFUL_FUNC) |
@@ -2860,6 +3002,21 @@ void kvm_emulate_cpuid(struct kvm_vcpu *vcpu) | |||
2860 | if (!best || e->function > best->function) | 3002 | if (!best || e->function > best->function) |
2861 | best = e; | 3003 | best = e; |
2862 | } | 3004 | } |
3005 | return best; | ||
3006 | } | ||
3007 | |||
3008 | void kvm_emulate_cpuid(struct kvm_vcpu *vcpu) | ||
3009 | { | ||
3010 | u32 function, index; | ||
3011 | struct kvm_cpuid_entry2 *best; | ||
3012 | |||
3013 | function = kvm_register_read(vcpu, VCPU_REGS_RAX); | ||
3014 | index = kvm_register_read(vcpu, VCPU_REGS_RCX); | ||
3015 | kvm_register_write(vcpu, VCPU_REGS_RAX, 0); | ||
3016 | kvm_register_write(vcpu, VCPU_REGS_RBX, 0); | ||
3017 | kvm_register_write(vcpu, VCPU_REGS_RCX, 0); | ||
3018 | kvm_register_write(vcpu, VCPU_REGS_RDX, 0); | ||
3019 | best = kvm_find_cpuid_entry(vcpu, function, index); | ||
2863 | if (best) { | 3020 | if (best) { |
2864 | kvm_register_write(vcpu, VCPU_REGS_RAX, best->eax); | 3021 | kvm_register_write(vcpu, VCPU_REGS_RAX, best->eax); |
2865 | kvm_register_write(vcpu, VCPU_REGS_RBX, best->ebx); | 3022 | kvm_register_write(vcpu, VCPU_REGS_RBX, best->ebx); |
@@ -2945,6 +3102,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2945 | if (vcpu->requests) { | 3102 | if (vcpu->requests) { |
2946 | if (test_and_clear_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests)) | 3103 | if (test_and_clear_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests)) |
2947 | __kvm_migrate_timers(vcpu); | 3104 | __kvm_migrate_timers(vcpu); |
3105 | if (test_and_clear_bit(KVM_REQ_KVMCLOCK_UPDATE, &vcpu->requests)) | ||
3106 | kvm_write_guest_time(vcpu); | ||
2948 | if (test_and_clear_bit(KVM_REQ_MMU_SYNC, &vcpu->requests)) | 3107 | if (test_and_clear_bit(KVM_REQ_MMU_SYNC, &vcpu->requests)) |
2949 | kvm_mmu_sync_roots(vcpu); | 3108 | kvm_mmu_sync_roots(vcpu); |
2950 | if (test_and_clear_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests)) | 3109 | if (test_and_clear_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests)) |
@@ -2979,9 +3138,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2979 | goto out; | 3138 | goto out; |
2980 | } | 3139 | } |
2981 | 3140 | ||
2982 | if (vcpu->guest_debug.enabled) | ||
2983 | kvm_x86_ops->guest_debug_pre(vcpu); | ||
2984 | |||
2985 | vcpu->guest_mode = 1; | 3141 | vcpu->guest_mode = 1; |
2986 | /* | 3142 | /* |
2987 | * Make sure that guest_mode assignment won't happen after | 3143 | * Make sure that guest_mode assignment won't happen after |
@@ -3002,10 +3158,34 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3002 | 3158 | ||
3003 | kvm_guest_enter(); | 3159 | kvm_guest_enter(); |
3004 | 3160 | ||
3161 | get_debugreg(vcpu->arch.host_dr6, 6); | ||
3162 | get_debugreg(vcpu->arch.host_dr7, 7); | ||
3163 | if (unlikely(vcpu->arch.switch_db_regs)) { | ||
3164 | get_debugreg(vcpu->arch.host_db[0], 0); | ||
3165 | get_debugreg(vcpu->arch.host_db[1], 1); | ||
3166 | get_debugreg(vcpu->arch.host_db[2], 2); | ||
3167 | get_debugreg(vcpu->arch.host_db[3], 3); | ||
3168 | |||
3169 | set_debugreg(0, 7); | ||
3170 | set_debugreg(vcpu->arch.eff_db[0], 0); | ||
3171 | set_debugreg(vcpu->arch.eff_db[1], 1); | ||
3172 | set_debugreg(vcpu->arch.eff_db[2], 2); | ||
3173 | set_debugreg(vcpu->arch.eff_db[3], 3); | ||
3174 | } | ||
3005 | 3175 | ||
3006 | KVMTRACE_0D(VMENTRY, vcpu, entryexit); | 3176 | KVMTRACE_0D(VMENTRY, vcpu, entryexit); |
3007 | kvm_x86_ops->run(vcpu, kvm_run); | 3177 | kvm_x86_ops->run(vcpu, kvm_run); |
3008 | 3178 | ||
3179 | if (unlikely(vcpu->arch.switch_db_regs)) { | ||
3180 | set_debugreg(0, 7); | ||
3181 | set_debugreg(vcpu->arch.host_db[0], 0); | ||
3182 | set_debugreg(vcpu->arch.host_db[1], 1); | ||
3183 | set_debugreg(vcpu->arch.host_db[2], 2); | ||
3184 | set_debugreg(vcpu->arch.host_db[3], 3); | ||
3185 | } | ||
3186 | set_debugreg(vcpu->arch.host_dr6, 6); | ||
3187 | set_debugreg(vcpu->arch.host_dr7, 7); | ||
3188 | |||
3009 | vcpu->guest_mode = 0; | 3189 | vcpu->guest_mode = 0; |
3010 | local_irq_enable(); | 3190 | local_irq_enable(); |
3011 | 3191 | ||
@@ -3192,7 +3372,7 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
3192 | /* | 3372 | /* |
3193 | * Don't leak debug flags in case they were set for guest debugging | 3373 | * Don't leak debug flags in case they were set for guest debugging |
3194 | */ | 3374 | */ |
3195 | if (vcpu->guest_debug.enabled && vcpu->guest_debug.singlestep) | 3375 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) |
3196 | regs->rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF); | 3376 | regs->rflags &= ~(X86_EFLAGS_TF | X86_EFLAGS_RF); |
3197 | 3377 | ||
3198 | vcpu_put(vcpu); | 3378 | vcpu_put(vcpu); |
@@ -3811,15 +3991,32 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
3811 | return 0; | 3991 | return 0; |
3812 | } | 3992 | } |
3813 | 3993 | ||
3814 | int kvm_arch_vcpu_ioctl_debug_guest(struct kvm_vcpu *vcpu, | 3994 | int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, |
3815 | struct kvm_debug_guest *dbg) | 3995 | struct kvm_guest_debug *dbg) |
3816 | { | 3996 | { |
3817 | int r; | 3997 | int i, r; |
3818 | 3998 | ||
3819 | vcpu_load(vcpu); | 3999 | vcpu_load(vcpu); |
3820 | 4000 | ||
4001 | if ((dbg->control & (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP)) == | ||
4002 | (KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP)) { | ||
4003 | for (i = 0; i < KVM_NR_DB_REGS; ++i) | ||
4004 | vcpu->arch.eff_db[i] = dbg->arch.debugreg[i]; | ||
4005 | vcpu->arch.switch_db_regs = | ||
4006 | (dbg->arch.debugreg[7] & DR7_BP_EN_MASK); | ||
4007 | } else { | ||
4008 | for (i = 0; i < KVM_NR_DB_REGS; i++) | ||
4009 | vcpu->arch.eff_db[i] = vcpu->arch.db[i]; | ||
4010 | vcpu->arch.switch_db_regs = (vcpu->arch.dr7 & DR7_BP_EN_MASK); | ||
4011 | } | ||
4012 | |||
3821 | r = kvm_x86_ops->set_guest_debug(vcpu, dbg); | 4013 | r = kvm_x86_ops->set_guest_debug(vcpu, dbg); |
3822 | 4014 | ||
4015 | if (dbg->control & KVM_GUESTDBG_INJECT_DB) | ||
4016 | kvm_queue_exception(vcpu, DB_VECTOR); | ||
4017 | else if (dbg->control & KVM_GUESTDBG_INJECT_BP) | ||
4018 | kvm_queue_exception(vcpu, BP_VECTOR); | ||
4019 | |||
3823 | vcpu_put(vcpu); | 4020 | vcpu_put(vcpu); |
3824 | 4021 | ||
3825 | return r; | 4022 | return r; |
@@ -4007,6 +4204,11 @@ int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu) | |||
4007 | vcpu->arch.nmi_pending = false; | 4204 | vcpu->arch.nmi_pending = false; |
4008 | vcpu->arch.nmi_injected = false; | 4205 | vcpu->arch.nmi_injected = false; |
4009 | 4206 | ||
4207 | vcpu->arch.switch_db_regs = 0; | ||
4208 | memset(vcpu->arch.db, 0, sizeof(vcpu->arch.db)); | ||
4209 | vcpu->arch.dr6 = DR6_FIXED_1; | ||
4210 | vcpu->arch.dr7 = DR7_FIXED_1; | ||
4211 | |||
4010 | return kvm_x86_ops->vcpu_reset(vcpu); | 4212 | return kvm_x86_ops->vcpu_reset(vcpu); |
4011 | } | 4213 | } |
4012 | 4214 | ||
@@ -4100,6 +4302,8 @@ struct kvm *kvm_arch_create_vm(void) | |||
4100 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ | 4302 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ |
4101 | set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); | 4303 | set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); |
4102 | 4304 | ||
4305 | rdtscll(kvm->arch.vm_init_tsc); | ||
4306 | |||
4103 | return kvm; | 4307 | return kvm; |
4104 | } | 4308 | } |
4105 | 4309 | ||
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index d174db7a3370..ca91749d2083 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c | |||
@@ -178,7 +178,7 @@ static u32 opcode_table[256] = { | |||
178 | 0, ImplicitOps | Stack, 0, 0, | 178 | 0, ImplicitOps | Stack, 0, 0, |
179 | ByteOp | DstMem | SrcImm | ModRM | Mov, DstMem | SrcImm | ModRM | Mov, | 179 | ByteOp | DstMem | SrcImm | ModRM | Mov, DstMem | SrcImm | ModRM | Mov, |
180 | /* 0xC8 - 0xCF */ | 180 | /* 0xC8 - 0xCF */ |
181 | 0, 0, 0, 0, 0, 0, 0, 0, | 181 | 0, 0, 0, ImplicitOps | Stack, 0, 0, 0, 0, |
182 | /* 0xD0 - 0xD7 */ | 182 | /* 0xD0 - 0xD7 */ |
183 | ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM, | 183 | ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM, |
184 | ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM, | 184 | ByteOp | DstMem | SrcImplicit | ModRM, DstMem | SrcImplicit | ModRM, |
@@ -1136,18 +1136,19 @@ static inline void emulate_push(struct x86_emulate_ctxt *ctxt) | |||
1136 | } | 1136 | } |
1137 | 1137 | ||
1138 | static int emulate_pop(struct x86_emulate_ctxt *ctxt, | 1138 | static int emulate_pop(struct x86_emulate_ctxt *ctxt, |
1139 | struct x86_emulate_ops *ops) | 1139 | struct x86_emulate_ops *ops, |
1140 | void *dest, int len) | ||
1140 | { | 1141 | { |
1141 | struct decode_cache *c = &ctxt->decode; | 1142 | struct decode_cache *c = &ctxt->decode; |
1142 | int rc; | 1143 | int rc; |
1143 | 1144 | ||
1144 | rc = ops->read_emulated(register_address(c, ss_base(ctxt), | 1145 | rc = ops->read_emulated(register_address(c, ss_base(ctxt), |
1145 | c->regs[VCPU_REGS_RSP]), | 1146 | c->regs[VCPU_REGS_RSP]), |
1146 | &c->src.val, c->src.bytes, ctxt->vcpu); | 1147 | dest, len, ctxt->vcpu); |
1147 | if (rc != 0) | 1148 | if (rc != 0) |
1148 | return rc; | 1149 | return rc; |
1149 | 1150 | ||
1150 | register_address_increment(c, &c->regs[VCPU_REGS_RSP], c->src.bytes); | 1151 | register_address_increment(c, &c->regs[VCPU_REGS_RSP], len); |
1151 | return rc; | 1152 | return rc; |
1152 | } | 1153 | } |
1153 | 1154 | ||
@@ -1157,11 +1158,9 @@ static inline int emulate_grp1a(struct x86_emulate_ctxt *ctxt, | |||
1157 | struct decode_cache *c = &ctxt->decode; | 1158 | struct decode_cache *c = &ctxt->decode; |
1158 | int rc; | 1159 | int rc; |
1159 | 1160 | ||
1160 | c->src.bytes = c->dst.bytes; | 1161 | rc = emulate_pop(ctxt, ops, &c->dst.val, c->dst.bytes); |
1161 | rc = emulate_pop(ctxt, ops); | ||
1162 | if (rc != 0) | 1162 | if (rc != 0) |
1163 | return rc; | 1163 | return rc; |
1164 | c->dst.val = c->src.val; | ||
1165 | return 0; | 1164 | return 0; |
1166 | } | 1165 | } |
1167 | 1166 | ||
@@ -1279,6 +1278,25 @@ static inline int emulate_grp9(struct x86_emulate_ctxt *ctxt, | |||
1279 | return 0; | 1278 | return 0; |
1280 | } | 1279 | } |
1281 | 1280 | ||
1281 | static int emulate_ret_far(struct x86_emulate_ctxt *ctxt, | ||
1282 | struct x86_emulate_ops *ops) | ||
1283 | { | ||
1284 | struct decode_cache *c = &ctxt->decode; | ||
1285 | int rc; | ||
1286 | unsigned long cs; | ||
1287 | |||
1288 | rc = emulate_pop(ctxt, ops, &c->eip, c->op_bytes); | ||
1289 | if (rc) | ||
1290 | return rc; | ||
1291 | if (c->op_bytes == 4) | ||
1292 | c->eip = (u32)c->eip; | ||
1293 | rc = emulate_pop(ctxt, ops, &cs, c->op_bytes); | ||
1294 | if (rc) | ||
1295 | return rc; | ||
1296 | rc = kvm_load_segment_descriptor(ctxt->vcpu, (u16)cs, 1, VCPU_SREG_CS); | ||
1297 | return rc; | ||
1298 | } | ||
1299 | |||
1282 | static inline int writeback(struct x86_emulate_ctxt *ctxt, | 1300 | static inline int writeback(struct x86_emulate_ctxt *ctxt, |
1283 | struct x86_emulate_ops *ops) | 1301 | struct x86_emulate_ops *ops) |
1284 | { | 1302 | { |
@@ -1467,11 +1485,9 @@ special_insn: | |||
1467 | break; | 1485 | break; |
1468 | case 0x58 ... 0x5f: /* pop reg */ | 1486 | case 0x58 ... 0x5f: /* pop reg */ |
1469 | pop_instruction: | 1487 | pop_instruction: |
1470 | c->src.bytes = c->op_bytes; | 1488 | rc = emulate_pop(ctxt, ops, &c->dst.val, c->op_bytes); |
1471 | rc = emulate_pop(ctxt, ops); | ||
1472 | if (rc != 0) | 1489 | if (rc != 0) |
1473 | goto done; | 1490 | goto done; |
1474 | c->dst.val = c->src.val; | ||
1475 | break; | 1491 | break; |
1476 | case 0x63: /* movsxd */ | 1492 | case 0x63: /* movsxd */ |
1477 | if (ctxt->mode != X86EMUL_MODE_PROT64) | 1493 | if (ctxt->mode != X86EMUL_MODE_PROT64) |
@@ -1738,6 +1754,11 @@ special_insn: | |||
1738 | mov: | 1754 | mov: |
1739 | c->dst.val = c->src.val; | 1755 | c->dst.val = c->src.val; |
1740 | break; | 1756 | break; |
1757 | case 0xcb: /* ret far */ | ||
1758 | rc = emulate_ret_far(ctxt, ops); | ||
1759 | if (rc) | ||
1760 | goto done; | ||
1761 | break; | ||
1741 | case 0xd0 ... 0xd1: /* Grp2 */ | 1762 | case 0xd0 ... 0xd1: /* Grp2 */ |
1742 | c->src.val = 1; | 1763 | c->src.val = 1; |
1743 | emulate_grp2(ctxt); | 1764 | emulate_grp2(ctxt); |
@@ -1908,11 +1929,16 @@ twobyte_insn: | |||
1908 | c->dst.type = OP_NONE; | 1929 | c->dst.type = OP_NONE; |
1909 | break; | 1930 | break; |
1910 | case 3: /* lidt/vmmcall */ | 1931 | case 3: /* lidt/vmmcall */ |
1911 | if (c->modrm_mod == 3 && c->modrm_rm == 1) { | 1932 | if (c->modrm_mod == 3) { |
1912 | rc = kvm_fix_hypercall(ctxt->vcpu); | 1933 | switch (c->modrm_rm) { |
1913 | if (rc) | 1934 | case 1: |
1914 | goto done; | 1935 | rc = kvm_fix_hypercall(ctxt->vcpu); |
1915 | kvm_emulate_hypercall(ctxt->vcpu); | 1936 | if (rc) |
1937 | goto done; | ||
1938 | break; | ||
1939 | default: | ||
1940 | goto cannot_emulate; | ||
1941 | } | ||
1916 | } else { | 1942 | } else { |
1917 | rc = read_descriptor(ctxt, ops, c->src.ptr, | 1943 | rc = read_descriptor(ctxt, ops, c->src.ptr, |
1918 | &size, &address, | 1944 | &size, &address, |
diff --git a/arch/xtensa/include/asm/socket.h b/arch/xtensa/include/asm/socket.h index 6100682b1da2..dd1a7a4a1cea 100644 --- a/arch/xtensa/include/asm/socket.h +++ b/arch/xtensa/include/asm/socket.h | |||
@@ -65,4 +65,7 @@ | |||
65 | 65 | ||
66 | #define SO_MARK 36 | 66 | #define SO_MARK 36 |
67 | 67 | ||
68 | #define SO_TIMESTAMPING 37 | ||
69 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
70 | |||
68 | #endif /* _XTENSA_SOCKET_H */ | 71 | #endif /* _XTENSA_SOCKET_H */ |
diff --git a/arch/xtensa/kernel/irq.c b/arch/xtensa/kernel/irq.c index 5fbcde59a92d..f3b66fba5b8f 100644 --- a/arch/xtensa/kernel/irq.c +++ b/arch/xtensa/kernel/irq.c | |||
@@ -99,7 +99,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
99 | seq_printf(p, "%10u ", kstat_irqs(i)); | 99 | seq_printf(p, "%10u ", kstat_irqs(i)); |
100 | #else | 100 | #else |
101 | for_each_online_cpu(j) | 101 | for_each_online_cpu(j) |
102 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); | 102 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
103 | #endif | 103 | #endif |
104 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | 104 | seq_printf(p, " %14s", irq_desc[i].chip->typename); |
105 | seq_printf(p, " %s", action->name); | 105 | seq_printf(p, " %s", action->name); |