diff options
245 files changed, 4764 insertions, 1765 deletions
diff --git a/Documentation/scheduler/sched-design-CFS.txt b/Documentation/scheduler/sched-design-CFS.txt index 9d8eb553884c..eb471c7a905e 100644 --- a/Documentation/scheduler/sched-design-CFS.txt +++ b/Documentation/scheduler/sched-design-CFS.txt | |||
| @@ -92,7 +92,7 @@ other HZ detail. Thus the CFS scheduler has no notion of "timeslices" in the | |||
| 92 | way the previous scheduler had, and has no heuristics whatsoever. There is | 92 | way the previous scheduler had, and has no heuristics whatsoever. There is |
| 93 | only one central tunable (you have to switch on CONFIG_SCHED_DEBUG): | 93 | only one central tunable (you have to switch on CONFIG_SCHED_DEBUG): |
| 94 | 94 | ||
| 95 | /proc/sys/kernel/sched_granularity_ns | 95 | /proc/sys/kernel/sched_min_granularity_ns |
| 96 | 96 | ||
| 97 | which can be used to tune the scheduler from "desktop" (i.e., low latencies) to | 97 | which can be used to tune the scheduler from "desktop" (i.e., low latencies) to |
| 98 | "server" (i.e., good batching) workloads. It defaults to a setting suitable | 98 | "server" (i.e., good batching) workloads. It defaults to a setting suitable |
| @@ -536,7 +536,7 @@ KBUILD_CFLAGS += -g | |||
| 536 | KBUILD_AFLAGS += -gdwarf-2 | 536 | KBUILD_AFLAGS += -gdwarf-2 |
| 537 | endif | 537 | endif |
| 538 | 538 | ||
| 539 | ifdef CONFIG_FTRACE | 539 | ifdef CONFIG_FUNCTION_TRACER |
| 540 | KBUILD_CFLAGS += -pg | 540 | KBUILD_CFLAGS += -pg |
| 541 | endif | 541 | endif |
| 542 | 542 | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5021db2217ed..9722f8bb506c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -16,8 +16,7 @@ config ARM | |||
| 16 | select HAVE_ARCH_KGDB | 16 | select HAVE_ARCH_KGDB |
| 17 | select HAVE_KPROBES if (!XIP_KERNEL) | 17 | select HAVE_KPROBES if (!XIP_KERNEL) |
| 18 | select HAVE_KRETPROBES if (HAVE_KPROBES) | 18 | select HAVE_KRETPROBES if (HAVE_KPROBES) |
| 19 | select HAVE_FTRACE if (!XIP_KERNEL) | 19 | select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) |
| 20 | select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE) | ||
| 21 | select HAVE_GENERIC_DMA_COHERENT | 20 | select HAVE_GENERIC_DMA_COHERENT |
| 22 | help | 21 | help |
| 23 | The ARM series is a line of low-power-consumption RISC chip designs | 22 | The ARM series is a line of low-power-consumption RISC chip designs |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 7a03f2007882..c47f2a3f8f8f 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
| @@ -70,7 +70,7 @@ SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/ | |||
| 70 | targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \ | 70 | targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \ |
| 71 | head.o misc.o $(OBJS) | 71 | head.o misc.o $(OBJS) |
| 72 | 72 | ||
| 73 | ifeq ($(CONFIG_FTRACE),y) | 73 | ifeq ($(CONFIG_FUNCTION_TRACER),y) |
| 74 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 74 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| 75 | KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) | 75 | KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) |
| 76 | endif | 76 | endif |
diff --git a/arch/arm/common/sharpsl_pm.c b/arch/arm/common/sharpsl_pm.c index db8309161408..780bbf7cb26f 100644 --- a/arch/arm/common/sharpsl_pm.c +++ b/arch/arm/common/sharpsl_pm.c | |||
| @@ -54,11 +54,13 @@ | |||
| 54 | /* | 54 | /* |
| 55 | * Prototypes | 55 | * Prototypes |
| 56 | */ | 56 | */ |
| 57 | #ifdef CONFIG_PM | ||
| 57 | static int sharpsl_off_charge_battery(void); | 58 | static int sharpsl_off_charge_battery(void); |
| 58 | static int sharpsl_check_battery_temp(void); | ||
| 59 | static int sharpsl_check_battery_voltage(void); | 59 | static int sharpsl_check_battery_voltage(void); |
| 60 | static int sharpsl_ac_check(void); | ||
| 61 | static int sharpsl_fatal_check(void); | 60 | static int sharpsl_fatal_check(void); |
| 61 | #endif | ||
| 62 | static int sharpsl_check_battery_temp(void); | ||
| 63 | static int sharpsl_ac_check(void); | ||
| 62 | static int sharpsl_average_value(int ad); | 64 | static int sharpsl_average_value(int ad); |
| 63 | static void sharpsl_average_clear(void); | 65 | static void sharpsl_average_clear(void); |
| 64 | static void sharpsl_charge_toggle(struct work_struct *private_); | 66 | static void sharpsl_charge_toggle(struct work_struct *private_); |
| @@ -424,6 +426,7 @@ static int sharpsl_check_battery_temp(void) | |||
| 424 | return 0; | 426 | return 0; |
| 425 | } | 427 | } |
| 426 | 428 | ||
| 429 | #ifdef CONFIG_PM | ||
| 427 | static int sharpsl_check_battery_voltage(void) | 430 | static int sharpsl_check_battery_voltage(void) |
| 428 | { | 431 | { |
| 429 | int val, i, buff[5]; | 432 | int val, i, buff[5]; |
| @@ -455,6 +458,7 @@ static int sharpsl_check_battery_voltage(void) | |||
| 455 | 458 | ||
| 456 | return 0; | 459 | return 0; |
| 457 | } | 460 | } |
| 461 | #endif | ||
| 458 | 462 | ||
| 459 | static int sharpsl_ac_check(void) | 463 | static int sharpsl_ac_check(void) |
| 460 | { | 464 | { |
| @@ -586,8 +590,6 @@ static int corgi_pxa_pm_enter(suspend_state_t state) | |||
| 586 | 590 | ||
| 587 | return 0; | 591 | return 0; |
| 588 | } | 592 | } |
| 589 | #endif | ||
| 590 | |||
| 591 | 593 | ||
| 592 | /* | 594 | /* |
| 593 | * Check for fatal battery errors | 595 | * Check for fatal battery errors |
| @@ -738,7 +740,10 @@ static int sharpsl_off_charge_battery(void) | |||
| 738 | } | 740 | } |
| 739 | } | 741 | } |
| 740 | } | 742 | } |
| 741 | 743 | #else | |
| 744 | #define sharpsl_pm_suspend NULL | ||
| 745 | #define sharpsl_pm_resume NULL | ||
| 746 | #endif | ||
| 742 | 747 | ||
| 743 | static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf) | 748 | static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 744 | { | 749 | { |
| @@ -768,10 +773,12 @@ static void sharpsl_apm_get_power_status(struct apm_power_info *info) | |||
| 768 | info->battery_life = sharpsl_pm.battstat.mainbat_percent; | 773 | info->battery_life = sharpsl_pm.battstat.mainbat_percent; |
| 769 | } | 774 | } |
| 770 | 775 | ||
| 776 | #ifdef CONFIG_PM | ||
| 771 | static struct platform_suspend_ops sharpsl_pm_ops = { | 777 | static struct platform_suspend_ops sharpsl_pm_ops = { |
| 772 | .enter = corgi_pxa_pm_enter, | 778 | .enter = corgi_pxa_pm_enter, |
| 773 | .valid = suspend_valid_only_mem, | 779 | .valid = suspend_valid_only_mem, |
| 774 | }; | 780 | }; |
| 781 | #endif | ||
| 775 | 782 | ||
| 776 | static int __init sharpsl_pm_probe(struct platform_device *pdev) | 783 | static int __init sharpsl_pm_probe(struct platform_device *pdev) |
| 777 | { | 784 | { |
| @@ -802,7 +809,9 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev) | |||
| 802 | 809 | ||
| 803 | apm_get_power_status = sharpsl_apm_get_power_status; | 810 | apm_get_power_status = sharpsl_apm_get_power_status; |
| 804 | 811 | ||
| 812 | #ifdef CONFIG_PM | ||
| 805 | suspend_set_ops(&sharpsl_pm_ops); | 813 | suspend_set_ops(&sharpsl_pm_ops); |
| 814 | #endif | ||
| 806 | 815 | ||
| 807 | mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250)); | 816 | mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250)); |
| 808 | 817 | ||
diff --git a/arch/arm/include/asm/ftrace.h b/arch/arm/include/asm/ftrace.h index 584ef9a8e5a5..39c8bc1a006a 100644 --- a/arch/arm/include/asm/ftrace.h +++ b/arch/arm/include/asm/ftrace.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ASM_ARM_FTRACE | 1 | #ifndef _ASM_ARM_FTRACE |
| 2 | #define _ASM_ARM_FTRACE | 2 | #define _ASM_ARM_FTRACE |
| 3 | 3 | ||
| 4 | #ifdef CONFIG_FTRACE | 4 | #ifdef CONFIG_FUNCTION_TRACER |
| 5 | #define MCOUNT_ADDR ((long)(mcount)) | 5 | #define MCOUNT_ADDR ((long)(mcount)) |
| 6 | #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ | 6 | #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ |
| 7 | 7 | ||
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index 2357b1cf1cf9..c74f766ffc12 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
| @@ -183,6 +183,6 @@ EXPORT_SYMBOL(_find_next_bit_be); | |||
| 183 | 183 | ||
| 184 | EXPORT_SYMBOL(copy_page); | 184 | EXPORT_SYMBOL(copy_page); |
| 185 | 185 | ||
| 186 | #ifdef CONFIG_FTRACE | 186 | #ifdef CONFIG_FUNCTION_TRACER |
| 187 | EXPORT_SYMBOL(mcount); | 187 | EXPORT_SYMBOL(mcount); |
| 188 | #endif | 188 | #endif |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 3aa14dcc5bab..06269ea375c5 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -101,7 +101,7 @@ ENDPROC(ret_from_fork) | |||
| 101 | #undef CALL | 101 | #undef CALL |
| 102 | #define CALL(x) .long x | 102 | #define CALL(x) .long x |
| 103 | 103 | ||
| 104 | #ifdef CONFIG_FTRACE | 104 | #ifdef CONFIG_FUNCTION_TRACER |
| 105 | #ifdef CONFIG_DYNAMIC_FTRACE | 105 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 106 | ENTRY(mcount) | 106 | ENTRY(mcount) |
| 107 | stmdb sp!, {r0-r3, lr} | 107 | stmdb sp!, {r0-r3, lr} |
| @@ -149,7 +149,7 @@ trace: | |||
| 149 | ftrace_stub: | 149 | ftrace_stub: |
| 150 | mov pc, lr | 150 | mov pc, lr |
| 151 | 151 | ||
| 152 | #endif /* CONFIG_FTRACE */ | 152 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 153 | 153 | ||
| 154 | /*============================================================================= | 154 | /*============================================================================= |
| 155 | * SWI handler | 155 | * SWI handler |
diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c index 76d50e6091bc..6c90479e8974 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c | |||
| @@ -95,19 +95,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func) | |||
| 95 | return ret; | 95 | return ret; |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | int ftrace_mcount_set(unsigned long *data) | ||
| 99 | { | ||
| 100 | unsigned long pc, old; | ||
| 101 | unsigned long *addr = data; | ||
| 102 | unsigned char *new; | ||
| 103 | |||
| 104 | pc = (unsigned long)&mcount_call; | ||
| 105 | memcpy(&old, &mcount_call, MCOUNT_INSN_SIZE); | ||
| 106 | new = ftrace_call_replace(pc, *addr); | ||
| 107 | *addr = ftrace_modify_code(pc, (unsigned char *)&old, new); | ||
| 108 | return 0; | ||
| 109 | } | ||
| 110 | |||
| 111 | /* run from kstop_machine */ | 98 | /* run from kstop_machine */ |
| 112 | int __init ftrace_dyn_arch_init(void *data) | 99 | int __init ftrace_dyn_arch_init(void *data) |
| 113 | { | 100 | { |
diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c index eb7d6c94aa42..e35259032813 100644 --- a/arch/arm/mach-pxa/corgi_pm.c +++ b/arch/arm/mach-pxa/corgi_pm.c | |||
| @@ -204,7 +204,9 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = { | |||
| 204 | .read_devdata = corgipm_read_devdata, | 204 | .read_devdata = corgipm_read_devdata, |
| 205 | .charger_wakeup = corgi_charger_wakeup, | 205 | .charger_wakeup = corgi_charger_wakeup, |
| 206 | .should_wakeup = corgi_should_wakeup, | 206 | .should_wakeup = corgi_should_wakeup, |
| 207 | #ifdef CONFIG_BACKLIGHT_CORGI | 207 | #if defined(CONFIG_LCD_CORGI) |
| 208 | .backlight_limit = corgi_lcd_limit_intensity, | ||
| 209 | #elif defined(CONFIG_BACKLIGHT_CORGI) | ||
| 208 | .backlight_limit = corgibl_limit_intensity, | 210 | .backlight_limit = corgibl_limit_intensity, |
| 209 | #endif | 211 | #endif |
| 210 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, | 212 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, |
diff --git a/arch/arm/mach-pxa/include/mach/sharpsl.h b/arch/arm/mach-pxa/include/mach/sharpsl.h index 3b1d4a72d4d1..8242e14a44fa 100644 --- a/arch/arm/mach-pxa/include/mach/sharpsl.h +++ b/arch/arm/mach-pxa/include/mach/sharpsl.h | |||
| @@ -26,6 +26,7 @@ struct corgits_machinfo { | |||
| 26 | * SharpSL Backlight | 26 | * SharpSL Backlight |
| 27 | */ | 27 | */ |
| 28 | extern void corgibl_limit_intensity(int limit); | 28 | extern void corgibl_limit_intensity(int limit); |
| 29 | extern void corgi_lcd_limit_intensity(int limit); | ||
| 29 | 30 | ||
| 30 | 31 | ||
| 31 | /* | 32 | /* |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 524f656dc56d..f0a5bbae0b45 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
| @@ -385,6 +385,16 @@ static void __init spitz_init_spi(void) | |||
| 385 | if (err) | 385 | if (err) |
| 386 | goto err_free_2; | 386 | goto err_free_2; |
| 387 | 387 | ||
| 388 | err = gpio_direction_output(SPITZ_GPIO_ADS7846_CS, 1); | ||
| 389 | if (err) | ||
| 390 | goto err_free_3; | ||
| 391 | err = gpio_direction_output(SPITZ_GPIO_LCDCON_CS, 1); | ||
| 392 | if (err) | ||
| 393 | goto err_free_3; | ||
| 394 | err = gpio_direction_output(SPITZ_GPIO_MAX1111_CS, 1); | ||
| 395 | if (err) | ||
| 396 | goto err_free_3; | ||
| 397 | |||
| 388 | if (machine_is_akita()) { | 398 | if (machine_is_akita()) { |
| 389 | spitz_lcdcon_info.gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT; | 399 | spitz_lcdcon_info.gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT; |
| 390 | spitz_lcdcon_info.gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON; | 400 | spitz_lcdcon_info.gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON; |
| @@ -394,6 +404,8 @@ static void __init spitz_init_spi(void) | |||
| 394 | spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices)); | 404 | spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices)); |
| 395 | return; | 405 | return; |
| 396 | 406 | ||
| 407 | err_free_3: | ||
| 408 | gpio_free(SPITZ_GPIO_MAX1111_CS); | ||
| 397 | err_free_2: | 409 | err_free_2: |
| 398 | gpio_free(SPITZ_GPIO_LCDCON_CS); | 410 | gpio_free(SPITZ_GPIO_LCDCON_CS); |
| 399 | err_free_1: | 411 | err_free_1: |
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 53018db106ac..072e77cfe5a3 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c | |||
| @@ -198,7 +198,9 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = { | |||
| 198 | .read_devdata = spitzpm_read_devdata, | 198 | .read_devdata = spitzpm_read_devdata, |
| 199 | .charger_wakeup = spitz_charger_wakeup, | 199 | .charger_wakeup = spitz_charger_wakeup, |
| 200 | .should_wakeup = spitz_should_wakeup, | 200 | .should_wakeup = spitz_should_wakeup, |
| 201 | #ifdef CONFIG_BACKLIGHT_CORGI | 201 | #if defined(CONFIG_LCD_CORGI) |
| 202 | .backlight_limit = corgi_lcd_limit_intensity, | ||
| 203 | #elif defined(CONFIG_BACKLIGHT_CORGI) | ||
| 202 | .backlight_limit = corgibl_limit_intensity, | 204 | .backlight_limit = corgibl_limit_intensity, |
| 203 | #endif | 205 | #endif |
| 204 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, | 206 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, |
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h index 85db124d37f6..c60d324da540 100644 --- a/arch/ia64/include/asm/kvm_host.h +++ b/arch/ia64/include/asm/kvm_host.h | |||
| @@ -365,7 +365,8 @@ struct kvm_vcpu_arch { | |||
| 365 | long itc_offset; | 365 | long itc_offset; |
| 366 | unsigned long itc_check; | 366 | unsigned long itc_check; |
| 367 | unsigned long timer_check; | 367 | unsigned long timer_check; |
| 368 | unsigned long timer_pending; | 368 | unsigned int timer_pending; |
| 369 | unsigned int timer_fired; | ||
| 369 | 370 | ||
| 370 | unsigned long vrr[8]; | 371 | unsigned long vrr[8]; |
| 371 | unsigned long ibr[8]; | 372 | unsigned long ibr[8]; |
| @@ -417,6 +418,9 @@ struct kvm_arch { | |||
| 417 | struct list_head assigned_dev_head; | 418 | struct list_head assigned_dev_head; |
| 418 | struct dmar_domain *intel_iommu_domain; | 419 | struct dmar_domain *intel_iommu_domain; |
| 419 | struct hlist_head irq_ack_notifier_list; | 420 | struct hlist_head irq_ack_notifier_list; |
| 421 | |||
| 422 | unsigned long irq_sources_bitmap; | ||
| 423 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; | ||
| 420 | }; | 424 | }; |
| 421 | 425 | ||
| 422 | union cpuid3_t { | 426 | union cpuid3_t { |
diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile index cf37f8f490c0..3ab4d6d50704 100644 --- a/arch/ia64/kvm/Makefile +++ b/arch/ia64/kvm/Makefile | |||
| @@ -29,13 +29,18 @@ define cmd_offsets | |||
| 29 | echo ""; \ | 29 | echo ""; \ |
| 30 | echo "#endif" ) > $@ | 30 | echo "#endif" ) > $@ |
| 31 | endef | 31 | endef |
| 32 | |||
| 32 | # We use internal rules to avoid the "is up to date" message from make | 33 | # We use internal rules to avoid the "is up to date" message from make |
| 33 | arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c | 34 | arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c \ |
| 35 | $(wildcard $(srctree)/arch/ia64/include/asm/*.h)\ | ||
| 36 | $(wildcard $(srctree)/include/linux/*.h) | ||
| 34 | $(call if_changed_dep,cc_s_c) | 37 | $(call if_changed_dep,cc_s_c) |
| 35 | 38 | ||
| 36 | $(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s | 39 | $(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s |
| 37 | $(call cmd,offsets) | 40 | $(call cmd,offsets) |
| 38 | 41 | ||
| 42 | FORCE : $(obj)/$(offsets-file) | ||
| 43 | |||
| 39 | # | 44 | # |
| 40 | # Makefile for Kernel-based Virtual Machine module | 45 | # Makefile for Kernel-based Virtual Machine module |
| 41 | # | 46 | # |
| @@ -53,7 +58,6 @@ endif | |||
| 53 | kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o | 58 | kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o |
| 54 | obj-$(CONFIG_KVM) += kvm.o | 59 | obj-$(CONFIG_KVM) += kvm.o |
| 55 | 60 | ||
| 56 | FORCE : $(obj)/$(offsets-file) | ||
| 57 | EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127 | 61 | EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127 |
| 58 | kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \ | 62 | kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \ |
| 59 | vtlb.o process.o | 63 | vtlb.o process.o |
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index a312c9e9b9ef..3caac477de9e 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
| @@ -385,6 +385,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 385 | struct kvm *kvm = vcpu->kvm; | 385 | struct kvm *kvm = vcpu->kvm; |
| 386 | struct call_data call_data; | 386 | struct call_data call_data; |
| 387 | int i; | 387 | int i; |
| 388 | |||
| 388 | call_data.ptc_g_data = p->u.ptc_g_data; | 389 | call_data.ptc_g_data = p->u.ptc_g_data; |
| 389 | 390 | ||
| 390 | for (i = 0; i < KVM_MAX_VCPUS; i++) { | 391 | for (i = 0; i < KVM_MAX_VCPUS; i++) { |
| @@ -418,33 +419,41 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu) | |||
| 418 | ktime_t kt; | 419 | ktime_t kt; |
| 419 | long itc_diff; | 420 | long itc_diff; |
| 420 | unsigned long vcpu_now_itc; | 421 | unsigned long vcpu_now_itc; |
| 421 | |||
| 422 | unsigned long expires; | 422 | unsigned long expires; |
| 423 | struct hrtimer *p_ht = &vcpu->arch.hlt_timer; | 423 | struct hrtimer *p_ht = &vcpu->arch.hlt_timer; |
| 424 | unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec; | 424 | unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec; |
| 425 | struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd); | 425 | struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd); |
| 426 | 426 | ||
| 427 | vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset; | 427 | if (irqchip_in_kernel(vcpu->kvm)) { |
| 428 | 428 | ||
| 429 | if (time_after(vcpu_now_itc, vpd->itm)) { | 429 | vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset; |
| 430 | vcpu->arch.timer_check = 1; | ||
| 431 | return 1; | ||
| 432 | } | ||
| 433 | itc_diff = vpd->itm - vcpu_now_itc; | ||
| 434 | if (itc_diff < 0) | ||
| 435 | itc_diff = -itc_diff; | ||
| 436 | 430 | ||
| 437 | expires = div64_u64(itc_diff, cyc_per_usec); | 431 | if (time_after(vcpu_now_itc, vpd->itm)) { |
| 438 | kt = ktime_set(0, 1000 * expires); | 432 | vcpu->arch.timer_check = 1; |
| 439 | vcpu->arch.ht_active = 1; | 433 | return 1; |
| 440 | hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS); | 434 | } |
| 435 | itc_diff = vpd->itm - vcpu_now_itc; | ||
| 436 | if (itc_diff < 0) | ||
| 437 | itc_diff = -itc_diff; | ||
| 438 | |||
| 439 | expires = div64_u64(itc_diff, cyc_per_usec); | ||
| 440 | kt = ktime_set(0, 1000 * expires); | ||
| 441 | |||
| 442 | down_read(&vcpu->kvm->slots_lock); | ||
| 443 | vcpu->arch.ht_active = 1; | ||
| 444 | hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS); | ||
| 441 | 445 | ||
| 442 | if (irqchip_in_kernel(vcpu->kvm)) { | ||
| 443 | vcpu->arch.mp_state = KVM_MP_STATE_HALTED; | 446 | vcpu->arch.mp_state = KVM_MP_STATE_HALTED; |
| 444 | kvm_vcpu_block(vcpu); | 447 | kvm_vcpu_block(vcpu); |
| 445 | hrtimer_cancel(p_ht); | 448 | hrtimer_cancel(p_ht); |
| 446 | vcpu->arch.ht_active = 0; | 449 | vcpu->arch.ht_active = 0; |
| 447 | 450 | ||
| 451 | if (test_and_clear_bit(KVM_REQ_UNHALT, &vcpu->requests)) | ||
| 452 | if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) | ||
| 453 | vcpu->arch.mp_state = | ||
| 454 | KVM_MP_STATE_RUNNABLE; | ||
| 455 | up_read(&vcpu->kvm->slots_lock); | ||
| 456 | |||
| 448 | if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE) | 457 | if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE) |
| 449 | return -EINTR; | 458 | return -EINTR; |
| 450 | return 1; | 459 | return 1; |
| @@ -484,10 +493,6 @@ static int (*kvm_vti_exit_handlers[])(struct kvm_vcpu *vcpu, | |||
| 484 | static const int kvm_vti_max_exit_handlers = | 493 | static const int kvm_vti_max_exit_handlers = |
| 485 | sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers); | 494 | sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers); |
| 486 | 495 | ||
| 487 | static void kvm_prepare_guest_switch(struct kvm_vcpu *vcpu) | ||
| 488 | { | ||
| 489 | } | ||
| 490 | |||
| 491 | static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu) | 496 | static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu) |
| 492 | { | 497 | { |
| 493 | struct exit_ctl_data *p_exit_data; | 498 | struct exit_ctl_data *p_exit_data; |
| @@ -600,8 +605,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 600 | 605 | ||
| 601 | again: | 606 | again: |
| 602 | preempt_disable(); | 607 | preempt_disable(); |
| 603 | |||
| 604 | kvm_prepare_guest_switch(vcpu); | ||
| 605 | local_irq_disable(); | 608 | local_irq_disable(); |
| 606 | 609 | ||
| 607 | if (signal_pending(current)) { | 610 | if (signal_pending(current)) { |
| @@ -614,7 +617,7 @@ again: | |||
| 614 | 617 | ||
| 615 | vcpu->guest_mode = 1; | 618 | vcpu->guest_mode = 1; |
| 616 | kvm_guest_enter(); | 619 | kvm_guest_enter(); |
| 617 | 620 | down_read(&vcpu->kvm->slots_lock); | |
| 618 | r = vti_vcpu_run(vcpu, kvm_run); | 621 | r = vti_vcpu_run(vcpu, kvm_run); |
| 619 | if (r < 0) { | 622 | if (r < 0) { |
| 620 | local_irq_enable(); | 623 | local_irq_enable(); |
| @@ -634,9 +637,8 @@ again: | |||
| 634 | * But we need to prevent reordering, hence this barrier(): | 637 | * But we need to prevent reordering, hence this barrier(): |
| 635 | */ | 638 | */ |
| 636 | barrier(); | 639 | barrier(); |
| 637 | |||
| 638 | kvm_guest_exit(); | 640 | kvm_guest_exit(); |
| 639 | 641 | up_read(&vcpu->kvm->slots_lock); | |
| 640 | preempt_enable(); | 642 | preempt_enable(); |
| 641 | 643 | ||
| 642 | r = kvm_handle_exit(kvm_run, vcpu); | 644 | r = kvm_handle_exit(kvm_run, vcpu); |
| @@ -673,6 +675,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 673 | 675 | ||
| 674 | if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) { | 676 | if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) { |
| 675 | kvm_vcpu_block(vcpu); | 677 | kvm_vcpu_block(vcpu); |
| 678 | clear_bit(KVM_REQ_UNHALT, &vcpu->requests); | ||
| 676 | vcpu_put(vcpu); | 679 | vcpu_put(vcpu); |
| 677 | return -EAGAIN; | 680 | return -EAGAIN; |
| 678 | } | 681 | } |
| @@ -778,6 +781,9 @@ static void kvm_init_vm(struct kvm *kvm) | |||
| 778 | kvm_build_io_pmt(kvm); | 781 | kvm_build_io_pmt(kvm); |
| 779 | 782 | ||
| 780 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); | 783 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); |
| 784 | |||
| 785 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ | ||
| 786 | set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); | ||
| 781 | } | 787 | } |
| 782 | 788 | ||
| 783 | struct kvm *kvm_arch_create_vm(void) | 789 | struct kvm *kvm_arch_create_vm(void) |
| @@ -941,9 +947,8 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
| 941 | goto out; | 947 | goto out; |
| 942 | if (irqchip_in_kernel(kvm)) { | 948 | if (irqchip_in_kernel(kvm)) { |
| 943 | mutex_lock(&kvm->lock); | 949 | mutex_lock(&kvm->lock); |
| 944 | kvm_ioapic_set_irq(kvm->arch.vioapic, | 950 | kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, |
| 945 | irq_event.irq, | 951 | irq_event.irq, irq_event.level); |
| 946 | irq_event.level); | ||
| 947 | mutex_unlock(&kvm->lock); | 952 | mutex_unlock(&kvm->lock); |
| 948 | r = 0; | 953 | r = 0; |
| 949 | } | 954 | } |
| @@ -1123,15 +1128,16 @@ static enum hrtimer_restart hlt_timer_fn(struct hrtimer *data) | |||
| 1123 | wait_queue_head_t *q; | 1128 | wait_queue_head_t *q; |
| 1124 | 1129 | ||
| 1125 | vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer); | 1130 | vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer); |
| 1131 | q = &vcpu->wq; | ||
| 1132 | |||
| 1126 | if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED) | 1133 | if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED) |
| 1127 | goto out; | 1134 | goto out; |
| 1128 | 1135 | ||
| 1129 | q = &vcpu->wq; | 1136 | if (waitqueue_active(q)) |
| 1130 | if (waitqueue_active(q)) { | ||
| 1131 | vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; | ||
| 1132 | wake_up_interruptible(q); | 1137 | wake_up_interruptible(q); |
| 1133 | } | 1138 | |
| 1134 | out: | 1139 | out: |
| 1140 | vcpu->arch.timer_fired = 1; | ||
| 1135 | vcpu->arch.timer_check = 1; | 1141 | vcpu->arch.timer_check = 1; |
| 1136 | return HRTIMER_NORESTART; | 1142 | return HRTIMER_NORESTART; |
| 1137 | } | 1143 | } |
| @@ -1700,12 +1706,14 @@ static void vcpu_kick_intr(void *info) | |||
| 1700 | void kvm_vcpu_kick(struct kvm_vcpu *vcpu) | 1706 | void kvm_vcpu_kick(struct kvm_vcpu *vcpu) |
| 1701 | { | 1707 | { |
| 1702 | int ipi_pcpu = vcpu->cpu; | 1708 | int ipi_pcpu = vcpu->cpu; |
| 1709 | int cpu = get_cpu(); | ||
| 1703 | 1710 | ||
| 1704 | if (waitqueue_active(&vcpu->wq)) | 1711 | if (waitqueue_active(&vcpu->wq)) |
| 1705 | wake_up_interruptible(&vcpu->wq); | 1712 | wake_up_interruptible(&vcpu->wq); |
| 1706 | 1713 | ||
| 1707 | if (vcpu->guest_mode) | 1714 | if (vcpu->guest_mode && cpu != ipi_pcpu) |
| 1708 | smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0); | 1715 | smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0); |
| 1716 | put_cpu(); | ||
| 1709 | } | 1717 | } |
| 1710 | 1718 | ||
| 1711 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) | 1719 | int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) |
| @@ -1715,13 +1723,7 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) | |||
| 1715 | 1723 | ||
| 1716 | if (!test_and_set_bit(vec, &vpd->irr[0])) { | 1724 | if (!test_and_set_bit(vec, &vpd->irr[0])) { |
| 1717 | vcpu->arch.irq_new_pending = 1; | 1725 | vcpu->arch.irq_new_pending = 1; |
| 1718 | if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE) | 1726 | kvm_vcpu_kick(vcpu); |
| 1719 | kvm_vcpu_kick(vcpu); | ||
| 1720 | else if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) { | ||
| 1721 | vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; | ||
| 1722 | if (waitqueue_active(&vcpu->wq)) | ||
| 1723 | wake_up_interruptible(&vcpu->wq); | ||
| 1724 | } | ||
| 1725 | return 1; | 1727 | return 1; |
| 1726 | } | 1728 | } |
| 1727 | return 0; | 1729 | return 0; |
| @@ -1791,7 +1793,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu) | |||
| 1791 | 1793 | ||
| 1792 | int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) | 1794 | int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) |
| 1793 | { | 1795 | { |
| 1794 | return 0; | 1796 | return vcpu->arch.timer_fired; |
| 1795 | } | 1797 | } |
| 1796 | 1798 | ||
| 1797 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn) | 1799 | gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn) |
diff --git a/arch/ia64/kvm/kvm_fw.c b/arch/ia64/kvm/kvm_fw.c index 0c69d9ec92d4..cb7600bdff9d 100644 --- a/arch/ia64/kvm/kvm_fw.c +++ b/arch/ia64/kvm/kvm_fw.c | |||
| @@ -286,6 +286,12 @@ static u64 kvm_get_pal_call_index(struct kvm_vcpu *vcpu) | |||
| 286 | return index; | 286 | return index; |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | static void prepare_for_halt(struct kvm_vcpu *vcpu) | ||
| 290 | { | ||
| 291 | vcpu->arch.timer_pending = 1; | ||
| 292 | vcpu->arch.timer_fired = 0; | ||
| 293 | } | ||
| 294 | |||
| 289 | int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | 295 | int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) |
| 290 | { | 296 | { |
| 291 | 297 | ||
| @@ -304,11 +310,10 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 304 | break; | 310 | break; |
| 305 | case PAL_HALT_LIGHT: | 311 | case PAL_HALT_LIGHT: |
| 306 | { | 312 | { |
| 307 | vcpu->arch.timer_pending = 1; | ||
| 308 | INIT_PAL_STATUS_SUCCESS(result); | 313 | INIT_PAL_STATUS_SUCCESS(result); |
| 314 | prepare_for_halt(vcpu); | ||
| 309 | if (kvm_highest_pending_irq(vcpu) == -1) | 315 | if (kvm_highest_pending_irq(vcpu) == -1) |
| 310 | ret = kvm_emulate_halt(vcpu); | 316 | ret = kvm_emulate_halt(vcpu); |
| 311 | |||
| 312 | } | 317 | } |
| 313 | break; | 318 | break; |
| 314 | 319 | ||
diff --git a/arch/ia64/kvm/process.c b/arch/ia64/kvm/process.c index 3417783ae164..800817307b7b 100644 --- a/arch/ia64/kvm/process.c +++ b/arch/ia64/kvm/process.c | |||
| @@ -713,7 +713,7 @@ void leave_hypervisor_tail(void) | |||
| 713 | if (!(VCPU(v, itv) & (1 << 16))) { | 713 | if (!(VCPU(v, itv) & (1 << 16))) { |
| 714 | vcpu_pend_interrupt(v, VCPU(v, itv) | 714 | vcpu_pend_interrupt(v, VCPU(v, itv) |
| 715 | & 0xff); | 715 | & 0xff); |
| 716 | VMX(v, itc_check) = 0; | 716 | VMX(v, itc_check) = 0; |
| 717 | } else { | 717 | } else { |
| 718 | v->arch.timer_pending = 1; | 718 | v->arch.timer_pending = 1; |
| 719 | } | 719 | } |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 5f149b030c0f..653574bc19cf 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -238,21 +238,8 @@ config MIPS_SIM | |||
| 238 | This option enables support for MIPS Technologies MIPSsim software | 238 | This option enables support for MIPS Technologies MIPSsim software |
| 239 | emulator. | 239 | emulator. |
| 240 | 240 | ||
| 241 | config MARKEINS | 241 | config MACH_EMMA |
| 242 | bool "NEC EMMA2RH Mark-eins" | 242 | bool "NEC EMMA series based machines" |
| 243 | select CEVT_R4K | ||
| 244 | select CSRC_R4K | ||
| 245 | select DMA_NONCOHERENT | ||
| 246 | select HW_HAS_PCI | ||
| 247 | select IRQ_CPU | ||
| 248 | select SWAP_IO_SPACE | ||
| 249 | select SYS_SUPPORTS_32BIT_KERNEL | ||
| 250 | select SYS_SUPPORTS_BIG_ENDIAN | ||
| 251 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
| 252 | select SYS_HAS_CPU_R5000 | ||
| 253 | help | ||
| 254 | This enables support for the R5432-based NEC Mark-eins | ||
| 255 | boards with R5500 CPU. | ||
| 256 | 243 | ||
| 257 | config MACH_VR41XX | 244 | config MACH_VR41XX |
| 258 | bool "NEC VR4100 series based machines" | 245 | bool "NEC VR4100 series based machines" |
| @@ -261,6 +248,19 @@ config MACH_VR41XX | |||
| 261 | select SYS_HAS_CPU_VR41XX | 248 | select SYS_HAS_CPU_VR41XX |
| 262 | select GENERIC_HARDIRQS_NO__DO_IRQ | 249 | select GENERIC_HARDIRQS_NO__DO_IRQ |
| 263 | 250 | ||
| 251 | config NXP_STB220 | ||
| 252 | bool "NXP STB220 board" | ||
| 253 | select SOC_PNX833X | ||
| 254 | help | ||
| 255 | Support for NXP Semiconductors STB220 Development Board. | ||
| 256 | |||
| 257 | config NXP_STB225 | ||
| 258 | bool "NXP 225 board" | ||
| 259 | select SOC_PNX833X | ||
| 260 | select SOC_PNX8335 | ||
| 261 | help | ||
| 262 | Support for NXP Semiconductors STB225 Development Board. | ||
| 263 | |||
| 264 | config PNX8550_JBS | 264 | config PNX8550_JBS |
| 265 | bool "NXP PNX8550 based JBS board" | 265 | bool "NXP PNX8550 based JBS board" |
| 266 | select PNX8550 | 266 | select PNX8550 |
| @@ -601,6 +601,7 @@ endchoice | |||
| 601 | 601 | ||
| 602 | source "arch/mips/alchemy/Kconfig" | 602 | source "arch/mips/alchemy/Kconfig" |
| 603 | source "arch/mips/basler/excite/Kconfig" | 603 | source "arch/mips/basler/excite/Kconfig" |
| 604 | source "arch/mips/emma/Kconfig" | ||
| 604 | source "arch/mips/jazz/Kconfig" | 605 | source "arch/mips/jazz/Kconfig" |
| 605 | source "arch/mips/lasat/Kconfig" | 606 | source "arch/mips/lasat/Kconfig" |
| 606 | source "arch/mips/pmc-sierra/Kconfig" | 607 | source "arch/mips/pmc-sierra/Kconfig" |
| @@ -849,6 +850,24 @@ config MIPS_RM9122 | |||
| 849 | bool | 850 | bool |
| 850 | select SERIAL_RM9000 | 851 | select SERIAL_RM9000 |
| 851 | 852 | ||
| 853 | config SOC_PNX833X | ||
| 854 | bool | ||
| 855 | select CEVT_R4K | ||
| 856 | select CSRC_R4K | ||
| 857 | select IRQ_CPU | ||
| 858 | select DMA_NONCOHERENT | ||
| 859 | select SYS_HAS_CPU_MIPS32_R2 | ||
| 860 | select SYS_SUPPORTS_32BIT_KERNEL | ||
| 861 | select SYS_SUPPORTS_LITTLE_ENDIAN | ||
| 862 | select SYS_SUPPORTS_BIG_ENDIAN | ||
| 863 | select GENERIC_HARDIRQS_NO__DO_IRQ | ||
| 864 | select GENERIC_GPIO | ||
| 865 | select CPU_MIPSR2_IRQ_VI | ||
| 866 | |||
| 867 | config SOC_PNX8335 | ||
| 868 | bool | ||
| 869 | select SOC_PNX833X | ||
| 870 | |||
| 852 | config PNX8550 | 871 | config PNX8550 |
| 853 | bool | 872 | bool |
| 854 | select SOC_PNX8550 | 873 | select SOC_PNX8550 |
| @@ -1092,6 +1111,16 @@ config CPU_R5432 | |||
| 1092 | select CPU_SUPPORTS_32BIT_KERNEL | 1111 | select CPU_SUPPORTS_32BIT_KERNEL |
| 1093 | select CPU_SUPPORTS_64BIT_KERNEL | 1112 | select CPU_SUPPORTS_64BIT_KERNEL |
| 1094 | 1113 | ||
| 1114 | config CPU_R5500 | ||
| 1115 | bool "R5500" | ||
| 1116 | depends on SYS_HAS_CPU_R5500 | ||
| 1117 | select CPU_HAS_LLSC | ||
| 1118 | select CPU_SUPPORTS_32BIT_KERNEL | ||
| 1119 | select CPU_SUPPORTS_64BIT_KERNEL | ||
| 1120 | help | ||
| 1121 | NEC VR5500 and VR5500A series processors implement 64-bit MIPS IV | ||
| 1122 | instruction set. | ||
| 1123 | |||
| 1095 | config CPU_R6000 | 1124 | config CPU_R6000 |
| 1096 | bool "R6000" | 1125 | bool "R6000" |
| 1097 | depends on EXPERIMENTAL | 1126 | depends on EXPERIMENTAL |
| @@ -1202,6 +1231,9 @@ config SYS_HAS_CPU_R5000 | |||
| 1202 | config SYS_HAS_CPU_R5432 | 1231 | config SYS_HAS_CPU_R5432 |
| 1203 | bool | 1232 | bool |
| 1204 | 1233 | ||
| 1234 | config SYS_HAS_CPU_R5500 | ||
| 1235 | bool | ||
| 1236 | |||
| 1205 | config SYS_HAS_CPU_R6000 | 1237 | config SYS_HAS_CPU_R6000 |
| 1206 | bool | 1238 | bool |
| 1207 | 1239 | ||
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 7f39fd8a91fe..28c55f608913 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
| @@ -131,6 +131,8 @@ cflags-$(CONFIG_CPU_MIPS64_R2) += $(call cc-option,-march=mips64r2,-mips64r2 -U_ | |||
| 131 | cflags-$(CONFIG_CPU_R5000) += -march=r5000 -Wa,--trap | 131 | cflags-$(CONFIG_CPU_R5000) += -march=r5000 -Wa,--trap |
| 132 | cflags-$(CONFIG_CPU_R5432) += $(call cc-option,-march=r5400,-march=r5000) \ | 132 | cflags-$(CONFIG_CPU_R5432) += $(call cc-option,-march=r5400,-march=r5000) \ |
| 133 | -Wa,--trap | 133 | -Wa,--trap |
| 134 | cflags-$(CONFIG_CPU_R5500) += $(call cc-option,-march=r5500,-march=r5000) \ | ||
| 135 | -Wa,--trap | ||
| 134 | cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=r5000) \ | 136 | cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=r5000) \ |
| 135 | -Wa,--trap | 137 | -Wa,--trap |
| 136 | cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=r5000) \ | 138 | cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=r5000) \ |
| @@ -381,6 +383,14 @@ load-$(CONFIG_CASIO_E55) += 0xffffffff80004000 | |||
| 381 | # | 383 | # |
| 382 | load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000 | 384 | load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000 |
| 383 | 385 | ||
| 386 | # NXP STB225 | ||
| 387 | core-$(CONFIG_SOC_PNX833X) += arch/mips/nxp/pnx833x/common/ | ||
| 388 | cflags-$(CONFIG_SOC_PNX833X) += -Iarch/mips/include/asm/mach-pnx833x | ||
| 389 | libs-$(CONFIG_NXP_STB220) += arch/mips/nxp/pnx833x/stb22x/ | ||
| 390 | load-$(CONFIG_NXP_STB220) += 0xffffffff80001000 | ||
| 391 | libs-$(CONFIG_NXP_STB225) += arch/mips/nxp/pnx833x/stb22x/ | ||
| 392 | load-$(CONFIG_NXP_STB225) += 0xffffffff80001000 | ||
| 393 | |||
| 384 | # | 394 | # |
| 385 | # Common NXP PNX8550 | 395 | # Common NXP PNX8550 |
| 386 | # | 396 | # |
| @@ -399,14 +409,17 @@ load-$(CONFIG_PNX8550_JBS) += 0xffffffff80060000 | |||
| 399 | libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/ | 409 | libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/ |
| 400 | load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000 | 410 | load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000 |
| 401 | 411 | ||
| 402 | # NEC EMMA2RH boards | ||
| 403 | # | 412 | # |
| 404 | core-$(CONFIG_EMMA2RH) += arch/mips/emma2rh/common/ | 413 | # Common NEC EMMAXXX |
| 405 | cflags-$(CONFIG_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh | 414 | # |
| 415 | core-$(CONFIG_SOC_EMMA) += arch/mips/emma/common/ | ||
| 416 | cflags-$(CONFIG_SOC_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh | ||
| 406 | 417 | ||
| 418 | # | ||
| 407 | # NEC EMMA2RH Mark-eins | 419 | # NEC EMMA2RH Mark-eins |
| 408 | core-$(CONFIG_MARKEINS) += arch/mips/emma2rh/markeins/ | 420 | # |
| 409 | load-$(CONFIG_MARKEINS) += 0xffffffff88100000 | 421 | core-$(CONFIG_NEC_MARKEINS) += arch/mips/emma/markeins/ |
| 422 | load-$(CONFIG_NEC_MARKEINS) += 0xffffffff88100000 | ||
| 410 | 423 | ||
| 411 | # | 424 | # |
| 412 | # SGI IP22 (Indy/Indigo2) | 425 | # SGI IP22 (Indy/Indigo2) |
diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c index dc8a67efac28..5c76c6448e04 100644 --- a/arch/mips/alchemy/common/platform.c +++ b/arch/mips/alchemy/common/platform.c | |||
| @@ -17,6 +17,8 @@ | |||
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | 18 | ||
| 19 | #include <asm/mach-au1x00/au1xxx.h> | 19 | #include <asm/mach-au1x00/au1xxx.h> |
| 20 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | ||
| 21 | #include <asm/mach-au1x00/au1100_mmc.h> | ||
| 20 | 22 | ||
| 21 | #define PORT(_base, _irq) \ | 23 | #define PORT(_base, _irq) \ |
| 22 | { \ | 24 | { \ |
| @@ -163,24 +165,6 @@ static struct resource au1xxx_usb_gdt_resources[] = { | |||
| 163 | }, | 165 | }, |
| 164 | }; | 166 | }; |
| 165 | 167 | ||
| 166 | static struct resource au1xxx_mmc_resources[] = { | ||
| 167 | [0] = { | ||
| 168 | .start = SD0_PHYS_ADDR, | ||
| 169 | .end = SD0_PHYS_ADDR + 0x7ffff, | ||
| 170 | .flags = IORESOURCE_MEM, | ||
| 171 | }, | ||
| 172 | [1] = { | ||
| 173 | .start = SD1_PHYS_ADDR, | ||
| 174 | .end = SD1_PHYS_ADDR + 0x7ffff, | ||
| 175 | .flags = IORESOURCE_MEM, | ||
| 176 | }, | ||
| 177 | [2] = { | ||
| 178 | .start = AU1200_SD_INT, | ||
| 179 | .end = AU1200_SD_INT, | ||
| 180 | .flags = IORESOURCE_IRQ, | ||
| 181 | } | ||
| 182 | }; | ||
| 183 | |||
| 184 | static u64 udc_dmamask = DMA_32BIT_MASK; | 168 | static u64 udc_dmamask = DMA_32BIT_MASK; |
| 185 | 169 | ||
| 186 | static struct platform_device au1xxx_usb_gdt_device = { | 170 | static struct platform_device au1xxx_usb_gdt_device = { |
| @@ -249,16 +233,79 @@ static struct platform_device au1200_lcd_device = { | |||
| 249 | 233 | ||
| 250 | static u64 au1xxx_mmc_dmamask = DMA_32BIT_MASK; | 234 | static u64 au1xxx_mmc_dmamask = DMA_32BIT_MASK; |
| 251 | 235 | ||
| 252 | static struct platform_device au1xxx_mmc_device = { | 236 | extern struct au1xmmc_platform_data au1xmmc_platdata[2]; |
| 237 | |||
| 238 | static struct resource au1200_mmc0_resources[] = { | ||
| 239 | [0] = { | ||
| 240 | .start = SD0_PHYS_ADDR, | ||
| 241 | .end = SD0_PHYS_ADDR + 0x7ffff, | ||
| 242 | .flags = IORESOURCE_MEM, | ||
| 243 | }, | ||
| 244 | [1] = { | ||
| 245 | .start = AU1200_SD_INT, | ||
| 246 | .end = AU1200_SD_INT, | ||
| 247 | .flags = IORESOURCE_IRQ, | ||
| 248 | }, | ||
| 249 | [2] = { | ||
| 250 | .start = DSCR_CMD0_SDMS_TX0, | ||
| 251 | .end = DSCR_CMD0_SDMS_TX0, | ||
| 252 | .flags = IORESOURCE_DMA, | ||
| 253 | }, | ||
| 254 | [3] = { | ||
| 255 | .start = DSCR_CMD0_SDMS_RX0, | ||
| 256 | .end = DSCR_CMD0_SDMS_RX0, | ||
| 257 | .flags = IORESOURCE_DMA, | ||
| 258 | } | ||
| 259 | }; | ||
| 260 | |||
| 261 | static struct platform_device au1200_mmc0_device = { | ||
| 253 | .name = "au1xxx-mmc", | 262 | .name = "au1xxx-mmc", |
| 254 | .id = 0, | 263 | .id = 0, |
| 255 | .dev = { | 264 | .dev = { |
| 256 | .dma_mask = &au1xxx_mmc_dmamask, | 265 | .dma_mask = &au1xxx_mmc_dmamask, |
| 257 | .coherent_dma_mask = DMA_32BIT_MASK, | 266 | .coherent_dma_mask = DMA_32BIT_MASK, |
| 267 | .platform_data = &au1xmmc_platdata[0], | ||
| 258 | }, | 268 | }, |
| 259 | .num_resources = ARRAY_SIZE(au1xxx_mmc_resources), | 269 | .num_resources = ARRAY_SIZE(au1200_mmc0_resources), |
| 260 | .resource = au1xxx_mmc_resources, | 270 | .resource = au1200_mmc0_resources, |
| 261 | }; | 271 | }; |
| 272 | |||
| 273 | #ifndef CONFIG_MIPS_DB1200 | ||
| 274 | static struct resource au1200_mmc1_resources[] = { | ||
| 275 | [0] = { | ||
| 276 | .start = SD1_PHYS_ADDR, | ||
| 277 | .end = SD1_PHYS_ADDR + 0x7ffff, | ||
| 278 | .flags = IORESOURCE_MEM, | ||
| 279 | }, | ||
| 280 | [1] = { | ||
| 281 | .start = AU1200_SD_INT, | ||
| 282 | .end = AU1200_SD_INT, | ||
| 283 | .flags = IORESOURCE_IRQ, | ||
| 284 | }, | ||
| 285 | [2] = { | ||
| 286 | .start = DSCR_CMD0_SDMS_TX1, | ||
| 287 | .end = DSCR_CMD0_SDMS_TX1, | ||
| 288 | .flags = IORESOURCE_DMA, | ||
| 289 | }, | ||
| 290 | [3] = { | ||
| 291 | .start = DSCR_CMD0_SDMS_RX1, | ||
| 292 | .end = DSCR_CMD0_SDMS_RX1, | ||
| 293 | .flags = IORESOURCE_DMA, | ||
| 294 | } | ||
| 295 | }; | ||
| 296 | |||
| 297 | static struct platform_device au1200_mmc1_device = { | ||
| 298 | .name = "au1xxx-mmc", | ||
| 299 | .id = 1, | ||
| 300 | .dev = { | ||
| 301 | .dma_mask = &au1xxx_mmc_dmamask, | ||
| 302 | .coherent_dma_mask = DMA_32BIT_MASK, | ||
| 303 | .platform_data = &au1xmmc_platdata[1], | ||
| 304 | }, | ||
| 305 | .num_resources = ARRAY_SIZE(au1200_mmc1_resources), | ||
| 306 | .resource = au1200_mmc1_resources, | ||
| 307 | }; | ||
| 308 | #endif /* #ifndef CONFIG_MIPS_DB1200 */ | ||
| 262 | #endif /* #ifdef CONFIG_SOC_AU1200 */ | 309 | #endif /* #ifdef CONFIG_SOC_AU1200 */ |
| 263 | 310 | ||
| 264 | static struct platform_device au1x00_pcmcia_device = { | 311 | static struct platform_device au1x00_pcmcia_device = { |
| @@ -296,7 +343,10 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = { | |||
| 296 | &au1xxx_usb_gdt_device, | 343 | &au1xxx_usb_gdt_device, |
| 297 | &au1xxx_usb_otg_device, | 344 | &au1xxx_usb_otg_device, |
| 298 | &au1200_lcd_device, | 345 | &au1200_lcd_device, |
| 299 | &au1xxx_mmc_device, | 346 | &au1200_mmc0_device, |
| 347 | #ifndef CONFIG_MIPS_DB1200 | ||
| 348 | &au1200_mmc1_device, | ||
| 349 | #endif | ||
| 300 | #endif | 350 | #endif |
| 301 | #ifdef SMBUS_PSC_BASE | 351 | #ifdef SMBUS_PSC_BASE |
| 302 | &pbdb_smbus_device, | 352 | &pbdb_smbus_device, |
diff --git a/arch/mips/alchemy/pb1200/platform.c b/arch/mips/alchemy/pb1200/platform.c index f8fb0aeac571..95303297c534 100644 --- a/arch/mips/alchemy/pb1200/platform.c +++ b/arch/mips/alchemy/pb1200/platform.c | |||
| @@ -20,9 +20,90 @@ | |||
| 20 | 20 | ||
| 21 | #include <linux/dma-mapping.h> | 21 | #include <linux/dma-mapping.h> |
| 22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 23 | #include <linux/leds.h> | ||
| 23 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
| 24 | 25 | ||
| 25 | #include <asm/mach-au1x00/au1xxx.h> | 26 | #include <asm/mach-au1x00/au1xxx.h> |
| 27 | #include <asm/mach-au1x00/au1100_mmc.h> | ||
| 28 | |||
| 29 | static int mmc_activity; | ||
| 30 | |||
| 31 | static void pb1200mmc0_set_power(void *mmc_host, int state) | ||
| 32 | { | ||
| 33 | if (state) | ||
| 34 | bcsr->board |= BCSR_BOARD_SD0PWR; | ||
| 35 | else | ||
| 36 | bcsr->board &= ~BCSR_BOARD_SD0PWR; | ||
| 37 | |||
| 38 | au_sync_delay(1); | ||
| 39 | } | ||
| 40 | |||
| 41 | static int pb1200mmc0_card_readonly(void *mmc_host) | ||
| 42 | { | ||
| 43 | return (bcsr->status & BCSR_STATUS_SD0WP) ? 1 : 0; | ||
| 44 | } | ||
| 45 | |||
| 46 | static int pb1200mmc0_card_inserted(void *mmc_host) | ||
| 47 | { | ||
| 48 | return (bcsr->sig_status & BCSR_INT_SD0INSERT) ? 1 : 0; | ||
| 49 | } | ||
| 50 | |||
| 51 | static void pb1200_mmcled_set(struct led_classdev *led, | ||
| 52 | enum led_brightness brightness) | ||
| 53 | { | ||
| 54 | if (brightness != LED_OFF) { | ||
| 55 | if (++mmc_activity == 1) | ||
| 56 | bcsr->disk_leds &= ~(1 << 8); | ||
| 57 | } else { | ||
| 58 | if (--mmc_activity == 0) | ||
| 59 | bcsr->disk_leds |= (1 << 8); | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 63 | static struct led_classdev pb1200mmc_led = { | ||
| 64 | .brightness_set = pb1200_mmcled_set, | ||
| 65 | }; | ||
| 66 | |||
| 67 | #ifndef CONFIG_MIPS_DB1200 | ||
| 68 | static void pb1200mmc1_set_power(void *mmc_host, int state) | ||
| 69 | { | ||
| 70 | if (state) | ||
| 71 | bcsr->board |= BCSR_BOARD_SD1PWR; | ||
| 72 | else | ||
| 73 | bcsr->board &= ~BCSR_BOARD_SD1PWR; | ||
| 74 | |||
| 75 | au_sync_delay(1); | ||
| 76 | } | ||
| 77 | |||
| 78 | static int pb1200mmc1_card_readonly(void *mmc_host) | ||
| 79 | { | ||
| 80 | return (bcsr->status & BCSR_STATUS_SD1WP) ? 1 : 0; | ||
| 81 | } | ||
| 82 | |||
| 83 | static int pb1200mmc1_card_inserted(void *mmc_host) | ||
| 84 | { | ||
| 85 | return (bcsr->sig_status & BCSR_INT_SD1INSERT) ? 1 : 0; | ||
| 86 | } | ||
| 87 | #endif | ||
| 88 | |||
| 89 | const struct au1xmmc_platform_data au1xmmc_platdata[2] = { | ||
| 90 | [0] = { | ||
| 91 | .set_power = pb1200mmc0_set_power, | ||
| 92 | .card_inserted = pb1200mmc0_card_inserted, | ||
| 93 | .card_readonly = pb1200mmc0_card_readonly, | ||
| 94 | .cd_setup = NULL, /* use poll-timer in driver */ | ||
| 95 | .led = &pb1200mmc_led, | ||
| 96 | }, | ||
| 97 | #ifndef CONFIG_MIPS_DB1200 | ||
| 98 | [1] = { | ||
| 99 | .set_power = pb1200mmc1_set_power, | ||
| 100 | .card_inserted = pb1200mmc1_card_inserted, | ||
| 101 | .card_readonly = pb1200mmc1_card_readonly, | ||
| 102 | .cd_setup = NULL, /* use poll-timer in driver */ | ||
| 103 | .led = &pb1200mmc_led, | ||
| 104 | }, | ||
| 105 | #endif | ||
| 106 | }; | ||
| 26 | 107 | ||
| 27 | static struct resource ide_resources[] = { | 108 | static struct resource ide_resources[] = { |
| 28 | [0] = { | 109 | [0] = { |
diff --git a/arch/mips/configs/pnx8335-stb225_defconfig b/arch/mips/configs/pnx8335-stb225_defconfig new file mode 100644 index 000000000000..d9536522cff5 --- /dev/null +++ b/arch/mips/configs/pnx8335-stb225_defconfig | |||
| @@ -0,0 +1,1149 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.26 | ||
| 4 | # Sat Jul 26 09:02:59 2008 | ||
| 5 | # | ||
| 6 | CONFIG_MIPS=y | ||
| 7 | |||
| 8 | # | ||
| 9 | # Machine selection | ||
| 10 | # | ||
| 11 | # CONFIG_MACH_ALCHEMY is not set | ||
| 12 | # CONFIG_BASLER_EXCITE is not set | ||
| 13 | # CONFIG_BCM47XX is not set | ||
| 14 | # CONFIG_MIPS_COBALT is not set | ||
| 15 | # CONFIG_MACH_DECSTATION is not set | ||
| 16 | # CONFIG_MACH_JAZZ is not set | ||
| 17 | # CONFIG_LASAT is not set | ||
| 18 | # CONFIG_LEMOTE_FULONG is not set | ||
| 19 | # CONFIG_MIPS_MALTA is not set | ||
| 20 | # CONFIG_MIPS_SIM is not set | ||
| 21 | # CONFIG_MARKEINS is not set | ||
| 22 | # CONFIG_MACH_VR41XX is not set | ||
| 23 | # CONFIG_NXP_STB220 is not set | ||
| 24 | CONFIG_NXP_STB225=y | ||
| 25 | # CONFIG_PNX8550_JBS is not set | ||
| 26 | # CONFIG_PNX8550_STB810 is not set | ||
| 27 | # CONFIG_PMC_MSP is not set | ||
| 28 | # CONFIG_PMC_YOSEMITE is not set | ||
| 29 | # CONFIG_SGI_IP22 is not set | ||
| 30 | # CONFIG_SGI_IP27 is not set | ||
| 31 | # CONFIG_SGI_IP28 is not set | ||
| 32 | # CONFIG_SGI_IP32 is not set | ||
| 33 | # CONFIG_SIBYTE_CRHINE is not set | ||
| 34 | # CONFIG_SIBYTE_CARMEL is not set | ||
| 35 | # CONFIG_SIBYTE_CRHONE is not set | ||
| 36 | # CONFIG_SIBYTE_RHONE is not set | ||
| 37 | # CONFIG_SIBYTE_SWARM is not set | ||
| 38 | # CONFIG_SIBYTE_LITTLESUR is not set | ||
| 39 | # CONFIG_SIBYTE_SENTOSA is not set | ||
| 40 | # CONFIG_SIBYTE_BIGSUR is not set | ||
| 41 | # CONFIG_SNI_RM is not set | ||
| 42 | # CONFIG_MACH_TX39XX is not set | ||
| 43 | # CONFIG_MACH_TX49XX is not set | ||
| 44 | # CONFIG_WR_PPMC is not set | ||
| 45 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 46 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 47 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 48 | CONFIG_ARCH_SUPPORTS_OPROFILE=y | ||
| 49 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
| 50 | CONFIG_GENERIC_HWEIGHT=y | ||
| 51 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 52 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 53 | CONFIG_GENERIC_TIME=y | ||
| 54 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
| 55 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
| 56 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
| 57 | CONFIG_CEVT_R4K=y | ||
| 58 | CONFIG_CSRC_R4K=y | ||
| 59 | CONFIG_DMA_NONCOHERENT=y | ||
| 60 | CONFIG_DMA_NEED_PCI_MAP_STATE=y | ||
| 61 | # CONFIG_HOTPLUG_CPU is not set | ||
| 62 | # CONFIG_NO_IOPORT is not set | ||
| 63 | CONFIG_GENERIC_GPIO=y | ||
| 64 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
| 65 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
| 66 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | ||
| 67 | CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y | ||
| 68 | CONFIG_IRQ_CPU=y | ||
| 69 | CONFIG_SOC_PNX833X=y | ||
| 70 | CONFIG_SOC_PNX8335=y | ||
| 71 | CONFIG_MIPS_L1_CACHE_SHIFT=5 | ||
| 72 | |||
| 73 | # | ||
| 74 | # CPU selection | ||
| 75 | # | ||
| 76 | # CONFIG_CPU_LOONGSON2 is not set | ||
| 77 | # CONFIG_CPU_MIPS32_R1 is not set | ||
| 78 | CONFIG_CPU_MIPS32_R2=y | ||
| 79 | # CONFIG_CPU_MIPS64_R1 is not set | ||
| 80 | # CONFIG_CPU_MIPS64_R2 is not set | ||
| 81 | # CONFIG_CPU_R3000 is not set | ||
| 82 | # CONFIG_CPU_TX39XX is not set | ||
| 83 | # CONFIG_CPU_VR41XX is not set | ||
| 84 | # CONFIG_CPU_R4300 is not set | ||
| 85 | # CONFIG_CPU_R4X00 is not set | ||
| 86 | # CONFIG_CPU_TX49XX is not set | ||
| 87 | # CONFIG_CPU_R5000 is not set | ||
| 88 | # CONFIG_CPU_R5432 is not set | ||
| 89 | # CONFIG_CPU_R6000 is not set | ||
| 90 | # CONFIG_CPU_NEVADA is not set | ||
| 91 | # CONFIG_CPU_R8000 is not set | ||
| 92 | # CONFIG_CPU_R10000 is not set | ||
| 93 | # CONFIG_CPU_RM7000 is not set | ||
| 94 | # CONFIG_CPU_RM9000 is not set | ||
| 95 | # CONFIG_CPU_SB1 is not set | ||
| 96 | CONFIG_SYS_HAS_CPU_MIPS32_R2=y | ||
| 97 | CONFIG_CPU_MIPS32=y | ||
| 98 | CONFIG_CPU_MIPSR2=y | ||
| 99 | CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y | ||
| 100 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y | ||
| 101 | |||
| 102 | # | ||
| 103 | # Kernel type | ||
| 104 | # | ||
| 105 | CONFIG_32BIT=y | ||
| 106 | # CONFIG_64BIT is not set | ||
| 107 | CONFIG_PAGE_SIZE_4KB=y | ||
| 108 | # CONFIG_PAGE_SIZE_8KB is not set | ||
| 109 | # CONFIG_PAGE_SIZE_16KB is not set | ||
| 110 | # CONFIG_PAGE_SIZE_64KB is not set | ||
| 111 | CONFIG_CPU_HAS_PREFETCH=y | ||
| 112 | CONFIG_MIPS_MT_DISABLED=y | ||
| 113 | # CONFIG_MIPS_MT_SMP is not set | ||
| 114 | # CONFIG_MIPS_MT_SMTC is not set | ||
| 115 | CONFIG_CPU_HAS_LLSC=y | ||
| 116 | CONFIG_CPU_MIPSR2_IRQ_VI=y | ||
| 117 | CONFIG_CPU_HAS_SYNC=y | ||
| 118 | CONFIG_GENERIC_HARDIRQS=y | ||
| 119 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 120 | CONFIG_CPU_SUPPORTS_HIGHMEM=y | ||
| 121 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
| 122 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 123 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 124 | CONFIG_FLATMEM_MANUAL=y | ||
| 125 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 126 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 127 | CONFIG_FLATMEM=y | ||
| 128 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 129 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 130 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 131 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 132 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 133 | # CONFIG_RESOURCES_64BIT is not set | ||
| 134 | CONFIG_ZONE_DMA_FLAG=0 | ||
| 135 | CONFIG_VIRT_TO_BUS=y | ||
| 136 | CONFIG_TICK_ONESHOT=y | ||
| 137 | CONFIG_NO_HZ=y | ||
| 138 | CONFIG_HIGH_RES_TIMERS=y | ||
| 139 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 140 | # CONFIG_HZ_48 is not set | ||
| 141 | # CONFIG_HZ_100 is not set | ||
| 142 | CONFIG_HZ_128=y | ||
| 143 | # CONFIG_HZ_250 is not set | ||
| 144 | # CONFIG_HZ_256 is not set | ||
| 145 | # CONFIG_HZ_1000 is not set | ||
| 146 | # CONFIG_HZ_1024 is not set | ||
| 147 | CONFIG_SYS_SUPPORTS_ARBIT_HZ=y | ||
| 148 | CONFIG_HZ=128 | ||
| 149 | # CONFIG_PREEMPT_NONE is not set | ||
| 150 | CONFIG_PREEMPT_VOLUNTARY=y | ||
| 151 | # CONFIG_PREEMPT is not set | ||
| 152 | # CONFIG_KEXEC is not set | ||
| 153 | # CONFIG_SECCOMP is not set | ||
| 154 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 155 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 156 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 157 | |||
| 158 | # | ||
| 159 | # General setup | ||
| 160 | # | ||
| 161 | CONFIG_EXPERIMENTAL=y | ||
| 162 | CONFIG_BROKEN_ON_SMP=y | ||
| 163 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 164 | CONFIG_LOCALVERSION="" | ||
| 165 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 166 | # CONFIG_SWAP is not set | ||
| 167 | CONFIG_SYSVIPC=y | ||
| 168 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 169 | # CONFIG_POSIX_MQUEUE is not set | ||
| 170 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 171 | # CONFIG_TASKSTATS is not set | ||
| 172 | # CONFIG_AUDIT is not set | ||
| 173 | # CONFIG_IKCONFIG is not set | ||
| 174 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 175 | # CONFIG_CGROUPS is not set | ||
| 176 | # CONFIG_GROUP_SCHED is not set | ||
| 177 | CONFIG_SYSFS_DEPRECATED=y | ||
| 178 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 179 | # CONFIG_RELAY is not set | ||
| 180 | # CONFIG_NAMESPACES is not set | ||
| 181 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 182 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 183 | CONFIG_SYSCTL=y | ||
| 184 | CONFIG_EMBEDDED=y | ||
| 185 | CONFIG_SYSCTL_SYSCALL=y | ||
| 186 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 187 | CONFIG_KALLSYMS=y | ||
| 188 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 189 | CONFIG_HOTPLUG=y | ||
| 190 | CONFIG_PRINTK=y | ||
| 191 | CONFIG_BUG=y | ||
| 192 | CONFIG_ELF_CORE=y | ||
| 193 | CONFIG_PCSPKR_PLATFORM=y | ||
| 194 | CONFIG_COMPAT_BRK=y | ||
| 195 | CONFIG_BASE_FULL=y | ||
| 196 | CONFIG_FUTEX=y | ||
| 197 | CONFIG_ANON_INODES=y | ||
| 198 | CONFIG_EPOLL=y | ||
| 199 | CONFIG_SIGNALFD=y | ||
| 200 | CONFIG_TIMERFD=y | ||
| 201 | CONFIG_EVENTFD=y | ||
| 202 | CONFIG_SHMEM=y | ||
| 203 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 204 | CONFIG_SLAB=y | ||
| 205 | # CONFIG_SLUB is not set | ||
| 206 | # CONFIG_SLOB is not set | ||
| 207 | # CONFIG_PROFILING is not set | ||
| 208 | # CONFIG_MARKERS is not set | ||
| 209 | CONFIG_HAVE_OPROFILE=y | ||
| 210 | # CONFIG_HAVE_KPROBES is not set | ||
| 211 | # CONFIG_HAVE_KRETPROBES is not set | ||
| 212 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 213 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
| 214 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 215 | CONFIG_SLABINFO=y | ||
| 216 | CONFIG_RT_MUTEXES=y | ||
| 217 | # CONFIG_TINY_SHMEM is not set | ||
| 218 | CONFIG_BASE_SMALL=0 | ||
| 219 | CONFIG_MODULES=y | ||
| 220 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 221 | CONFIG_MODULE_UNLOAD=y | ||
| 222 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
| 223 | # CONFIG_MODVERSIONS is not set | ||
| 224 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 225 | CONFIG_KMOD=y | ||
| 226 | CONFIG_BLOCK=y | ||
| 227 | # CONFIG_LBD is not set | ||
| 228 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 229 | # CONFIG_LSF is not set | ||
| 230 | # CONFIG_BLK_DEV_BSG is not set | ||
| 231 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
| 232 | |||
| 233 | # | ||
| 234 | # IO Schedulers | ||
| 235 | # | ||
| 236 | CONFIG_IOSCHED_NOOP=y | ||
| 237 | # CONFIG_IOSCHED_AS is not set | ||
| 238 | # CONFIG_IOSCHED_DEADLINE is not set | ||
| 239 | # CONFIG_IOSCHED_CFQ is not set | ||
| 240 | # CONFIG_DEFAULT_AS is not set | ||
| 241 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 242 | # CONFIG_DEFAULT_CFQ is not set | ||
| 243 | CONFIG_DEFAULT_NOOP=y | ||
| 244 | CONFIG_DEFAULT_IOSCHED="noop" | ||
| 245 | CONFIG_CLASSIC_RCU=y | ||
| 246 | |||
| 247 | # | ||
| 248 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) | ||
| 249 | # | ||
| 250 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 251 | CONFIG_MMU=y | ||
| 252 | # CONFIG_PCCARD is not set | ||
| 253 | |||
| 254 | # | ||
| 255 | # Executable file formats | ||
| 256 | # | ||
| 257 | CONFIG_BINFMT_ELF=y | ||
| 258 | # CONFIG_BINFMT_MISC is not set | ||
| 259 | CONFIG_TRAD_SIGNALS=y | ||
| 260 | |||
| 261 | # | ||
| 262 | # Power management options | ||
| 263 | # | ||
| 264 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
| 265 | CONFIG_PM=y | ||
| 266 | # CONFIG_PM_DEBUG is not set | ||
| 267 | CONFIG_PM_SLEEP=y | ||
| 268 | CONFIG_SUSPEND=y | ||
| 269 | CONFIG_SUSPEND_FREEZER=y | ||
| 270 | |||
| 271 | # | ||
| 272 | # Networking | ||
| 273 | # | ||
| 274 | CONFIG_NET=y | ||
| 275 | |||
| 276 | # | ||
| 277 | # Networking options | ||
| 278 | # | ||
| 279 | CONFIG_PACKET=y | ||
| 280 | # CONFIG_PACKET_MMAP is not set | ||
| 281 | CONFIG_UNIX=y | ||
| 282 | CONFIG_XFRM=y | ||
| 283 | # CONFIG_XFRM_USER is not set | ||
| 284 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 285 | # CONFIG_XFRM_MIGRATE is not set | ||
| 286 | # CONFIG_XFRM_STATISTICS is not set | ||
| 287 | # CONFIG_NET_KEY is not set | ||
| 288 | CONFIG_INET=y | ||
| 289 | CONFIG_IP_MULTICAST=y | ||
| 290 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 291 | CONFIG_IP_FIB_HASH=y | ||
| 292 | CONFIG_IP_PNP=y | ||
| 293 | CONFIG_IP_PNP_DHCP=y | ||
| 294 | # CONFIG_IP_PNP_BOOTP is not set | ||
| 295 | # CONFIG_IP_PNP_RARP is not set | ||
| 296 | # CONFIG_NET_IPIP is not set | ||
| 297 | # CONFIG_NET_IPGRE is not set | ||
| 298 | # CONFIG_IP_MROUTE is not set | ||
| 299 | # CONFIG_ARPD is not set | ||
| 300 | # CONFIG_SYN_COOKIES is not set | ||
| 301 | CONFIG_INET_AH=y | ||
| 302 | # CONFIG_INET_ESP is not set | ||
| 303 | # CONFIG_INET_IPCOMP is not set | ||
| 304 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 305 | # CONFIG_INET_TUNNEL is not set | ||
| 306 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
| 307 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
| 308 | CONFIG_INET_XFRM_MODE_BEET=y | ||
| 309 | # CONFIG_INET_LRO is not set | ||
| 310 | CONFIG_INET_DIAG=y | ||
| 311 | CONFIG_INET_TCP_DIAG=y | ||
| 312 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 313 | CONFIG_TCP_CONG_CUBIC=y | ||
| 314 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 315 | # CONFIG_TCP_MD5SIG is not set | ||
| 316 | # CONFIG_IPV6 is not set | ||
| 317 | # CONFIG_NETWORK_SECMARK is not set | ||
| 318 | # CONFIG_NETFILTER is not set | ||
| 319 | # CONFIG_IP_DCCP is not set | ||
| 320 | # CONFIG_IP_SCTP is not set | ||
| 321 | # CONFIG_TIPC is not set | ||
| 322 | # CONFIG_ATM is not set | ||
| 323 | # CONFIG_BRIDGE is not set | ||
| 324 | # CONFIG_VLAN_8021Q is not set | ||
| 325 | # CONFIG_DECNET is not set | ||
| 326 | # CONFIG_LLC2 is not set | ||
| 327 | # CONFIG_IPX is not set | ||
| 328 | # CONFIG_ATALK is not set | ||
| 329 | # CONFIG_X25 is not set | ||
| 330 | # CONFIG_LAPB is not set | ||
| 331 | # CONFIG_ECONET is not set | ||
| 332 | # CONFIG_WAN_ROUTER is not set | ||
| 333 | # CONFIG_NET_SCHED is not set | ||
| 334 | |||
| 335 | # | ||
| 336 | # Network testing | ||
| 337 | # | ||
| 338 | # CONFIG_NET_PKTGEN is not set | ||
| 339 | # CONFIG_HAMRADIO is not set | ||
| 340 | # CONFIG_CAN is not set | ||
| 341 | # CONFIG_IRDA is not set | ||
| 342 | # CONFIG_BT is not set | ||
| 343 | # CONFIG_AF_RXRPC is not set | ||
| 344 | |||
| 345 | # | ||
| 346 | # Wireless | ||
| 347 | # | ||
| 348 | # CONFIG_CFG80211 is not set | ||
| 349 | # CONFIG_WIRELESS_EXT is not set | ||
| 350 | # CONFIG_MAC80211 is not set | ||
| 351 | # CONFIG_IEEE80211 is not set | ||
| 352 | # CONFIG_RFKILL is not set | ||
| 353 | # CONFIG_NET_9P is not set | ||
| 354 | |||
| 355 | # | ||
| 356 | # Device Drivers | ||
| 357 | # | ||
| 358 | |||
| 359 | # | ||
| 360 | # Generic Driver Options | ||
| 361 | # | ||
| 362 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 363 | CONFIG_STANDALONE=y | ||
| 364 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 365 | CONFIG_FW_LOADER=y | ||
| 366 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
| 367 | CONFIG_EXTRA_FIRMWARE="" | ||
| 368 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 369 | # CONFIG_CONNECTOR is not set | ||
| 370 | CONFIG_MTD=y | ||
| 371 | # CONFIG_MTD_DEBUG is not set | ||
| 372 | # CONFIG_MTD_CONCAT is not set | ||
| 373 | CONFIG_MTD_PARTITIONS=y | ||
| 374 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 375 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 376 | # CONFIG_MTD_AR7_PARTS is not set | ||
| 377 | |||
| 378 | # | ||
| 379 | # User Modules And Translation Layers | ||
| 380 | # | ||
| 381 | CONFIG_MTD_CHAR=y | ||
| 382 | CONFIG_MTD_BLKDEVS=y | ||
| 383 | CONFIG_MTD_BLOCK=y | ||
| 384 | # CONFIG_FTL is not set | ||
| 385 | # CONFIG_NFTL is not set | ||
| 386 | # CONFIG_INFTL is not set | ||
| 387 | # CONFIG_RFD_FTL is not set | ||
| 388 | # CONFIG_SSFDC is not set | ||
| 389 | # CONFIG_MTD_OOPS is not set | ||
| 390 | |||
| 391 | # | ||
| 392 | # RAM/ROM/Flash chip drivers | ||
| 393 | # | ||
| 394 | CONFIG_MTD_CFI=y | ||
| 395 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 396 | CONFIG_MTD_GEN_PROBE=y | ||
| 397 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
| 398 | # CONFIG_MTD_CFI_NOSWAP is not set | ||
| 399 | # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
| 400 | CONFIG_MTD_CFI_LE_BYTE_SWAP=y | ||
| 401 | CONFIG_MTD_CFI_GEOMETRY=y | ||
| 402 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 403 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 404 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 405 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 406 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 407 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 408 | CONFIG_MTD_CFI_I1=y | ||
| 409 | CONFIG_MTD_CFI_I2=y | ||
| 410 | # CONFIG_MTD_CFI_I4 is not set | ||
| 411 | # CONFIG_MTD_CFI_I8 is not set | ||
| 412 | # CONFIG_MTD_OTP is not set | ||
| 413 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
| 414 | CONFIG_MTD_CFI_AMDSTD=y | ||
| 415 | # CONFIG_MTD_CFI_STAA is not set | ||
| 416 | CONFIG_MTD_CFI_UTIL=y | ||
| 417 | # CONFIG_MTD_RAM is not set | ||
| 418 | # CONFIG_MTD_ROM is not set | ||
| 419 | # CONFIG_MTD_ABSENT is not set | ||
| 420 | |||
| 421 | # | ||
| 422 | # Mapping drivers for chip access | ||
| 423 | # | ||
| 424 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 425 | CONFIG_MTD_PHYSMAP=y | ||
| 426 | CONFIG_MTD_PHYSMAP_START=0x18000000 | ||
| 427 | CONFIG_MTD_PHYSMAP_LEN=0x04000000 | ||
| 428 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
| 429 | # CONFIG_MTD_PLATRAM is not set | ||
| 430 | |||
| 431 | # | ||
| 432 | # Self-contained MTD device drivers | ||
| 433 | # | ||
| 434 | # CONFIG_MTD_SLRAM is not set | ||
| 435 | # CONFIG_MTD_PHRAM is not set | ||
| 436 | # CONFIG_MTD_MTDRAM is not set | ||
| 437 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 438 | |||
| 439 | # | ||
| 440 | # Disk-On-Chip Device Drivers | ||
| 441 | # | ||
| 442 | # CONFIG_MTD_DOC2000 is not set | ||
| 443 | # CONFIG_MTD_DOC2001 is not set | ||
| 444 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 445 | # CONFIG_MTD_NAND is not set | ||
| 446 | # CONFIG_MTD_ONENAND is not set | ||
| 447 | |||
| 448 | # | ||
| 449 | # UBI - Unsorted block images | ||
| 450 | # | ||
| 451 | # CONFIG_MTD_UBI is not set | ||
| 452 | # CONFIG_PARPORT is not set | ||
| 453 | CONFIG_BLK_DEV=y | ||
| 454 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 455 | CONFIG_BLK_DEV_LOOP=y | ||
| 456 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 457 | # CONFIG_BLK_DEV_NBD is not set | ||
| 458 | # CONFIG_BLK_DEV_RAM is not set | ||
| 459 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 460 | # CONFIG_ATA_OVER_ETH is not set | ||
| 461 | # CONFIG_BLK_DEV_HD is not set | ||
| 462 | # CONFIG_MISC_DEVICES is not set | ||
| 463 | CONFIG_HAVE_IDE=y | ||
| 464 | # CONFIG_IDE is not set | ||
| 465 | |||
| 466 | # | ||
| 467 | # SCSI device support | ||
| 468 | # | ||
| 469 | # CONFIG_RAID_ATTRS is not set | ||
| 470 | CONFIG_SCSI=y | ||
| 471 | CONFIG_SCSI_DMA=y | ||
| 472 | # CONFIG_SCSI_TGT is not set | ||
| 473 | # CONFIG_SCSI_NETLINK is not set | ||
| 474 | CONFIG_SCSI_PROC_FS=y | ||
| 475 | |||
| 476 | # | ||
| 477 | # SCSI support type (disk, tape, CD-ROM) | ||
| 478 | # | ||
| 479 | CONFIG_BLK_DEV_SD=y | ||
| 480 | # CONFIG_CHR_DEV_ST is not set | ||
| 481 | # CONFIG_CHR_DEV_OSST is not set | ||
| 482 | # CONFIG_BLK_DEV_SR is not set | ||
| 483 | # CONFIG_CHR_DEV_SG is not set | ||
| 484 | # CONFIG_CHR_DEV_SCH is not set | ||
| 485 | |||
| 486 | # | ||
| 487 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 488 | # | ||
| 489 | # CONFIG_SCSI_MULTI_LUN is not set | ||
| 490 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 491 | # CONFIG_SCSI_LOGGING is not set | ||
| 492 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 493 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 494 | |||
| 495 | # | ||
| 496 | # SCSI Transports | ||
| 497 | # | ||
| 498 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 499 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 500 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 501 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 502 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 503 | # CONFIG_SCSI_LOWLEVEL is not set | ||
| 504 | # CONFIG_SCSI_DH is not set | ||
| 505 | CONFIG_ATA=y | ||
| 506 | # CONFIG_ATA_NONSTANDARD is not set | ||
| 507 | CONFIG_SATA_PMP=y | ||
| 508 | CONFIG_ATA_SFF=y | ||
| 509 | # CONFIG_SATA_MV is not set | ||
| 510 | # CONFIG_PATA_PLATFORM is not set | ||
| 511 | # CONFIG_MD is not set | ||
| 512 | CONFIG_NETDEVICES=y | ||
| 513 | # CONFIG_DUMMY is not set | ||
| 514 | # CONFIG_BONDING is not set | ||
| 515 | # CONFIG_MACVLAN is not set | ||
| 516 | # CONFIG_EQUALIZER is not set | ||
| 517 | # CONFIG_TUN is not set | ||
| 518 | # CONFIG_VETH is not set | ||
| 519 | # CONFIG_PHYLIB is not set | ||
| 520 | CONFIG_NET_ETHERNET=y | ||
| 521 | CONFIG_MII=y | ||
| 522 | # CONFIG_AX88796 is not set | ||
| 523 | # CONFIG_DM9000 is not set | ||
| 524 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 525 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 526 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 527 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 528 | # CONFIG_B44 is not set | ||
| 529 | # CONFIG_NETDEV_1000 is not set | ||
| 530 | # CONFIG_NETDEV_10000 is not set | ||
| 531 | |||
| 532 | # | ||
| 533 | # Wireless LAN | ||
| 534 | # | ||
| 535 | # CONFIG_WLAN_PRE80211 is not set | ||
| 536 | # CONFIG_WLAN_80211 is not set | ||
| 537 | # CONFIG_IWLWIFI_LEDS is not set | ||
| 538 | # CONFIG_WAN is not set | ||
| 539 | # CONFIG_PPP is not set | ||
| 540 | # CONFIG_SLIP is not set | ||
| 541 | # CONFIG_NETCONSOLE is not set | ||
| 542 | # CONFIG_NETPOLL is not set | ||
| 543 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 544 | # CONFIG_ISDN is not set | ||
| 545 | # CONFIG_PHONE is not set | ||
| 546 | |||
| 547 | # | ||
| 548 | # Input device support | ||
| 549 | # | ||
| 550 | CONFIG_INPUT=y | ||
| 551 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 552 | # CONFIG_INPUT_POLLDEV is not set | ||
| 553 | |||
| 554 | # | ||
| 555 | # Userland interfaces | ||
| 556 | # | ||
| 557 | # CONFIG_INPUT_MOUSEDEV is not set | ||
| 558 | # CONFIG_INPUT_JOYDEV is not set | ||
| 559 | CONFIG_INPUT_EVDEV=m | ||
| 560 | CONFIG_INPUT_EVBUG=m | ||
| 561 | |||
| 562 | # | ||
| 563 | # Input Device Drivers | ||
| 564 | # | ||
| 565 | # CONFIG_INPUT_KEYBOARD is not set | ||
| 566 | # CONFIG_INPUT_MOUSE is not set | ||
| 567 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 568 | # CONFIG_INPUT_TABLET is not set | ||
| 569 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 570 | # CONFIG_INPUT_MISC is not set | ||
| 571 | |||
| 572 | # | ||
| 573 | # Hardware I/O ports | ||
| 574 | # | ||
| 575 | CONFIG_SERIO=y | ||
| 576 | # CONFIG_SERIO_I8042 is not set | ||
| 577 | CONFIG_SERIO_SERPORT=y | ||
| 578 | # CONFIG_SERIO_LIBPS2 is not set | ||
| 579 | # CONFIG_SERIO_RAW is not set | ||
| 580 | # CONFIG_GAMEPORT is not set | ||
| 581 | |||
| 582 | # | ||
| 583 | # Character devices | ||
| 584 | # | ||
| 585 | CONFIG_VT=y | ||
| 586 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
| 587 | # CONFIG_VT_CONSOLE is not set | ||
| 588 | CONFIG_HW_CONSOLE=y | ||
| 589 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 590 | CONFIG_DEVKMEM=y | ||
| 591 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 592 | |||
| 593 | # | ||
| 594 | # Serial drivers | ||
| 595 | # | ||
| 596 | # CONFIG_SERIAL_8250 is not set | ||
| 597 | |||
| 598 | # | ||
| 599 | # Non-8250 serial port support | ||
| 600 | # | ||
| 601 | CONFIG_SERIAL_PNX8XXX=y | ||
| 602 | CONFIG_SERIAL_PNX8XXX_CONSOLE=y | ||
| 603 | CONFIG_SERIAL_CORE=y | ||
| 604 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 605 | CONFIG_UNIX98_PTYS=y | ||
| 606 | # CONFIG_LEGACY_PTYS is not set | ||
| 607 | # CONFIG_IPMI_HANDLER is not set | ||
| 608 | CONFIG_HW_RANDOM=y | ||
| 609 | # CONFIG_R3964 is not set | ||
| 610 | # CONFIG_RAW_DRIVER is not set | ||
| 611 | # CONFIG_TCG_TPM is not set | ||
| 612 | CONFIG_I2C=y | ||
| 613 | CONFIG_I2C_BOARDINFO=y | ||
| 614 | CONFIG_I2C_CHARDEV=y | ||
| 615 | |||
| 616 | # | ||
| 617 | # I2C Hardware Bus support | ||
| 618 | # | ||
| 619 | |||
| 620 | # | ||
| 621 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
| 622 | # | ||
| 623 | # CONFIG_I2C_GPIO is not set | ||
| 624 | # CONFIG_I2C_OCORES is not set | ||
| 625 | # CONFIG_I2C_SIMTEC is not set | ||
| 626 | |||
| 627 | # | ||
| 628 | # External I2C/SMBus adapter drivers | ||
| 629 | # | ||
| 630 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 631 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 632 | |||
| 633 | # | ||
| 634 | # Other I2C/SMBus bus drivers | ||
| 635 | # | ||
| 636 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
| 637 | # CONFIG_I2C_STUB is not set | ||
| 638 | |||
| 639 | # | ||
| 640 | # Miscellaneous I2C Chip support | ||
| 641 | # | ||
| 642 | # CONFIG_DS1682 is not set | ||
| 643 | # CONFIG_AT24 is not set | ||
| 644 | # CONFIG_SENSORS_EEPROM is not set | ||
| 645 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 646 | # CONFIG_PCF8575 is not set | ||
| 647 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 648 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 649 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 650 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 651 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 652 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 653 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 654 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 655 | # CONFIG_SPI is not set | ||
| 656 | # CONFIG_W1 is not set | ||
| 657 | # CONFIG_POWER_SUPPLY is not set | ||
| 658 | # CONFIG_HWMON is not set | ||
| 659 | # CONFIG_THERMAL is not set | ||
| 660 | # CONFIG_THERMAL_HWMON is not set | ||
| 661 | # CONFIG_WATCHDOG is not set | ||
| 662 | |||
| 663 | # | ||
| 664 | # Sonics Silicon Backplane | ||
| 665 | # | ||
| 666 | CONFIG_SSB_POSSIBLE=y | ||
| 667 | # CONFIG_SSB is not set | ||
| 668 | |||
| 669 | # | ||
| 670 | # Multifunction device drivers | ||
| 671 | # | ||
| 672 | # CONFIG_MFD_CORE is not set | ||
| 673 | # CONFIG_MFD_SM501 is not set | ||
| 674 | # CONFIG_HTC_PASIC3 is not set | ||
| 675 | |||
| 676 | # | ||
| 677 | # Multimedia devices | ||
| 678 | # | ||
| 679 | |||
| 680 | # | ||
| 681 | # Multimedia core support | ||
| 682 | # | ||
| 683 | # CONFIG_VIDEO_DEV is not set | ||
| 684 | CONFIG_DVB_CORE=y | ||
| 685 | CONFIG_VIDEO_MEDIA=y | ||
| 686 | |||
| 687 | # | ||
| 688 | # Multimedia drivers | ||
| 689 | # | ||
| 690 | # CONFIG_MEDIA_ATTACH is not set | ||
| 691 | CONFIG_MEDIA_TUNER=y | ||
| 692 | # CONFIG_MEDIA_TUNER_CUSTOMIZE is not set | ||
| 693 | CONFIG_MEDIA_TUNER_SIMPLE=y | ||
| 694 | CONFIG_MEDIA_TUNER_TDA8290=y | ||
| 695 | CONFIG_MEDIA_TUNER_TDA9887=y | ||
| 696 | CONFIG_MEDIA_TUNER_TEA5761=y | ||
| 697 | CONFIG_MEDIA_TUNER_TEA5767=y | ||
| 698 | CONFIG_MEDIA_TUNER_MT20XX=y | ||
| 699 | CONFIG_MEDIA_TUNER_XC2028=y | ||
| 700 | CONFIG_MEDIA_TUNER_XC5000=y | ||
| 701 | CONFIG_DVB_CAPTURE_DRIVERS=y | ||
| 702 | # CONFIG_TTPCI_EEPROM is not set | ||
| 703 | # CONFIG_DVB_B2C2_FLEXCOP is not set | ||
| 704 | |||
| 705 | # | ||
| 706 | # Supported DVB Frontends | ||
| 707 | # | ||
| 708 | |||
| 709 | # | ||
| 710 | # Customise DVB Frontends | ||
| 711 | # | ||
| 712 | # CONFIG_DVB_FE_CUSTOMISE is not set | ||
| 713 | |||
| 714 | # | ||
| 715 | # DVB-S (satellite) frontends | ||
| 716 | # | ||
| 717 | # CONFIG_DVB_CX24110 is not set | ||
| 718 | # CONFIG_DVB_CX24123 is not set | ||
| 719 | # CONFIG_DVB_MT312 is not set | ||
| 720 | # CONFIG_DVB_S5H1420 is not set | ||
| 721 | # CONFIG_DVB_STV0299 is not set | ||
| 722 | # CONFIG_DVB_TDA8083 is not set | ||
| 723 | # CONFIG_DVB_TDA10086 is not set | ||
| 724 | # CONFIG_DVB_VES1X93 is not set | ||
| 725 | # CONFIG_DVB_TUNER_ITD1000 is not set | ||
| 726 | # CONFIG_DVB_TDA826X is not set | ||
| 727 | # CONFIG_DVB_TUA6100 is not set | ||
| 728 | |||
| 729 | # | ||
| 730 | # DVB-T (terrestrial) frontends | ||
| 731 | # | ||
| 732 | # CONFIG_DVB_SP8870 is not set | ||
| 733 | # CONFIG_DVB_SP887X is not set | ||
| 734 | # CONFIG_DVB_CX22700 is not set | ||
| 735 | # CONFIG_DVB_CX22702 is not set | ||
| 736 | # CONFIG_DVB_DRX397XD is not set | ||
| 737 | # CONFIG_DVB_L64781 is not set | ||
| 738 | CONFIG_DVB_TDA1004X=y | ||
| 739 | # CONFIG_DVB_NXT6000 is not set | ||
| 740 | # CONFIG_DVB_MT352 is not set | ||
| 741 | # CONFIG_DVB_ZL10353 is not set | ||
| 742 | # CONFIG_DVB_DIB3000MB is not set | ||
| 743 | # CONFIG_DVB_DIB3000MC is not set | ||
| 744 | # CONFIG_DVB_DIB7000M is not set | ||
| 745 | # CONFIG_DVB_DIB7000P is not set | ||
| 746 | # CONFIG_DVB_TDA10048 is not set | ||
| 747 | |||
| 748 | # | ||
| 749 | # DVB-C (cable) frontends | ||
| 750 | # | ||
| 751 | # CONFIG_DVB_VES1820 is not set | ||
| 752 | # CONFIG_DVB_TDA10021 is not set | ||
| 753 | # CONFIG_DVB_TDA10023 is not set | ||
| 754 | # CONFIG_DVB_STV0297 is not set | ||
| 755 | |||
| 756 | # | ||
| 757 | # ATSC (North American/Korean Terrestrial/Cable DTV) frontends | ||
| 758 | # | ||
| 759 | # CONFIG_DVB_NXT200X is not set | ||
| 760 | # CONFIG_DVB_OR51211 is not set | ||
| 761 | # CONFIG_DVB_OR51132 is not set | ||
| 762 | # CONFIG_DVB_BCM3510 is not set | ||
| 763 | # CONFIG_DVB_LGDT330X is not set | ||
| 764 | # CONFIG_DVB_S5H1409 is not set | ||
| 765 | # CONFIG_DVB_AU8522 is not set | ||
| 766 | # CONFIG_DVB_S5H1411 is not set | ||
| 767 | |||
| 768 | # | ||
| 769 | # Digital terrestrial only tuners/PLL | ||
| 770 | # | ||
| 771 | # CONFIG_DVB_PLL is not set | ||
| 772 | # CONFIG_DVB_TUNER_DIB0070 is not set | ||
| 773 | |||
| 774 | # | ||
| 775 | # SEC control devices for DVB-S | ||
| 776 | # | ||
| 777 | # CONFIG_DVB_LNBP21 is not set | ||
| 778 | # CONFIG_DVB_ISL6405 is not set | ||
| 779 | # CONFIG_DVB_ISL6421 is not set | ||
| 780 | # CONFIG_DAB is not set | ||
| 781 | |||
| 782 | # | ||
| 783 | # Graphics support | ||
| 784 | # | ||
| 785 | # CONFIG_VGASTATE is not set | ||
| 786 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
| 787 | CONFIG_FB=y | ||
| 788 | # CONFIG_FIRMWARE_EDID is not set | ||
| 789 | # CONFIG_FB_DDC is not set | ||
| 790 | # CONFIG_FB_CFB_FILLRECT is not set | ||
| 791 | # CONFIG_FB_CFB_COPYAREA is not set | ||
| 792 | # CONFIG_FB_CFB_IMAGEBLIT is not set | ||
| 793 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 794 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 795 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 796 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 797 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
| 798 | # CONFIG_FB_SYS_FOPS is not set | ||
| 799 | # CONFIG_FB_SVGALIB is not set | ||
| 800 | # CONFIG_FB_MACMODES is not set | ||
| 801 | # CONFIG_FB_BACKLIGHT is not set | ||
| 802 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 803 | # CONFIG_FB_TILEBLITTING is not set | ||
| 804 | |||
| 805 | # | ||
| 806 | # Frame buffer hardware drivers | ||
| 807 | # | ||
| 808 | # CONFIG_FB_S1D13XXX is not set | ||
| 809 | # CONFIG_FB_VIRTUAL is not set | ||
| 810 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
| 811 | |||
| 812 | # | ||
| 813 | # Display device support | ||
| 814 | # | ||
| 815 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 816 | |||
| 817 | # | ||
| 818 | # Console display driver support | ||
| 819 | # | ||
| 820 | # CONFIG_VGA_CONSOLE is not set | ||
| 821 | CONFIG_DUMMY_CONSOLE=y | ||
| 822 | # CONFIG_FRAMEBUFFER_CONSOLE is not set | ||
| 823 | # CONFIG_LOGO is not set | ||
| 824 | CONFIG_SOUND=m | ||
| 825 | CONFIG_SND=m | ||
| 826 | CONFIG_SND_TIMER=m | ||
| 827 | CONFIG_SND_PCM=m | ||
| 828 | CONFIG_SND_SEQUENCER=m | ||
| 829 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 830 | CONFIG_SND_OSSEMUL=y | ||
| 831 | CONFIG_SND_MIXER_OSS=m | ||
| 832 | CONFIG_SND_PCM_OSS=m | ||
| 833 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 834 | CONFIG_SND_SEQUENCER_OSS=y | ||
| 835 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 836 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 837 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 838 | CONFIG_SND_VERBOSE_PRINTK=y | ||
| 839 | CONFIG_SND_DEBUG=y | ||
| 840 | # CONFIG_SND_DEBUG_VERBOSE is not set | ||
| 841 | # CONFIG_SND_PCM_XRUN_DEBUG is not set | ||
| 842 | CONFIG_SND_DRIVERS=y | ||
| 843 | # CONFIG_SND_DUMMY is not set | ||
| 844 | # CONFIG_SND_VIRMIDI is not set | ||
| 845 | # CONFIG_SND_MTPAV is not set | ||
| 846 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 847 | # CONFIG_SND_MPU401 is not set | ||
| 848 | CONFIG_SND_MIPS=y | ||
| 849 | # CONFIG_SND_SOC is not set | ||
| 850 | # CONFIG_SOUND_PRIME is not set | ||
| 851 | CONFIG_HID_SUPPORT=y | ||
| 852 | CONFIG_HID=y | ||
| 853 | # CONFIG_HID_DEBUG is not set | ||
| 854 | # CONFIG_HIDRAW is not set | ||
| 855 | CONFIG_USB_SUPPORT=y | ||
| 856 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
| 857 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
| 858 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 859 | # CONFIG_USB_OTG_WHITELIST is not set | ||
| 860 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
| 861 | |||
| 862 | # | ||
| 863 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 864 | # | ||
| 865 | # CONFIG_USB_GADGET is not set | ||
| 866 | # CONFIG_MMC is not set | ||
| 867 | # CONFIG_MEMSTICK is not set | ||
| 868 | # CONFIG_NEW_LEDS is not set | ||
| 869 | # CONFIG_ACCESSIBILITY is not set | ||
| 870 | CONFIG_RTC_LIB=y | ||
| 871 | # CONFIG_RTC_CLASS is not set | ||
| 872 | # CONFIG_DMADEVICES is not set | ||
| 873 | # CONFIG_UIO is not set | ||
| 874 | |||
| 875 | # | ||
| 876 | # File systems | ||
| 877 | # | ||
| 878 | CONFIG_EXT2_FS=m | ||
| 879 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 880 | # CONFIG_EXT2_FS_XIP is not set | ||
| 881 | # CONFIG_EXT3_FS is not set | ||
| 882 | # CONFIG_EXT4DEV_FS is not set | ||
| 883 | # CONFIG_REISERFS_FS is not set | ||
| 884 | # CONFIG_JFS_FS is not set | ||
| 885 | # CONFIG_FS_POSIX_ACL is not set | ||
| 886 | # CONFIG_XFS_FS is not set | ||
| 887 | # CONFIG_OCFS2_FS is not set | ||
| 888 | # CONFIG_DNOTIFY is not set | ||
| 889 | CONFIG_INOTIFY=y | ||
| 890 | CONFIG_INOTIFY_USER=y | ||
| 891 | # CONFIG_QUOTA is not set | ||
| 892 | # CONFIG_AUTOFS_FS is not set | ||
| 893 | # CONFIG_AUTOFS4_FS is not set | ||
| 894 | # CONFIG_FUSE_FS is not set | ||
| 895 | |||
| 896 | # | ||
| 897 | # CD-ROM/DVD Filesystems | ||
| 898 | # | ||
| 899 | # CONFIG_ISO9660_FS is not set | ||
| 900 | # CONFIG_UDF_FS is not set | ||
| 901 | |||
| 902 | # | ||
| 903 | # DOS/FAT/NT Filesystems | ||
| 904 | # | ||
| 905 | CONFIG_FAT_FS=m | ||
| 906 | CONFIG_MSDOS_FS=m | ||
| 907 | CONFIG_VFAT_FS=m | ||
| 908 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 909 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 910 | # CONFIG_NTFS_FS is not set | ||
| 911 | |||
| 912 | # | ||
| 913 | # Pseudo filesystems | ||
| 914 | # | ||
| 915 | CONFIG_PROC_FS=y | ||
| 916 | # CONFIG_PROC_KCORE is not set | ||
| 917 | CONFIG_PROC_SYSCTL=y | ||
| 918 | CONFIG_SYSFS=y | ||
| 919 | CONFIG_TMPFS=y | ||
| 920 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 921 | # CONFIG_HUGETLB_PAGE is not set | ||
| 922 | # CONFIG_CONFIGFS_FS is not set | ||
| 923 | |||
| 924 | # | ||
| 925 | # Miscellaneous filesystems | ||
| 926 | # | ||
| 927 | # CONFIG_ADFS_FS is not set | ||
| 928 | # CONFIG_AFFS_FS is not set | ||
| 929 | # CONFIG_HFS_FS is not set | ||
| 930 | # CONFIG_HFSPLUS_FS is not set | ||
| 931 | # CONFIG_BEFS_FS is not set | ||
| 932 | # CONFIG_BFS_FS is not set | ||
| 933 | # CONFIG_EFS_FS is not set | ||
| 934 | CONFIG_JFFS2_FS=y | ||
| 935 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 936 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 937 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 938 | # CONFIG_JFFS2_SUMMARY is not set | ||
| 939 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 940 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
| 941 | CONFIG_JFFS2_ZLIB=y | ||
| 942 | # CONFIG_JFFS2_LZO is not set | ||
| 943 | CONFIG_JFFS2_RTIME=y | ||
| 944 | # CONFIG_JFFS2_RUBIN is not set | ||
| 945 | CONFIG_CRAMFS=y | ||
| 946 | # CONFIG_VXFS_FS is not set | ||
| 947 | # CONFIG_MINIX_FS is not set | ||
| 948 | # CONFIG_HPFS_FS is not set | ||
| 949 | # CONFIG_QNX4FS_FS is not set | ||
| 950 | # CONFIG_ROMFS_FS is not set | ||
| 951 | # CONFIG_SYSV_FS is not set | ||
| 952 | # CONFIG_UFS_FS is not set | ||
| 953 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 954 | CONFIG_NFS_FS=y | ||
| 955 | CONFIG_NFS_V3=y | ||
| 956 | # CONFIG_NFS_V3_ACL is not set | ||
| 957 | # CONFIG_NFS_V4 is not set | ||
| 958 | CONFIG_ROOT_NFS=y | ||
| 959 | CONFIG_NFSD=m | ||
| 960 | CONFIG_NFSD_V3=y | ||
| 961 | # CONFIG_NFSD_V3_ACL is not set | ||
| 962 | # CONFIG_NFSD_V4 is not set | ||
| 963 | CONFIG_LOCKD=y | ||
| 964 | CONFIG_LOCKD_V4=y | ||
| 965 | CONFIG_EXPORTFS=m | ||
| 966 | CONFIG_NFS_COMMON=y | ||
| 967 | CONFIG_SUNRPC=y | ||
| 968 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
| 969 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 970 | # CONFIG_SMB_FS is not set | ||
| 971 | # CONFIG_CIFS is not set | ||
| 972 | # CONFIG_NCP_FS is not set | ||
| 973 | # CONFIG_CODA_FS is not set | ||
| 974 | # CONFIG_AFS_FS is not set | ||
| 975 | |||
| 976 | # | ||
| 977 | # Partition Types | ||
| 978 | # | ||
| 979 | # CONFIG_PARTITION_ADVANCED is not set | ||
| 980 | CONFIG_MSDOS_PARTITION=y | ||
| 981 | CONFIG_NLS=y | ||
| 982 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
| 983 | CONFIG_NLS_CODEPAGE_437=m | ||
| 984 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
| 985 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
| 986 | CONFIG_NLS_CODEPAGE_850=m | ||
| 987 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
| 988 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
| 989 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
| 990 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
| 991 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
| 992 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
| 993 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
| 994 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
| 995 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
| 996 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
| 997 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
| 998 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
| 999 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
| 1000 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1001 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
| 1002 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
| 1003 | # CONFIG_NLS_ISO8859_8 is not set | ||
| 1004 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
| 1005 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
| 1006 | CONFIG_NLS_ASCII=m | ||
| 1007 | CONFIG_NLS_ISO8859_1=m | ||
| 1008 | # CONFIG_NLS_ISO8859_2 is not set | ||
| 1009 | # CONFIG_NLS_ISO8859_3 is not set | ||
| 1010 | # CONFIG_NLS_ISO8859_4 is not set | ||
| 1011 | # CONFIG_NLS_ISO8859_5 is not set | ||
| 1012 | # CONFIG_NLS_ISO8859_6 is not set | ||
| 1013 | # CONFIG_NLS_ISO8859_7 is not set | ||
| 1014 | # CONFIG_NLS_ISO8859_9 is not set | ||
| 1015 | # CONFIG_NLS_ISO8859_13 is not set | ||
| 1016 | # CONFIG_NLS_ISO8859_14 is not set | ||
| 1017 | CONFIG_NLS_ISO8859_15=m | ||
| 1018 | # CONFIG_NLS_KOI8_R is not set | ||
| 1019 | # CONFIG_NLS_KOI8_U is not set | ||
| 1020 | CONFIG_NLS_UTF8=m | ||
| 1021 | # CONFIG_DLM is not set | ||
| 1022 | |||
| 1023 | # | ||
| 1024 | # Kernel hacking | ||
| 1025 | # | ||
| 1026 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 1027 | # CONFIG_PRINTK_TIME is not set | ||
| 1028 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1029 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1030 | CONFIG_FRAME_WARN=1024 | ||
| 1031 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 1032 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1033 | # CONFIG_DEBUG_FS is not set | ||
| 1034 | # CONFIG_HEADERS_CHECK is not set | ||
| 1035 | # CONFIG_DEBUG_KERNEL is not set | ||
| 1036 | # CONFIG_SAMPLES is not set | ||
| 1037 | # CONFIG_KERNEL_TESTS is not set | ||
| 1038 | CONFIG_CMDLINE="" | ||
| 1039 | |||
| 1040 | # | ||
| 1041 | # Security options | ||
| 1042 | # | ||
| 1043 | # CONFIG_KEYS is not set | ||
| 1044 | # CONFIG_SECURITY is not set | ||
| 1045 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1046 | CONFIG_CRYPTO=y | ||
| 1047 | |||
| 1048 | # | ||
| 1049 | # Crypto core or helper | ||
| 1050 | # | ||
| 1051 | CONFIG_CRYPTO_ALGAPI=y | ||
| 1052 | CONFIG_CRYPTO_HASH=y | ||
| 1053 | CONFIG_CRYPTO_MANAGER=y | ||
| 1054 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1055 | # CONFIG_CRYPTO_NULL is not set | ||
| 1056 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1057 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1058 | # CONFIG_CRYPTO_TEST is not set | ||
| 1059 | |||
| 1060 | # | ||
| 1061 | # Authenticated Encryption with Associated Data | ||
| 1062 | # | ||
| 1063 | # CONFIG_CRYPTO_CCM is not set | ||
| 1064 | # CONFIG_CRYPTO_GCM is not set | ||
| 1065 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1066 | |||
| 1067 | # | ||
| 1068 | # Block modes | ||
| 1069 | # | ||
| 1070 | # CONFIG_CRYPTO_CBC is not set | ||
| 1071 | # CONFIG_CRYPTO_CTR is not set | ||
| 1072 | # CONFIG_CRYPTO_CTS is not set | ||
| 1073 | # CONFIG_CRYPTO_ECB is not set | ||
| 1074 | # CONFIG_CRYPTO_LRW is not set | ||
| 1075 | # CONFIG_CRYPTO_PCBC is not set | ||
| 1076 | # CONFIG_CRYPTO_XTS is not set | ||
| 1077 | |||
| 1078 | # | ||
| 1079 | # Hash modes | ||
| 1080 | # | ||
| 1081 | CONFIG_CRYPTO_HMAC=y | ||
| 1082 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1083 | |||
| 1084 | # | ||
| 1085 | # Digest | ||
| 1086 | # | ||
| 1087 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1088 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1089 | CONFIG_CRYPTO_MD5=y | ||
| 1090 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1091 | # CONFIG_CRYPTO_RMD128 is not set | ||
| 1092 | # CONFIG_CRYPTO_RMD160 is not set | ||
| 1093 | # CONFIG_CRYPTO_RMD256 is not set | ||
| 1094 | # CONFIG_CRYPTO_RMD320 is not set | ||
| 1095 | CONFIG_CRYPTO_SHA1=y | ||
| 1096 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1097 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1098 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1099 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1100 | |||
| 1101 | # | ||
| 1102 | # Ciphers | ||
| 1103 | # | ||
| 1104 | # CONFIG_CRYPTO_AES is not set | ||
| 1105 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1106 | # CONFIG_CRYPTO_ARC4 is not set | ||
| 1107 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1108 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1109 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1110 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1111 | # CONFIG_CRYPTO_DES is not set | ||
| 1112 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1113 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1114 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1115 | # CONFIG_CRYPTO_SEED is not set | ||
| 1116 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1117 | # CONFIG_CRYPTO_TEA is not set | ||
| 1118 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1119 | |||
| 1120 | # | ||
| 1121 | # Compression | ||
| 1122 | # | ||
| 1123 | # CONFIG_CRYPTO_DEFLATE is not set | ||
| 1124 | # CONFIG_CRYPTO_LZO is not set | ||
| 1125 | |||
| 1126 | # | ||
| 1127 | # Random Number Generation | ||
| 1128 | # | ||
| 1129 | # CONFIG_CRYPTO_PRNG is not set | ||
| 1130 | CONFIG_CRYPTO_HW=y | ||
| 1131 | |||
| 1132 | # | ||
| 1133 | # Library routines | ||
| 1134 | # | ||
| 1135 | CONFIG_BITREVERSE=y | ||
| 1136 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 1137 | # CONFIG_CRC_CCITT is not set | ||
| 1138 | # CONFIG_CRC16 is not set | ||
| 1139 | # CONFIG_CRC_T10DIF is not set | ||
| 1140 | # CONFIG_CRC_ITU_T is not set | ||
| 1141 | CONFIG_CRC32=y | ||
| 1142 | # CONFIG_CRC7 is not set | ||
| 1143 | # CONFIG_LIBCRC32C is not set | ||
| 1144 | CONFIG_ZLIB_INFLATE=y | ||
| 1145 | CONFIG_ZLIB_DEFLATE=y | ||
| 1146 | CONFIG_PLIST=y | ||
| 1147 | CONFIG_HAS_IOMEM=y | ||
| 1148 | CONFIG_HAS_IOPORT=y | ||
| 1149 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/mips/emma/Kconfig b/arch/mips/emma/Kconfig new file mode 100644 index 000000000000..9669c72123c9 --- /dev/null +++ b/arch/mips/emma/Kconfig | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | choice | ||
| 2 | prompt "Machine type" | ||
| 3 | depends on MACH_EMMA | ||
| 4 | default NEC_MARKEINS | ||
| 5 | |||
| 6 | config NEC_MARKEINS | ||
| 7 | bool "NEC EMMA2RH Mark-eins board" | ||
| 8 | select SOC_EMMA2RH | ||
| 9 | select HW_HAS_PCI | ||
| 10 | help | ||
| 11 | This enables support for the NEC Electronics Mark-eins boards. | ||
| 12 | |||
| 13 | endchoice | ||
| 14 | |||
| 15 | config SOC_EMMA2RH | ||
| 16 | bool | ||
| 17 | select SOC_EMMA | ||
| 18 | select SYS_HAS_CPU_R5500 | ||
| 19 | select SYS_SUPPORTS_32BIT_KERNEL | ||
| 20 | select SYS_SUPPORTS_64BIT_KERNEL | ||
| 21 | |||
| 22 | config SOC_EMMA | ||
| 23 | bool | ||
| 24 | select CEVT_R4K | ||
| 25 | select CSRC_R4K | ||
| 26 | select DMA_NONCOHERENT | ||
| 27 | select IRQ_CPU | ||
| 28 | select SWAP_IO_SPACE | ||
| 29 | select SYS_SUPPORTS_BIG_ENDIAN | ||
diff --git a/arch/mips/emma2rh/common/Makefile b/arch/mips/emma/common/Makefile index 859121b3867d..c392d28c1ef1 100644 --- a/arch/mips/emma2rh/common/Makefile +++ b/arch/mips/emma/common/Makefile | |||
| @@ -10,4 +10,4 @@ | |||
| 10 | # (at your option) any later version. | 10 | # (at your option) any later version. |
| 11 | # | 11 | # |
| 12 | 12 | ||
| 13 | obj-$(CONFIG_MARKEINS) += irq.o irq_emma2rh.o prom.o | 13 | obj-$(CONFIG_NEC_MARKEINS) += prom.o |
diff --git a/arch/mips/emma2rh/common/prom.c b/arch/mips/emma/common/prom.c index e14a2e3d8842..120f53fbdb45 100644 --- a/arch/mips/emma2rh/common/prom.c +++ b/arch/mips/emma/common/prom.c | |||
| @@ -29,11 +29,11 @@ | |||
| 29 | 29 | ||
| 30 | #include <asm/addrspace.h> | 30 | #include <asm/addrspace.h> |
| 31 | #include <asm/bootinfo.h> | 31 | #include <asm/bootinfo.h> |
| 32 | #include <asm/emma2rh/emma2rh.h> | 32 | #include <asm/emma/emma2rh.h> |
| 33 | 33 | ||
| 34 | const char *get_system_type(void) | 34 | const char *get_system_type(void) |
| 35 | { | 35 | { |
| 36 | #if defined(CONFIG_MARKEINS) | 36 | #ifdef CONFIG_NEC_MARKEINS |
| 37 | return "NEC EMMA2RH Mark-eins"; | 37 | return "NEC EMMA2RH Mark-eins"; |
| 38 | #else | 38 | #else |
| 39 | #error Unknown NEC board | 39 | #error Unknown NEC board |
| @@ -60,7 +60,7 @@ void __init prom_init(void) | |||
| 60 | strcat(arcs_cmdline, " "); | 60 | strcat(arcs_cmdline, " "); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | #if defined(CONFIG_MARKEINS) | 63 | #ifdef CONFIG_NEC_MARKEINS |
| 64 | add_memory_region(0, EMMA2RH_RAM_SIZE, BOOT_MEM_RAM); | 64 | add_memory_region(0, EMMA2RH_RAM_SIZE, BOOT_MEM_RAM); |
| 65 | #else | 65 | #else |
| 66 | #error Unknown NEC board | 66 | #error Unknown NEC board |
diff --git a/arch/mips/emma2rh/markeins/Makefile b/arch/mips/emma/markeins/Makefile index 14fc268b175c..16e0017ba919 100644 --- a/arch/mips/emma2rh/markeins/Makefile +++ b/arch/mips/emma/markeins/Makefile | |||
| @@ -10,4 +10,4 @@ | |||
| 10 | # (at your option) any later version. | 10 | # (at your option) any later version. |
| 11 | # | 11 | # |
| 12 | 12 | ||
| 13 | obj-$(CONFIG_MARKEINS) += irq.o irq_markeins.o setup.o led.o platform.o | 13 | obj-$(CONFIG_NEC_MARKEINS) += irq.o setup.o led.o platform.o |
diff --git a/arch/mips/emma/markeins/irq.c b/arch/mips/emma/markeins/irq.c new file mode 100644 index 000000000000..c2583ecc93cf --- /dev/null +++ b/arch/mips/emma/markeins/irq.c | |||
| @@ -0,0 +1,331 @@ | |||
| 1 | /* | ||
| 2 | * arch/mips/emma2rh/markeins/irq.c | ||
| 3 | * This file defines the irq handler for EMMA2RH. | ||
| 4 | * | ||
| 5 | * Copyright (C) NEC Electronics Corporation 2004-2006 | ||
| 6 | * | ||
| 7 | * This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c | ||
| 8 | * | ||
| 9 | * Copyright 2001 MontaVista Software Inc. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <linux/interrupt.h> | ||
| 27 | #include <linux/irq.h> | ||
| 28 | #include <linux/types.h> | ||
| 29 | #include <linux/ptrace.h> | ||
| 30 | #include <linux/delay.h> | ||
| 31 | |||
| 32 | #include <asm/irq_cpu.h> | ||
| 33 | #include <asm/system.h> | ||
| 34 | #include <asm/mipsregs.h> | ||
| 35 | #include <asm/addrspace.h> | ||
| 36 | #include <asm/bootinfo.h> | ||
| 37 | |||
| 38 | #include <asm/emma/emma2rh.h> | ||
| 39 | |||
| 40 | static void emma2rh_irq_enable(unsigned int irq) | ||
| 41 | { | ||
| 42 | u32 reg_value; | ||
| 43 | u32 reg_bitmask; | ||
| 44 | u32 reg_index; | ||
| 45 | |||
| 46 | irq -= EMMA2RH_IRQ_BASE; | ||
| 47 | |||
| 48 | reg_index = EMMA2RH_BHIF_INT_EN_0 + | ||
| 49 | (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) * (irq / 32); | ||
| 50 | reg_value = emma2rh_in32(reg_index); | ||
| 51 | reg_bitmask = 0x1 << (irq % 32); | ||
| 52 | emma2rh_out32(reg_index, reg_value | reg_bitmask); | ||
| 53 | } | ||
| 54 | |||
| 55 | static void emma2rh_irq_disable(unsigned int irq) | ||
| 56 | { | ||
| 57 | u32 reg_value; | ||
| 58 | u32 reg_bitmask; | ||
| 59 | u32 reg_index; | ||
| 60 | |||
| 61 | irq -= EMMA2RH_IRQ_BASE; | ||
| 62 | |||
| 63 | reg_index = EMMA2RH_BHIF_INT_EN_0 + | ||
| 64 | (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) * (irq / 32); | ||
| 65 | reg_value = emma2rh_in32(reg_index); | ||
| 66 | reg_bitmask = 0x1 << (irq % 32); | ||
| 67 | emma2rh_out32(reg_index, reg_value & ~reg_bitmask); | ||
| 68 | } | ||
| 69 | |||
| 70 | struct irq_chip emma2rh_irq_controller = { | ||
| 71 | .name = "emma2rh_irq", | ||
| 72 | .ack = emma2rh_irq_disable, | ||
| 73 | .mask = emma2rh_irq_disable, | ||
| 74 | .mask_ack = emma2rh_irq_disable, | ||
| 75 | .unmask = emma2rh_irq_enable, | ||
| 76 | }; | ||
| 77 | |||
| 78 | void emma2rh_irq_init(void) | ||
| 79 | { | ||
| 80 | u32 i; | ||
| 81 | |||
| 82 | for (i = 0; i < NUM_EMMA2RH_IRQ; i++) | ||
| 83 | set_irq_chip_and_handler(EMMA2RH_IRQ_BASE + i, | ||
| 84 | &emma2rh_irq_controller, | ||
| 85 | handle_level_irq); | ||
| 86 | } | ||
| 87 | |||
| 88 | static void emma2rh_sw_irq_enable(unsigned int irq) | ||
| 89 | { | ||
| 90 | u32 reg; | ||
| 91 | |||
| 92 | irq -= EMMA2RH_SW_IRQ_BASE; | ||
| 93 | |||
| 94 | reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); | ||
| 95 | reg |= 1 << irq; | ||
| 96 | emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg); | ||
| 97 | } | ||
| 98 | |||
| 99 | static void emma2rh_sw_irq_disable(unsigned int irq) | ||
| 100 | { | ||
| 101 | u32 reg; | ||
| 102 | |||
| 103 | irq -= EMMA2RH_SW_IRQ_BASE; | ||
| 104 | |||
| 105 | reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); | ||
| 106 | reg &= ~(1 << irq); | ||
| 107 | emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg); | ||
| 108 | } | ||
| 109 | |||
| 110 | struct irq_chip emma2rh_sw_irq_controller = { | ||
| 111 | .name = "emma2rh_sw_irq", | ||
| 112 | .ack = emma2rh_sw_irq_disable, | ||
| 113 | .mask = emma2rh_sw_irq_disable, | ||
| 114 | .mask_ack = emma2rh_sw_irq_disable, | ||
| 115 | .unmask = emma2rh_sw_irq_enable, | ||
| 116 | }; | ||
| 117 | |||
| 118 | void emma2rh_sw_irq_init(void) | ||
| 119 | { | ||
| 120 | u32 i; | ||
| 121 | |||
| 122 | for (i = 0; i < NUM_EMMA2RH_IRQ_SW; i++) | ||
| 123 | set_irq_chip_and_handler(EMMA2RH_SW_IRQ_BASE + i, | ||
| 124 | &emma2rh_sw_irq_controller, | ||
| 125 | handle_level_irq); | ||
| 126 | } | ||
| 127 | |||
| 128 | static void emma2rh_gpio_irq_enable(unsigned int irq) | ||
| 129 | { | ||
| 130 | u32 reg; | ||
| 131 | |||
| 132 | irq -= EMMA2RH_GPIO_IRQ_BASE; | ||
| 133 | |||
| 134 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 135 | reg |= 1 << irq; | ||
| 136 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
| 137 | } | ||
| 138 | |||
| 139 | static void emma2rh_gpio_irq_disable(unsigned int irq) | ||
| 140 | { | ||
| 141 | u32 reg; | ||
| 142 | |||
| 143 | irq -= EMMA2RH_GPIO_IRQ_BASE; | ||
| 144 | |||
| 145 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 146 | reg &= ~(1 << irq); | ||
| 147 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
| 148 | } | ||
| 149 | |||
| 150 | static void emma2rh_gpio_irq_ack(unsigned int irq) | ||
| 151 | { | ||
| 152 | u32 reg; | ||
| 153 | |||
| 154 | irq -= EMMA2RH_GPIO_IRQ_BASE; | ||
| 155 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq)); | ||
| 156 | |||
| 157 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 158 | reg &= ~(1 << irq); | ||
| 159 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
| 160 | } | ||
| 161 | |||
| 162 | static void emma2rh_gpio_irq_end(unsigned int irq) | ||
| 163 | { | ||
| 164 | u32 reg; | ||
| 165 | |||
| 166 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | ||
| 167 | |||
| 168 | irq -= EMMA2RH_GPIO_IRQ_BASE; | ||
| 169 | |||
| 170 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 171 | reg |= 1 << irq; | ||
| 172 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
| 173 | } | ||
| 174 | } | ||
| 175 | |||
| 176 | struct irq_chip emma2rh_gpio_irq_controller = { | ||
| 177 | .name = "emma2rh_gpio_irq", | ||
| 178 | .ack = emma2rh_gpio_irq_ack, | ||
| 179 | .mask = emma2rh_gpio_irq_disable, | ||
| 180 | .mask_ack = emma2rh_gpio_irq_ack, | ||
| 181 | .unmask = emma2rh_gpio_irq_enable, | ||
| 182 | .end = emma2rh_gpio_irq_end, | ||
| 183 | }; | ||
| 184 | |||
| 185 | void emma2rh_gpio_irq_init(void) | ||
| 186 | { | ||
| 187 | u32 i; | ||
| 188 | |||
| 189 | for (i = 0; i < NUM_EMMA2RH_IRQ_GPIO; i++) | ||
| 190 | set_irq_chip(EMMA2RH_GPIO_IRQ_BASE + i, | ||
| 191 | &emma2rh_gpio_irq_controller); | ||
| 192 | } | ||
| 193 | |||
| 194 | static struct irqaction irq_cascade = { | ||
| 195 | .handler = no_action, | ||
| 196 | .flags = 0, | ||
| 197 | .mask = CPU_MASK_NONE, | ||
| 198 | .name = "cascade", | ||
| 199 | .dev_id = NULL, | ||
| 200 | .next = NULL, | ||
| 201 | }; | ||
| 202 | |||
| 203 | /* | ||
| 204 | * the first level int-handler will jump here if it is a emma2rh irq | ||
| 205 | */ | ||
| 206 | void emma2rh_irq_dispatch(void) | ||
| 207 | { | ||
| 208 | u32 intStatus; | ||
| 209 | u32 bitmask; | ||
| 210 | u32 i; | ||
| 211 | |||
| 212 | intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_0) & | ||
| 213 | emma2rh_in32(EMMA2RH_BHIF_INT_EN_0); | ||
| 214 | |||
| 215 | #ifdef EMMA2RH_SW_CASCADE | ||
| 216 | if (intStatus & | ||
| 217 | (1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) { | ||
| 218 | u32 swIntStatus; | ||
| 219 | swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT) | ||
| 220 | & emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); | ||
| 221 | for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { | ||
| 222 | if (swIntStatus & bitmask) { | ||
| 223 | do_IRQ(EMMA2RH_SW_IRQ_BASE + i); | ||
| 224 | return; | ||
| 225 | } | ||
| 226 | } | ||
| 227 | } | ||
| 228 | #endif | ||
| 229 | |||
| 230 | for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { | ||
| 231 | if (intStatus & bitmask) { | ||
| 232 | do_IRQ(EMMA2RH_IRQ_BASE + i); | ||
| 233 | return; | ||
| 234 | } | ||
| 235 | } | ||
| 236 | |||
| 237 | intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_1) & | ||
| 238 | emma2rh_in32(EMMA2RH_BHIF_INT_EN_1); | ||
| 239 | |||
| 240 | #ifdef EMMA2RH_GPIO_CASCADE | ||
| 241 | if (intStatus & | ||
| 242 | (1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) { | ||
| 243 | u32 gpioIntStatus; | ||
| 244 | gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST) | ||
| 245 | & emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 246 | for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { | ||
| 247 | if (gpioIntStatus & bitmask) { | ||
| 248 | do_IRQ(EMMA2RH_GPIO_IRQ_BASE + i); | ||
| 249 | return; | ||
| 250 | } | ||
| 251 | } | ||
| 252 | } | ||
| 253 | #endif | ||
| 254 | |||
| 255 | for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) { | ||
| 256 | if (intStatus & bitmask) { | ||
| 257 | do_IRQ(EMMA2RH_IRQ_BASE + i); | ||
| 258 | return; | ||
| 259 | } | ||
| 260 | } | ||
| 261 | |||
| 262 | intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_2) & | ||
| 263 | emma2rh_in32(EMMA2RH_BHIF_INT_EN_2); | ||
| 264 | |||
| 265 | for (i = 64, bitmask = 1; i < 96; i++, bitmask <<= 1) { | ||
| 266 | if (intStatus & bitmask) { | ||
| 267 | do_IRQ(EMMA2RH_IRQ_BASE + i); | ||
| 268 | return; | ||
| 269 | } | ||
| 270 | } | ||
| 271 | } | ||
| 272 | |||
| 273 | void __init arch_init_irq(void) | ||
| 274 | { | ||
| 275 | u32 reg; | ||
| 276 | |||
| 277 | /* by default, interrupts are disabled. */ | ||
| 278 | emma2rh_out32(EMMA2RH_BHIF_INT_EN_0, 0); | ||
| 279 | emma2rh_out32(EMMA2RH_BHIF_INT_EN_1, 0); | ||
| 280 | emma2rh_out32(EMMA2RH_BHIF_INT_EN_2, 0); | ||
| 281 | emma2rh_out32(EMMA2RH_BHIF_INT1_EN_0, 0); | ||
| 282 | emma2rh_out32(EMMA2RH_BHIF_INT1_EN_1, 0); | ||
| 283 | emma2rh_out32(EMMA2RH_BHIF_INT1_EN_2, 0); | ||
| 284 | emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, 0); | ||
| 285 | |||
| 286 | clear_c0_status(0xff00); | ||
| 287 | set_c0_status(0x0400); | ||
| 288 | |||
| 289 | #define GPIO_PCI (0xf<<15) | ||
| 290 | /* setup GPIO interrupt for PCI interface */ | ||
| 291 | /* direction input */ | ||
| 292 | reg = emma2rh_in32(EMMA2RH_GPIO_DIR); | ||
| 293 | emma2rh_out32(EMMA2RH_GPIO_DIR, reg & ~GPIO_PCI); | ||
| 294 | /* disable interrupt */ | ||
| 295 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 296 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg & ~GPIO_PCI); | ||
| 297 | /* level triggerd */ | ||
| 298 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MODE); | ||
| 299 | emma2rh_out32(EMMA2RH_GPIO_INT_MODE, reg | GPIO_PCI); | ||
| 300 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_CND_A); | ||
| 301 | emma2rh_out32(EMMA2RH_GPIO_INT_CND_A, reg & (~GPIO_PCI)); | ||
| 302 | /* interrupt clear */ | ||
| 303 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~GPIO_PCI); | ||
| 304 | |||
| 305 | /* init all controllers */ | ||
| 306 | emma2rh_irq_init(); | ||
| 307 | emma2rh_sw_irq_init(); | ||
| 308 | emma2rh_gpio_irq_init(); | ||
| 309 | mips_cpu_irq_init(); | ||
| 310 | |||
| 311 | /* setup cascade interrupts */ | ||
| 312 | setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_SW_CASCADE, &irq_cascade); | ||
| 313 | setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_GPIO_CASCADE, &irq_cascade); | ||
| 314 | setup_irq(CPU_IRQ_BASE + CPU_EMMA2RH_CASCADE, &irq_cascade); | ||
| 315 | } | ||
| 316 | |||
| 317 | asmlinkage void plat_irq_dispatch(void) | ||
| 318 | { | ||
| 319 | unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; | ||
| 320 | |||
| 321 | if (pending & STATUSF_IP7) | ||
| 322 | do_IRQ(CPU_IRQ_BASE + 7); | ||
| 323 | else if (pending & STATUSF_IP2) | ||
| 324 | emma2rh_irq_dispatch(); | ||
| 325 | else if (pending & STATUSF_IP1) | ||
| 326 | do_IRQ(CPU_IRQ_BASE + 1); | ||
| 327 | else if (pending & STATUSF_IP0) | ||
| 328 | do_IRQ(CPU_IRQ_BASE + 0); | ||
| 329 | else | ||
| 330 | spurious_interrupt(); | ||
| 331 | } | ||
diff --git a/arch/mips/emma2rh/markeins/led.c b/arch/mips/emma/markeins/led.c index b65254c1bfe9..377a181b6561 100644 --- a/arch/mips/emma2rh/markeins/led.c +++ b/arch/mips/emma/markeins/led.c | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
| 22 | #include <linux/types.h> | 22 | #include <linux/types.h> |
| 23 | #include <linux/string.h> | 23 | #include <linux/string.h> |
| 24 | #include <asm/emma2rh/emma2rh.h> | 24 | #include <asm/emma/emma2rh.h> |
| 25 | 25 | ||
| 26 | const unsigned long clear = 0x20202020; | 26 | const unsigned long clear = 0x20202020; |
| 27 | 27 | ||
diff --git a/arch/mips/emma2rh/markeins/platform.c b/arch/mips/emma/markeins/platform.c index fb9cda253ab0..88e87f6b3442 100644 --- a/arch/mips/emma2rh/markeins/platform.c +++ b/arch/mips/emma/markeins/platform.c | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | #include <asm/reboot.h> | 36 | #include <asm/reboot.h> |
| 37 | #include <asm/traps.h> | 37 | #include <asm/traps.h> |
| 38 | 38 | ||
| 39 | #include <asm/emma2rh/emma2rh.h> | 39 | #include <asm/emma/emma2rh.h> |
| 40 | 40 | ||
| 41 | 41 | ||
| 42 | #define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */ | 42 | #define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */ |
diff --git a/arch/mips/emma2rh/markeins/setup.c b/arch/mips/emma/markeins/setup.c index b6a23ad539f8..67f456500084 100644 --- a/arch/mips/emma2rh/markeins/setup.c +++ b/arch/mips/emma/markeins/setup.c | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | #include <asm/time.h> | 29 | #include <asm/time.h> |
| 30 | #include <asm/reboot.h> | 30 | #include <asm/reboot.h> |
| 31 | 31 | ||
| 32 | #include <asm/emma2rh/emma2rh.h> | 32 | #include <asm/emma/emma2rh.h> |
| 33 | 33 | ||
| 34 | #define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */ | 34 | #define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */ |
| 35 | 35 | ||
diff --git a/arch/mips/emma2rh/common/irq.c b/arch/mips/emma2rh/common/irq.c deleted file mode 100644 index 91cbd959ab67..000000000000 --- a/arch/mips/emma2rh/common/irq.c +++ /dev/null | |||
| @@ -1,105 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/mips/emma2rh/common/irq.c | ||
| 3 | * This file is common irq dispatcher. | ||
| 4 | * | ||
| 5 | * Copyright (C) NEC Electronics Corporation 2005-2006 | ||
| 6 | * | ||
| 7 | * This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c | ||
| 8 | * | ||
| 9 | * Copyright 2001 MontaVista Software Inc. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <linux/interrupt.h> | ||
| 27 | #include <linux/irq.h> | ||
| 28 | #include <linux/types.h> | ||
| 29 | |||
| 30 | #include <asm/system.h> | ||
| 31 | #include <asm/mipsregs.h> | ||
| 32 | #include <asm/addrspace.h> | ||
| 33 | #include <asm/bootinfo.h> | ||
| 34 | |||
| 35 | #include <asm/emma2rh/emma2rh.h> | ||
| 36 | |||
| 37 | /* | ||
| 38 | * the first level int-handler will jump here if it is a emma2rh irq | ||
| 39 | */ | ||
| 40 | void emma2rh_irq_dispatch(void) | ||
| 41 | { | ||
| 42 | u32 intStatus; | ||
| 43 | u32 bitmask; | ||
| 44 | u32 i; | ||
| 45 | |||
| 46 | intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_0) | ||
| 47 | & emma2rh_in32(EMMA2RH_BHIF_INT_EN_0); | ||
| 48 | |||
| 49 | #ifdef EMMA2RH_SW_CASCADE | ||
| 50 | if (intStatus & | ||
| 51 | (1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) { | ||
| 52 | u32 swIntStatus; | ||
| 53 | swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT) | ||
| 54 | & emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); | ||
| 55 | for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { | ||
| 56 | if (swIntStatus & bitmask) { | ||
| 57 | do_IRQ(EMMA2RH_SW_IRQ_BASE + i); | ||
| 58 | return; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | } | ||
| 62 | #endif | ||
| 63 | |||
| 64 | for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { | ||
| 65 | if (intStatus & bitmask) { | ||
| 66 | do_IRQ(EMMA2RH_IRQ_BASE + i); | ||
| 67 | return; | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_1) | ||
| 72 | & emma2rh_in32(EMMA2RH_BHIF_INT_EN_1); | ||
| 73 | |||
| 74 | #ifdef EMMA2RH_GPIO_CASCADE | ||
| 75 | if (intStatus & | ||
| 76 | (1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) { | ||
| 77 | u32 gpioIntStatus; | ||
| 78 | gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST) | ||
| 79 | & emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 80 | for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) { | ||
| 81 | if (gpioIntStatus & bitmask) { | ||
| 82 | do_IRQ(EMMA2RH_GPIO_IRQ_BASE + i); | ||
| 83 | return; | ||
| 84 | } | ||
| 85 | } | ||
| 86 | } | ||
| 87 | #endif | ||
| 88 | |||
| 89 | for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) { | ||
| 90 | if (intStatus & bitmask) { | ||
| 91 | do_IRQ(EMMA2RH_IRQ_BASE + i); | ||
| 92 | return; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_2) | ||
| 97 | & emma2rh_in32(EMMA2RH_BHIF_INT_EN_2); | ||
| 98 | |||
| 99 | for (i = 64, bitmask = 1; i < 96; i++, bitmask <<= 1) { | ||
| 100 | if (intStatus & bitmask) { | ||
| 101 | do_IRQ(EMMA2RH_IRQ_BASE + i); | ||
| 102 | return; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | } | ||
diff --git a/arch/mips/emma2rh/common/irq_emma2rh.c b/arch/mips/emma2rh/common/irq_emma2rh.c deleted file mode 100644 index 96df37b77759..000000000000 --- a/arch/mips/emma2rh/common/irq_emma2rh.c +++ /dev/null | |||
| @@ -1,106 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/mips/emma2rh/common/irq_emma2rh.c | ||
| 3 | * This file defines the irq handler for EMMA2RH. | ||
| 4 | * | ||
| 5 | * Copyright (C) NEC Electronics Corporation 2005-2006 | ||
| 6 | * | ||
| 7 | * This file is based on the arch/mips/ddb5xxx/ddb5477/irq_5477.c | ||
| 8 | * | ||
| 9 | * Copyright 2001 MontaVista Software Inc. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | |||
| 26 | /* | ||
| 27 | * EMMA2RH defines 64 IRQs. | ||
| 28 | * | ||
| 29 | * This file exports one function: | ||
| 30 | * emma2rh_irq_init(u32 irq_base); | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include <linux/interrupt.h> | ||
| 34 | #include <linux/types.h> | ||
| 35 | #include <linux/ptrace.h> | ||
| 36 | |||
| 37 | #include <asm/debug.h> | ||
| 38 | |||
| 39 | #include <asm/emma2rh/emma2rh.h> | ||
| 40 | |||
| 41 | /* number of total irqs supported by EMMA2RH */ | ||
| 42 | #define NUM_EMMA2RH_IRQ 96 | ||
| 43 | |||
| 44 | static int emma2rh_irq_base = -1; | ||
| 45 | |||
| 46 | void ll_emma2rh_irq_enable(int); | ||
| 47 | void ll_emma2rh_irq_disable(int); | ||
| 48 | |||
| 49 | static void emma2rh_irq_enable(unsigned int irq) | ||
| 50 | { | ||
| 51 | ll_emma2rh_irq_enable(irq - emma2rh_irq_base); | ||
| 52 | } | ||
| 53 | |||
| 54 | static void emma2rh_irq_disable(unsigned int irq) | ||
| 55 | { | ||
| 56 | ll_emma2rh_irq_disable(irq - emma2rh_irq_base); | ||
| 57 | } | ||
| 58 | |||
| 59 | struct irq_chip emma2rh_irq_controller = { | ||
| 60 | .name = "emma2rh_irq", | ||
| 61 | .ack = emma2rh_irq_disable, | ||
| 62 | .mask = emma2rh_irq_disable, | ||
| 63 | .mask_ack = emma2rh_irq_disable, | ||
| 64 | .unmask = emma2rh_irq_enable, | ||
| 65 | }; | ||
| 66 | |||
| 67 | void emma2rh_irq_init(u32 irq_base) | ||
| 68 | { | ||
| 69 | u32 i; | ||
| 70 | |||
| 71 | for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ; i++) | ||
| 72 | set_irq_chip_and_handler(i, &emma2rh_irq_controller, | ||
| 73 | handle_level_irq); | ||
| 74 | |||
| 75 | emma2rh_irq_base = irq_base; | ||
| 76 | } | ||
| 77 | |||
| 78 | void ll_emma2rh_irq_enable(int emma2rh_irq) | ||
| 79 | { | ||
| 80 | u32 reg_value; | ||
| 81 | u32 reg_bitmask; | ||
| 82 | u32 reg_index; | ||
| 83 | |||
| 84 | reg_index = EMMA2RH_BHIF_INT_EN_0 | ||
| 85 | + (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) | ||
| 86 | * (emma2rh_irq / 32); | ||
| 87 | reg_value = emma2rh_in32(reg_index); | ||
| 88 | reg_bitmask = 0x1 << (emma2rh_irq % 32); | ||
| 89 | db_assert((reg_value & reg_bitmask) == 0); | ||
| 90 | emma2rh_out32(reg_index, reg_value | reg_bitmask); | ||
| 91 | } | ||
| 92 | |||
| 93 | void ll_emma2rh_irq_disable(int emma2rh_irq) | ||
| 94 | { | ||
| 95 | u32 reg_value; | ||
| 96 | u32 reg_bitmask; | ||
| 97 | u32 reg_index; | ||
| 98 | |||
| 99 | reg_index = EMMA2RH_BHIF_INT_EN_0 | ||
| 100 | + (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) | ||
| 101 | * (emma2rh_irq / 32); | ||
| 102 | reg_value = emma2rh_in32(reg_index); | ||
| 103 | reg_bitmask = 0x1 << (emma2rh_irq % 32); | ||
| 104 | db_assert((reg_value & reg_bitmask) != 0); | ||
| 105 | emma2rh_out32(reg_index, reg_value & ~reg_bitmask); | ||
| 106 | } | ||
diff --git a/arch/mips/emma2rh/markeins/irq.c b/arch/mips/emma2rh/markeins/irq.c deleted file mode 100644 index 6bcf6a06367a..000000000000 --- a/arch/mips/emma2rh/markeins/irq.c +++ /dev/null | |||
| @@ -1,132 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/mips/emma2rh/markeins/irq.c | ||
| 3 | * This file defines the irq handler for EMMA2RH. | ||
| 4 | * | ||
| 5 | * Copyright (C) NEC Electronics Corporation 2004-2006 | ||
| 6 | * | ||
| 7 | * This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c | ||
| 8 | * | ||
| 9 | * Copyright 2001 MontaVista Software Inc. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <linux/interrupt.h> | ||
| 27 | #include <linux/irq.h> | ||
| 28 | #include <linux/types.h> | ||
| 29 | #include <linux/ptrace.h> | ||
| 30 | #include <linux/delay.h> | ||
| 31 | |||
| 32 | #include <asm/irq_cpu.h> | ||
| 33 | #include <asm/system.h> | ||
| 34 | #include <asm/mipsregs.h> | ||
| 35 | #include <asm/debug.h> | ||
| 36 | #include <asm/addrspace.h> | ||
| 37 | #include <asm/bootinfo.h> | ||
| 38 | |||
| 39 | #include <asm/emma2rh/emma2rh.h> | ||
| 40 | |||
| 41 | /* | ||
| 42 | * IRQ mapping | ||
| 43 | * | ||
| 44 | * 0-7: 8 CPU interrupts | ||
| 45 | * 0 - software interrupt 0 | ||
| 46 | * 1 - software interrupt 1 | ||
| 47 | * 2 - most Vrc5477 interrupts are routed to this pin | ||
| 48 | * 3 - (optional) some other interrupts routed to this pin for debugg | ||
| 49 | * 4 - not used | ||
| 50 | * 5 - not used | ||
| 51 | * 6 - not used | ||
| 52 | * 7 - cpu timer (used by default) | ||
| 53 | * | ||
| 54 | */ | ||
| 55 | |||
| 56 | extern void emma2rh_sw_irq_init(u32 base); | ||
| 57 | extern void emma2rh_gpio_irq_init(u32 base); | ||
| 58 | extern void emma2rh_irq_init(u32 base); | ||
| 59 | extern void emma2rh_irq_dispatch(void); | ||
| 60 | |||
| 61 | static struct irqaction irq_cascade = { | ||
| 62 | .handler = no_action, | ||
| 63 | .flags = 0, | ||
| 64 | .mask = CPU_MASK_NONE, | ||
| 65 | .name = "cascade", | ||
| 66 | .dev_id = NULL, | ||
| 67 | .next = NULL, | ||
| 68 | }; | ||
| 69 | |||
| 70 | void __init arch_init_irq(void) | ||
| 71 | { | ||
| 72 | u32 reg; | ||
| 73 | |||
| 74 | db_run(printk("markeins_irq_setup invoked.\n")); | ||
| 75 | |||
| 76 | /* by default, interrupts are disabled. */ | ||
| 77 | emma2rh_out32(EMMA2RH_BHIF_INT_EN_0, 0); | ||
| 78 | emma2rh_out32(EMMA2RH_BHIF_INT_EN_1, 0); | ||
| 79 | emma2rh_out32(EMMA2RH_BHIF_INT_EN_2, 0); | ||
| 80 | emma2rh_out32(EMMA2RH_BHIF_INT1_EN_0, 0); | ||
| 81 | emma2rh_out32(EMMA2RH_BHIF_INT1_EN_1, 0); | ||
| 82 | emma2rh_out32(EMMA2RH_BHIF_INT1_EN_2, 0); | ||
| 83 | emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, 0); | ||
| 84 | |||
| 85 | clear_c0_status(0xff00); | ||
| 86 | set_c0_status(0x0400); | ||
| 87 | |||
| 88 | #define GPIO_PCI (0xf<<15) | ||
| 89 | /* setup GPIO interrupt for PCI interface */ | ||
| 90 | /* direction input */ | ||
| 91 | reg = emma2rh_in32(EMMA2RH_GPIO_DIR); | ||
| 92 | emma2rh_out32(EMMA2RH_GPIO_DIR, reg & ~GPIO_PCI); | ||
| 93 | /* disable interrupt */ | ||
| 94 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 95 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg & ~GPIO_PCI); | ||
| 96 | /* level triggerd */ | ||
| 97 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MODE); | ||
| 98 | emma2rh_out32(EMMA2RH_GPIO_INT_MODE, reg | GPIO_PCI); | ||
| 99 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_CND_A); | ||
| 100 | emma2rh_out32(EMMA2RH_GPIO_INT_CND_A, reg & (~GPIO_PCI)); | ||
| 101 | /* interrupt clear */ | ||
| 102 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~GPIO_PCI); | ||
| 103 | |||
| 104 | /* init all controllers */ | ||
| 105 | emma2rh_irq_init(EMMA2RH_IRQ_BASE); | ||
| 106 | emma2rh_sw_irq_init(EMMA2RH_SW_IRQ_BASE); | ||
| 107 | emma2rh_gpio_irq_init(EMMA2RH_GPIO_IRQ_BASE); | ||
| 108 | mips_cpu_irq_init(); | ||
| 109 | |||
| 110 | /* setup cascade interrupts */ | ||
| 111 | setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_SW_CASCADE, &irq_cascade); | ||
| 112 | setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_GPIO_CASCADE, &irq_cascade); | ||
| 113 | setup_irq(CPU_IRQ_BASE + CPU_EMMA2RH_CASCADE, &irq_cascade); | ||
| 114 | } | ||
| 115 | |||
| 116 | asmlinkage void plat_irq_dispatch(void) | ||
| 117 | { | ||
| 118 | unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; | ||
| 119 | |||
| 120 | if (pending & STATUSF_IP7) | ||
| 121 | do_IRQ(CPU_IRQ_BASE + 7); | ||
| 122 | else if (pending & STATUSF_IP2) | ||
| 123 | emma2rh_irq_dispatch(); | ||
| 124 | else if (pending & STATUSF_IP1) | ||
| 125 | do_IRQ(CPU_IRQ_BASE + 1); | ||
| 126 | else if (pending & STATUSF_IP0) | ||
| 127 | do_IRQ(CPU_IRQ_BASE + 0); | ||
| 128 | else | ||
| 129 | spurious_interrupt(); | ||
| 130 | } | ||
| 131 | |||
| 132 | |||
diff --git a/arch/mips/emma2rh/markeins/irq_markeins.c b/arch/mips/emma2rh/markeins/irq_markeins.c deleted file mode 100644 index fba5c156f472..000000000000 --- a/arch/mips/emma2rh/markeins/irq_markeins.c +++ /dev/null | |||
| @@ -1,158 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/mips/emma2rh/markeins/irq_markeins.c | ||
| 3 | * This file defines the irq handler for Mark-eins. | ||
| 4 | * | ||
| 5 | * Copyright (C) NEC Electronics Corporation 2004-2006 | ||
| 6 | * | ||
| 7 | * This file is based on the arch/mips/ddb5xxx/ddb5477/irq_5477.c | ||
| 8 | * | ||
| 9 | * Copyright 2001 MontaVista Software Inc. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | #include <linux/interrupt.h> | ||
| 26 | #include <linux/irq.h> | ||
| 27 | #include <linux/types.h> | ||
| 28 | #include <linux/ptrace.h> | ||
| 29 | |||
| 30 | #include <asm/debug.h> | ||
| 31 | #include <asm/emma2rh/emma2rh.h> | ||
| 32 | |||
| 33 | static int emma2rh_sw_irq_base = -1; | ||
| 34 | static int emma2rh_gpio_irq_base = -1; | ||
| 35 | |||
| 36 | void ll_emma2rh_sw_irq_enable(int reg); | ||
| 37 | void ll_emma2rh_sw_irq_disable(int reg); | ||
| 38 | void ll_emma2rh_gpio_irq_enable(int reg); | ||
| 39 | void ll_emma2rh_gpio_irq_disable(int reg); | ||
| 40 | |||
| 41 | static void emma2rh_sw_irq_enable(unsigned int irq) | ||
| 42 | { | ||
| 43 | ll_emma2rh_sw_irq_enable(irq - emma2rh_sw_irq_base); | ||
| 44 | } | ||
| 45 | |||
| 46 | static void emma2rh_sw_irq_disable(unsigned int irq) | ||
| 47 | { | ||
| 48 | ll_emma2rh_sw_irq_disable(irq - emma2rh_sw_irq_base); | ||
| 49 | } | ||
| 50 | |||
| 51 | struct irq_chip emma2rh_sw_irq_controller = { | ||
| 52 | .name = "emma2rh_sw_irq", | ||
| 53 | .ack = emma2rh_sw_irq_disable, | ||
| 54 | .mask = emma2rh_sw_irq_disable, | ||
| 55 | .mask_ack = emma2rh_sw_irq_disable, | ||
| 56 | .unmask = emma2rh_sw_irq_enable, | ||
| 57 | }; | ||
| 58 | |||
| 59 | void emma2rh_sw_irq_init(u32 irq_base) | ||
| 60 | { | ||
| 61 | u32 i; | ||
| 62 | |||
| 63 | for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_SW; i++) | ||
| 64 | set_irq_chip_and_handler(i, &emma2rh_sw_irq_controller, | ||
| 65 | handle_level_irq); | ||
| 66 | |||
| 67 | emma2rh_sw_irq_base = irq_base; | ||
| 68 | } | ||
| 69 | |||
| 70 | void ll_emma2rh_sw_irq_enable(int irq) | ||
| 71 | { | ||
| 72 | u32 reg; | ||
| 73 | |||
| 74 | db_assert(irq >= 0); | ||
| 75 | db_assert(irq < NUM_EMMA2RH_IRQ_SW); | ||
| 76 | |||
| 77 | reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); | ||
| 78 | reg |= 1 << irq; | ||
| 79 | emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg); | ||
| 80 | } | ||
| 81 | |||
| 82 | void ll_emma2rh_sw_irq_disable(int irq) | ||
| 83 | { | ||
| 84 | u32 reg; | ||
| 85 | |||
| 86 | db_assert(irq >= 0); | ||
| 87 | db_assert(irq < 32); | ||
| 88 | |||
| 89 | reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN); | ||
| 90 | reg &= ~(1 << irq); | ||
| 91 | emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg); | ||
| 92 | } | ||
| 93 | |||
| 94 | static void emma2rh_gpio_irq_enable(unsigned int irq) | ||
| 95 | { | ||
| 96 | ll_emma2rh_gpio_irq_enable(irq - emma2rh_gpio_irq_base); | ||
| 97 | } | ||
| 98 | |||
| 99 | static void emma2rh_gpio_irq_disable(unsigned int irq) | ||
| 100 | { | ||
| 101 | ll_emma2rh_gpio_irq_disable(irq - emma2rh_gpio_irq_base); | ||
| 102 | } | ||
| 103 | |||
| 104 | static void emma2rh_gpio_irq_ack(unsigned int irq) | ||
| 105 | { | ||
| 106 | irq -= emma2rh_gpio_irq_base; | ||
| 107 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq)); | ||
| 108 | ll_emma2rh_gpio_irq_disable(irq); | ||
| 109 | } | ||
| 110 | |||
| 111 | static void emma2rh_gpio_irq_end(unsigned int irq) | ||
| 112 | { | ||
| 113 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
| 114 | ll_emma2rh_gpio_irq_enable(irq - emma2rh_gpio_irq_base); | ||
| 115 | } | ||
| 116 | |||
| 117 | struct irq_chip emma2rh_gpio_irq_controller = { | ||
| 118 | .name = "emma2rh_gpio_irq", | ||
| 119 | .ack = emma2rh_gpio_irq_ack, | ||
| 120 | .mask = emma2rh_gpio_irq_disable, | ||
| 121 | .mask_ack = emma2rh_gpio_irq_ack, | ||
| 122 | .unmask = emma2rh_gpio_irq_enable, | ||
| 123 | .end = emma2rh_gpio_irq_end, | ||
| 124 | }; | ||
| 125 | |||
| 126 | void emma2rh_gpio_irq_init(u32 irq_base) | ||
| 127 | { | ||
| 128 | u32 i; | ||
| 129 | |||
| 130 | for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_GPIO; i++) | ||
| 131 | set_irq_chip(i, &emma2rh_gpio_irq_controller); | ||
| 132 | |||
| 133 | emma2rh_gpio_irq_base = irq_base; | ||
| 134 | } | ||
| 135 | |||
| 136 | void ll_emma2rh_gpio_irq_enable(int irq) | ||
| 137 | { | ||
| 138 | u32 reg; | ||
| 139 | |||
| 140 | db_assert(irq >= 0); | ||
| 141 | db_assert(irq < NUM_EMMA2RH_IRQ_GPIO); | ||
| 142 | |||
| 143 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 144 | reg |= 1 << irq; | ||
| 145 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
| 146 | } | ||
| 147 | |||
| 148 | void ll_emma2rh_gpio_irq_disable(int irq) | ||
| 149 | { | ||
| 150 | u32 reg; | ||
| 151 | |||
| 152 | db_assert(irq >= 0); | ||
| 153 | db_assert(irq < NUM_EMMA2RH_IRQ_GPIO); | ||
| 154 | |||
| 155 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
| 156 | reg &= ~(1 << irq); | ||
| 157 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
| 158 | } | ||
diff --git a/arch/mips/include/asm/emma2rh/emma2rh.h b/arch/mips/include/asm/emma/emma2rh.h index 6a1af0af51e3..30aea91de626 100644 --- a/arch/mips/include/asm/emma2rh/emma2rh.h +++ b/arch/mips/include/asm/emma/emma2rh.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * include/asm-mips/emma2rh/emma2rh.h | 2 | * arch/mips/include/asm/emma/emma2rh.h |
| 3 | * This file is EMMA2RH common header. | 3 | * This file is EMMA2RH common header. |
| 4 | * | 4 | * |
| 5 | * Copyright (C) NEC Electronics Corporation 2005-2006 | 5 | * Copyright (C) NEC Electronics Corporation 2005-2006 |
| @@ -21,8 +21,8 @@ | |||
| 21 | * along with this program; if not, write to the Free Software | 21 | * along with this program; if not, write to the Free Software |
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 23 | */ | 23 | */ |
| 24 | #ifndef __ASM_EMMA2RH_EMMA2RH_H | 24 | #ifndef __ASM_EMMA_EMMA2RH_H |
| 25 | #define __ASM_EMMA2RH_EMMA2RH_H | 25 | #define __ASM_EMMA_EMMA2RH_H |
| 26 | 26 | ||
| 27 | #include <irq.h> | 27 | #include <irq.h> |
| 28 | 28 | ||
| @@ -206,7 +206,6 @@ static inline void emma2rh_out32(u32 offset, u32 val) | |||
| 206 | static inline u32 emma2rh_in32(u32 offset) | 206 | static inline u32 emma2rh_in32(u32 offset) |
| 207 | { | 207 | { |
| 208 | u32 val = *(volatile u32 *)(EMMA2RH_BASE | offset); | 208 | u32 val = *(volatile u32 *)(EMMA2RH_BASE | offset); |
| 209 | emma2rh_sync(); | ||
| 210 | return val; | 209 | return val; |
| 211 | } | 210 | } |
| 212 | 211 | ||
| @@ -219,7 +218,6 @@ static inline void emma2rh_out16(u32 offset, u16 val) | |||
| 219 | static inline u16 emma2rh_in16(u32 offset) | 218 | static inline u16 emma2rh_in16(u32 offset) |
| 220 | { | 219 | { |
| 221 | u16 val = *(volatile u16 *)(EMMA2RH_BASE | offset); | 220 | u16 val = *(volatile u16 *)(EMMA2RH_BASE | offset); |
| 222 | emma2rh_sync(); | ||
| 223 | return val; | 221 | return val; |
| 224 | } | 222 | } |
| 225 | 223 | ||
| @@ -232,7 +230,6 @@ static inline void emma2rh_out8(u32 offset, u8 val) | |||
| 232 | static inline u8 emma2rh_in8(u32 offset) | 230 | static inline u8 emma2rh_in8(u32 offset) |
| 233 | { | 231 | { |
| 234 | u8 val = *(volatile u8 *)(EMMA2RH_BASE | offset); | 232 | u8 val = *(volatile u8 *)(EMMA2RH_BASE | offset); |
| 235 | emma2rh_sync(); | ||
| 236 | return val; | 233 | return val; |
| 237 | } | 234 | } |
| 238 | 235 | ||
| @@ -324,10 +321,10 @@ static inline u8 emma2rh_in8(u32 offset) | |||
| 324 | /* | 321 | /* |
| 325 | * include the board dependent part | 322 | * include the board dependent part |
| 326 | */ | 323 | */ |
| 327 | #if defined(CONFIG_MARKEINS) | 324 | #ifdef CONFIG_NEC_MARKEINS |
| 328 | #include <asm/emma2rh/markeins.h> | 325 | #include <asm/emma/markeins.h> |
| 329 | #else | 326 | #else |
| 330 | #error "Unknown EMMA2RH board!" | 327 | #error "Unknown EMMA2RH board!" |
| 331 | #endif | 328 | #endif |
| 332 | 329 | ||
| 333 | #endif /* __ASM_EMMA2RH_EMMA2RH_H */ | 330 | #endif /* __ASM_EMMA_EMMA2RH_H */ |
diff --git a/arch/mips/include/asm/emma2rh/markeins.h b/arch/mips/include/asm/emma/markeins.h index 973b0628490d..973b0628490d 100644 --- a/arch/mips/include/asm/emma2rh/markeins.h +++ b/arch/mips/include/asm/emma/markeins.h | |||
diff --git a/arch/mips/include/asm/mach-lemote/pci.h b/arch/mips/include/asm/mach-lemote/pci.h new file mode 100644 index 000000000000..ea6aa143b78e --- /dev/null +++ b/arch/mips/include/asm/mach-lemote/pci.h | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2008 Zhang Le <r0bertz@gentoo.org> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it | ||
| 5 | * and/or modify it under the terms of the GNU General | ||
| 6 | * Public License as published by the Free Software | ||
| 7 | * Foundation; either version 2 of the License, or (at your | ||
| 8 | * option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be | ||
| 11 | * useful, but WITHOUT ANY WARRANTY; without even the implied | ||
| 12 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||
| 13 | * PURPOSE. See the GNU General Public License for more | ||
| 14 | * details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public | ||
| 17 | * License along with this program; if not, write to the Free | ||
| 18 | * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA | ||
| 19 | * 02139, USA. | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifndef _LEMOTE_PCI_H_ | ||
| 23 | #define _LEMOTE_PCI_H_ | ||
| 24 | |||
| 25 | #define LOONGSON2E_PCI_MEM_START 0x14000000UL | ||
| 26 | #define LOONGSON2E_PCI_MEM_END 0x1fffffffUL | ||
| 27 | #define LOONGSON2E_PCI_IO_START 0x00004000UL | ||
| 28 | #define LOONGSON2E_IO_PORT_BASE 0x1fd00000UL | ||
| 29 | |||
| 30 | #endif /* !_LEMOTE_PCI_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-pnx833x/gpio.h b/arch/mips/include/asm/mach-pnx833x/gpio.h new file mode 100644 index 000000000000..8de0eb9c98a3 --- /dev/null +++ b/arch/mips/include/asm/mach-pnx833x/gpio.h | |||
| @@ -0,0 +1,172 @@ | |||
| 1 | /* | ||
| 2 | * gpio.h: GPIO Support for PNX833X. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.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 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | #ifndef __ASM_MIPS_MACH_PNX833X_GPIO_H | ||
| 23 | #define __ASM_MIPS_MACH_PNX833X_GPIO_H | ||
| 24 | |||
| 25 | /* BIG FAT WARNING: races danger! | ||
| 26 | No protections exist here. Current users are only early init code, | ||
| 27 | when locking is not needed because no cuncurency yet exists there, | ||
| 28 | and GPIO IRQ dispatcher, which does locking. | ||
| 29 | However, if many uses will ever happen, proper locking will be needed | ||
| 30 | - including locking between different uses | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include "pnx833x.h" | ||
| 34 | |||
| 35 | #define SET_REG_BIT(reg, bit) do { (reg |= (1 << (bit))); } while (0) | ||
| 36 | #define CLEAR_REG_BIT(reg, bit) do { (reg &= ~(1 << (bit))); } while (0) | ||
| 37 | |||
| 38 | /* Initialize GPIO to a known state */ | ||
| 39 | static inline void pnx833x_gpio_init(void) | ||
| 40 | { | ||
| 41 | PNX833X_PIO_DIR = 0; | ||
| 42 | PNX833X_PIO_DIR2 = 0; | ||
| 43 | PNX833X_PIO_SEL = 0; | ||
| 44 | PNX833X_PIO_SEL2 = 0; | ||
| 45 | PNX833X_PIO_INT_EDGE = 0; | ||
| 46 | PNX833X_PIO_INT_HI = 0; | ||
| 47 | PNX833X_PIO_INT_LO = 0; | ||
| 48 | |||
| 49 | /* clear any GPIO interrupt requests */ | ||
| 50 | PNX833X_PIO_INT_CLEAR = 0xffff; | ||
| 51 | PNX833X_PIO_INT_CLEAR = 0; | ||
| 52 | PNX833X_PIO_INT_ENABLE = 0; | ||
| 53 | } | ||
| 54 | |||
| 55 | /* Select GPIO direction for a pin */ | ||
| 56 | static inline void pnx833x_gpio_select_input(unsigned int pin) | ||
| 57 | { | ||
| 58 | if (pin < 32) | ||
| 59 | CLEAR_REG_BIT(PNX833X_PIO_DIR, pin); | ||
| 60 | else | ||
| 61 | CLEAR_REG_BIT(PNX833X_PIO_DIR2, pin & 31); | ||
| 62 | } | ||
| 63 | static inline void pnx833x_gpio_select_output(unsigned int pin) | ||
| 64 | { | ||
| 65 | if (pin < 32) | ||
| 66 | SET_REG_BIT(PNX833X_PIO_DIR, pin); | ||
| 67 | else | ||
| 68 | SET_REG_BIT(PNX833X_PIO_DIR2, pin & 31); | ||
| 69 | } | ||
| 70 | |||
| 71 | /* Select GPIO or alternate function for a pin */ | ||
| 72 | static inline void pnx833x_gpio_select_function_io(unsigned int pin) | ||
| 73 | { | ||
| 74 | if (pin < 32) | ||
| 75 | CLEAR_REG_BIT(PNX833X_PIO_SEL, pin); | ||
| 76 | else | ||
| 77 | CLEAR_REG_BIT(PNX833X_PIO_SEL2, pin & 31); | ||
| 78 | } | ||
| 79 | static inline void pnx833x_gpio_select_function_alt(unsigned int pin) | ||
| 80 | { | ||
| 81 | if (pin < 32) | ||
| 82 | SET_REG_BIT(PNX833X_PIO_SEL, pin); | ||
| 83 | else | ||
| 84 | SET_REG_BIT(PNX833X_PIO_SEL2, pin & 31); | ||
| 85 | } | ||
| 86 | |||
| 87 | /* Read GPIO pin */ | ||
| 88 | static inline int pnx833x_gpio_read(unsigned int pin) | ||
| 89 | { | ||
| 90 | if (pin < 32) | ||
| 91 | return (PNX833X_PIO_IN >> pin) & 1; | ||
| 92 | else | ||
| 93 | return (PNX833X_PIO_IN2 >> (pin & 31)) & 1; | ||
| 94 | } | ||
| 95 | |||
| 96 | /* Write GPIO pin */ | ||
| 97 | static inline void pnx833x_gpio_write(unsigned int val, unsigned int pin) | ||
| 98 | { | ||
| 99 | if (pin < 32) { | ||
| 100 | if (val) | ||
| 101 | SET_REG_BIT(PNX833X_PIO_OUT, pin); | ||
| 102 | else | ||
| 103 | CLEAR_REG_BIT(PNX833X_PIO_OUT, pin); | ||
| 104 | } else { | ||
| 105 | if (val) | ||
| 106 | SET_REG_BIT(PNX833X_PIO_OUT2, pin & 31); | ||
| 107 | else | ||
| 108 | CLEAR_REG_BIT(PNX833X_PIO_OUT2, pin & 31); | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | /* Configure GPIO interrupt */ | ||
| 113 | #define GPIO_INT_NONE 0 | ||
| 114 | #define GPIO_INT_LEVEL_LOW 1 | ||
| 115 | #define GPIO_INT_LEVEL_HIGH 2 | ||
| 116 | #define GPIO_INT_EDGE_RISING 3 | ||
| 117 | #define GPIO_INT_EDGE_FALLING 4 | ||
| 118 | #define GPIO_INT_EDGE_BOTH 5 | ||
| 119 | static inline void pnx833x_gpio_setup_irq(int when, unsigned int pin) | ||
| 120 | { | ||
| 121 | switch (when) { | ||
| 122 | case GPIO_INT_LEVEL_LOW: | ||
| 123 | CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin); | ||
| 124 | CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin); | ||
| 125 | SET_REG_BIT(PNX833X_PIO_INT_LO, pin); | ||
| 126 | break; | ||
| 127 | case GPIO_INT_LEVEL_HIGH: | ||
| 128 | CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin); | ||
| 129 | SET_REG_BIT(PNX833X_PIO_INT_HI, pin); | ||
| 130 | CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin); | ||
| 131 | break; | ||
| 132 | case GPIO_INT_EDGE_RISING: | ||
| 133 | SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin); | ||
| 134 | SET_REG_BIT(PNX833X_PIO_INT_HI, pin); | ||
| 135 | CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin); | ||
| 136 | break; | ||
| 137 | case GPIO_INT_EDGE_FALLING: | ||
| 138 | SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin); | ||
| 139 | CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin); | ||
| 140 | SET_REG_BIT(PNX833X_PIO_INT_LO, pin); | ||
| 141 | break; | ||
| 142 | case GPIO_INT_EDGE_BOTH: | ||
| 143 | SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin); | ||
| 144 | SET_REG_BIT(PNX833X_PIO_INT_HI, pin); | ||
| 145 | SET_REG_BIT(PNX833X_PIO_INT_LO, pin); | ||
| 146 | break; | ||
| 147 | default: | ||
| 148 | CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin); | ||
| 149 | CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin); | ||
| 150 | CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin); | ||
| 151 | break; | ||
| 152 | } | ||
| 153 | } | ||
| 154 | |||
| 155 | /* Enable/disable GPIO interrupt */ | ||
| 156 | static inline void pnx833x_gpio_enable_irq(unsigned int pin) | ||
| 157 | { | ||
| 158 | SET_REG_BIT(PNX833X_PIO_INT_ENABLE, pin); | ||
| 159 | } | ||
| 160 | static inline void pnx833x_gpio_disable_irq(unsigned int pin) | ||
| 161 | { | ||
| 162 | CLEAR_REG_BIT(PNX833X_PIO_INT_ENABLE, pin); | ||
| 163 | } | ||
| 164 | |||
| 165 | /* Clear GPIO interrupt request */ | ||
| 166 | static inline void pnx833x_gpio_clear_irq(unsigned int pin) | ||
| 167 | { | ||
| 168 | SET_REG_BIT(PNX833X_PIO_INT_CLEAR, pin); | ||
| 169 | CLEAR_REG_BIT(PNX833X_PIO_INT_CLEAR, pin); | ||
| 170 | } | ||
| 171 | |||
| 172 | #endif | ||
diff --git a/arch/mips/include/asm/mach-pnx833x/irq-mapping.h b/arch/mips/include/asm/mach-pnx833x/irq-mapping.h new file mode 100644 index 000000000000..657f089b1724 --- /dev/null +++ b/arch/mips/include/asm/mach-pnx833x/irq-mapping.h | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | |||
| 2 | /* | ||
| 3 | * irq.h: IRQ mappings for PNX833X. | ||
| 4 | * | ||
| 5 | * Copyright 2008 NXP Semiconductors | ||
| 6 | * Chris Steel <chris.steel@nxp.com> | ||
| 7 | * Daniel Laird <daniel.j.laird@nxp.com> | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | */ | ||
| 23 | |||
| 24 | #ifndef __ASM_MIPS_MACH_PNX833X_IRQ_MAPPING_H | ||
| 25 | #define __ASM_MIPS_MACH_PNX833X_IRQ_MAPPING_H | ||
| 26 | /* | ||
| 27 | * The "IRQ numbers" are completely virtual. | ||
| 28 | * | ||
| 29 | * In PNX8330/1, we have 48 interrupt lines, numbered from 1 to 48. | ||
| 30 | * Let's use numbers 1..48 for PIC interrupts, number 0 for timer interrupt, | ||
| 31 | * numbers 49..64 for (virtual) GPIO interrupts. | ||
| 32 | * | ||
| 33 | * In PNX8335, we have 57 interrupt lines, numbered from 1 to 57, | ||
| 34 | * connected to PIC, which uses core hardware interrupt 2, and also | ||
| 35 | * a timer interrupt through hardware interrupt 5. | ||
| 36 | * Let's use numbers 1..64 for PIC interrupts, number 0 for timer interrupt, | ||
| 37 | * numbers 65..80 for (virtual) GPIO interrupts. | ||
| 38 | * | ||
| 39 | */ | ||
| 40 | #include <irq.h> | ||
| 41 | |||
| 42 | #define PNX833X_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7) | ||
| 43 | |||
| 44 | /* Interrupts supported by PIC */ | ||
| 45 | #define PNX833X_PIC_I2C0_INT (PNX833X_PIC_IRQ_BASE + 1) | ||
| 46 | #define PNX833X_PIC_I2C1_INT (PNX833X_PIC_IRQ_BASE + 2) | ||
| 47 | #define PNX833X_PIC_UART0_INT (PNX833X_PIC_IRQ_BASE + 3) | ||
| 48 | #define PNX833X_PIC_UART1_INT (PNX833X_PIC_IRQ_BASE + 4) | ||
| 49 | #define PNX833X_PIC_TS_IN0_DV_INT (PNX833X_PIC_IRQ_BASE + 5) | ||
| 50 | #define PNX833X_PIC_TS_IN0_DMA_INT (PNX833X_PIC_IRQ_BASE + 6) | ||
| 51 | #define PNX833X_PIC_GPIO_INT (PNX833X_PIC_IRQ_BASE + 7) | ||
| 52 | #define PNX833X_PIC_AUDIO_DEC_INT (PNX833X_PIC_IRQ_BASE + 8) | ||
| 53 | #define PNX833X_PIC_VIDEO_DEC_INT (PNX833X_PIC_IRQ_BASE + 9) | ||
| 54 | #define PNX833X_PIC_CONFIG_INT (PNX833X_PIC_IRQ_BASE + 10) | ||
| 55 | #define PNX833X_PIC_AOI_INT (PNX833X_PIC_IRQ_BASE + 11) | ||
| 56 | #define PNX833X_PIC_SYNC_INT (PNX833X_PIC_IRQ_BASE + 12) | ||
| 57 | #define PNX8330_PIC_SPU_INT (PNX833X_PIC_IRQ_BASE + 13) | ||
| 58 | #define PNX8335_PIC_SATA_INT (PNX833X_PIC_IRQ_BASE + 13) | ||
| 59 | #define PNX833X_PIC_OSD_INT (PNX833X_PIC_IRQ_BASE + 14) | ||
| 60 | #define PNX833X_PIC_DISP1_INT (PNX833X_PIC_IRQ_BASE + 15) | ||
| 61 | #define PNX833X_PIC_DEINTERLACER_INT (PNX833X_PIC_IRQ_BASE + 16) | ||
| 62 | #define PNX833X_PIC_DISPLAY2_INT (PNX833X_PIC_IRQ_BASE + 17) | ||
| 63 | #define PNX833X_PIC_VC_INT (PNX833X_PIC_IRQ_BASE + 18) | ||
| 64 | #define PNX833X_PIC_SC_INT (PNX833X_PIC_IRQ_BASE + 19) | ||
| 65 | #define PNX833X_PIC_IDE_INT (PNX833X_PIC_IRQ_BASE + 20) | ||
| 66 | #define PNX833X_PIC_IDE_DMA_INT (PNX833X_PIC_IRQ_BASE + 21) | ||
| 67 | #define PNX833X_PIC_TS_IN1_DV_INT (PNX833X_PIC_IRQ_BASE + 22) | ||
| 68 | #define PNX833X_PIC_TS_IN1_DMA_INT (PNX833X_PIC_IRQ_BASE + 23) | ||
| 69 | #define PNX833X_PIC_SGDX_DMA_INT (PNX833X_PIC_IRQ_BASE + 24) | ||
| 70 | #define PNX833X_PIC_TS_OUT_INT (PNX833X_PIC_IRQ_BASE + 25) | ||
| 71 | #define PNX833X_PIC_IR_INT (PNX833X_PIC_IRQ_BASE + 26) | ||
| 72 | #define PNX833X_PIC_VMSP1_INT (PNX833X_PIC_IRQ_BASE + 27) | ||
| 73 | #define PNX833X_PIC_VMSP2_INT (PNX833X_PIC_IRQ_BASE + 28) | ||
| 74 | #define PNX833X_PIC_PIBC_INT (PNX833X_PIC_IRQ_BASE + 29) | ||
| 75 | #define PNX833X_PIC_TS_IN0_TRD_INT (PNX833X_PIC_IRQ_BASE + 30) | ||
| 76 | #define PNX833X_PIC_SGDX_TPD_INT (PNX833X_PIC_IRQ_BASE + 31) | ||
| 77 | #define PNX833X_PIC_USB_INT (PNX833X_PIC_IRQ_BASE + 32) | ||
| 78 | #define PNX833X_PIC_TS_IN1_TRD_INT (PNX833X_PIC_IRQ_BASE + 33) | ||
| 79 | #define PNX833X_PIC_CLOCK_INT (PNX833X_PIC_IRQ_BASE + 34) | ||
| 80 | #define PNX833X_PIC_SGDX_PARSER_INT (PNX833X_PIC_IRQ_BASE + 35) | ||
| 81 | #define PNX833X_PIC_VMSP_DMA_INT (PNX833X_PIC_IRQ_BASE + 36) | ||
| 82 | |||
| 83 | #if defined(CONFIG_SOC_PNX8335) | ||
| 84 | #define PNX8335_PIC_MIU_INT (PNX833X_PIC_IRQ_BASE + 37) | ||
| 85 | #define PNX8335_PIC_AVCHIP_IRQ_INT (PNX833X_PIC_IRQ_BASE + 38) | ||
| 86 | #define PNX8335_PIC_SYNC_HD_INT (PNX833X_PIC_IRQ_BASE + 39) | ||
| 87 | #define PNX8335_PIC_DISP_HD_INT (PNX833X_PIC_IRQ_BASE + 40) | ||
| 88 | #define PNX8335_PIC_DISP_SCALER_INT (PNX833X_PIC_IRQ_BASE + 41) | ||
| 89 | #define PNX8335_PIC_OSD_HD1_INT (PNX833X_PIC_IRQ_BASE + 42) | ||
| 90 | #define PNX8335_PIC_DTL_WRITER_Y_INT (PNX833X_PIC_IRQ_BASE + 43) | ||
| 91 | #define PNX8335_PIC_DTL_WRITER_C_INT (PNX833X_PIC_IRQ_BASE + 44) | ||
| 92 | #define PNX8335_PIC_DTL_EMULATOR_Y_IR_INT (PNX833X_PIC_IRQ_BASE + 45) | ||
| 93 | #define PNX8335_PIC_DTL_EMULATOR_C_IR_INT (PNX833X_PIC_IRQ_BASE + 46) | ||
| 94 | #define PNX8335_PIC_DENC_TTX_INT (PNX833X_PIC_IRQ_BASE + 47) | ||
| 95 | #define PNX8335_PIC_MMI_SIF0_INT (PNX833X_PIC_IRQ_BASE + 48) | ||
| 96 | #define PNX8335_PIC_MMI_SIF1_INT (PNX833X_PIC_IRQ_BASE + 49) | ||
| 97 | #define PNX8335_PIC_MMI_CDMMU_INT (PNX833X_PIC_IRQ_BASE + 50) | ||
| 98 | #define PNX8335_PIC_PIBCS_INT (PNX833X_PIC_IRQ_BASE + 51) | ||
| 99 | #define PNX8335_PIC_ETHERNET_INT (PNX833X_PIC_IRQ_BASE + 52) | ||
| 100 | #define PNX8335_PIC_VMSP1_0_INT (PNX833X_PIC_IRQ_BASE + 53) | ||
| 101 | #define PNX8335_PIC_VMSP1_1_INT (PNX833X_PIC_IRQ_BASE + 54) | ||
| 102 | #define PNX8335_PIC_VMSP1_DMA_INT (PNX833X_PIC_IRQ_BASE + 55) | ||
| 103 | #define PNX8335_PIC_TDGR_DE_INT (PNX833X_PIC_IRQ_BASE + 56) | ||
| 104 | #define PNX8335_PIC_IR1_IRQ_INT (PNX833X_PIC_IRQ_BASE + 57) | ||
| 105 | #endif | ||
| 106 | |||
| 107 | /* GPIO interrupts */ | ||
| 108 | #define PNX833X_GPIO_0_INT (PNX833X_GPIO_IRQ_BASE + 0) | ||
| 109 | #define PNX833X_GPIO_1_INT (PNX833X_GPIO_IRQ_BASE + 1) | ||
| 110 | #define PNX833X_GPIO_2_INT (PNX833X_GPIO_IRQ_BASE + 2) | ||
| 111 | #define PNX833X_GPIO_3_INT (PNX833X_GPIO_IRQ_BASE + 3) | ||
| 112 | #define PNX833X_GPIO_4_INT (PNX833X_GPIO_IRQ_BASE + 4) | ||
| 113 | #define PNX833X_GPIO_5_INT (PNX833X_GPIO_IRQ_BASE + 5) | ||
| 114 | #define PNX833X_GPIO_6_INT (PNX833X_GPIO_IRQ_BASE + 6) | ||
| 115 | #define PNX833X_GPIO_7_INT (PNX833X_GPIO_IRQ_BASE + 7) | ||
| 116 | #define PNX833X_GPIO_8_INT (PNX833X_GPIO_IRQ_BASE + 8) | ||
| 117 | #define PNX833X_GPIO_9_INT (PNX833X_GPIO_IRQ_BASE + 9) | ||
| 118 | #define PNX833X_GPIO_10_INT (PNX833X_GPIO_IRQ_BASE + 10) | ||
| 119 | #define PNX833X_GPIO_11_INT (PNX833X_GPIO_IRQ_BASE + 11) | ||
| 120 | #define PNX833X_GPIO_12_INT (PNX833X_GPIO_IRQ_BASE + 12) | ||
| 121 | #define PNX833X_GPIO_13_INT (PNX833X_GPIO_IRQ_BASE + 13) | ||
| 122 | #define PNX833X_GPIO_14_INT (PNX833X_GPIO_IRQ_BASE + 14) | ||
| 123 | #define PNX833X_GPIO_15_INT (PNX833X_GPIO_IRQ_BASE + 15) | ||
| 124 | |||
| 125 | #endif | ||
| 126 | |||
diff --git a/arch/mips/include/asm/mach-pnx833x/irq.h b/arch/mips/include/asm/mach-pnx833x/irq.h new file mode 100644 index 000000000000..745114b1d8d5 --- /dev/null +++ b/arch/mips/include/asm/mach-pnx833x/irq.h | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | /* | ||
| 2 | * irq.h: IRQ mappings for PNX833X. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.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 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | |||
| 23 | #ifndef __ASM_MIPS_MACH_PNX833X_IRQ_H | ||
| 24 | #define __ASM_MIPS_MACH_PNX833X_IRQ_H | ||
| 25 | /* | ||
| 26 | * The "IRQ numbers" are completely virtual. | ||
| 27 | * | ||
| 28 | * In PNX8330/1, we have 48 interrupt lines, numbered from 1 to 48. | ||
| 29 | * Let's use numbers 1..48 for PIC interrupts, number 0 for timer interrupt, | ||
| 30 | * numbers 49..64 for (virtual) GPIO interrupts. | ||
| 31 | * | ||
| 32 | * In PNX8335, we have 57 interrupt lines, numbered from 1 to 57, | ||
| 33 | * connected to PIC, which uses core hardware interrupt 2, and also | ||
| 34 | * a timer interrupt through hardware interrupt 5. | ||
| 35 | * Let's use numbers 1..64 for PIC interrupts, number 0 for timer interrupt, | ||
| 36 | * numbers 65..80 for (virtual) GPIO interrupts. | ||
| 37 | * | ||
| 38 | */ | ||
| 39 | #if defined(CONFIG_SOC_PNX8335) | ||
| 40 | #define PNX833X_PIC_NUM_IRQ 58 | ||
| 41 | #else | ||
| 42 | #define PNX833X_PIC_NUM_IRQ 37 | ||
| 43 | #endif | ||
| 44 | |||
| 45 | #define MIPS_CPU_NUM_IRQ 8 | ||
| 46 | #define PNX833X_GPIO_NUM_IRQ 16 | ||
| 47 | |||
| 48 | #define MIPS_CPU_IRQ_BASE 0 | ||
| 49 | #define PNX833X_PIC_IRQ_BASE (MIPS_CPU_IRQ_BASE + MIPS_CPU_NUM_IRQ) | ||
| 50 | #define PNX833X_GPIO_IRQ_BASE (PNX833X_PIC_IRQ_BASE + PNX833X_PIC_NUM_IRQ) | ||
| 51 | #define NR_IRQS (MIPS_CPU_NUM_IRQ + PNX833X_PIC_NUM_IRQ + PNX833X_GPIO_NUM_IRQ) | ||
| 52 | |||
| 53 | #endif | ||
diff --git a/arch/mips/include/asm/mach-pnx833x/pnx833x.h b/arch/mips/include/asm/mach-pnx833x/pnx833x.h new file mode 100644 index 000000000000..100f52870e3c --- /dev/null +++ b/arch/mips/include/asm/mach-pnx833x/pnx833x.h | |||
| @@ -0,0 +1,202 @@ | |||
| 1 | /* | ||
| 2 | * pnx833x.h: Register mappings for PNX833X. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.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 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | #ifndef __ASM_MIPS_MACH_PNX833X_PNX833X_H | ||
| 23 | #define __ASM_MIPS_MACH_PNX833X_PNX833X_H | ||
| 24 | |||
| 25 | /* All regs are accessed in KSEG1 */ | ||
| 26 | #define PNX833X_BASE (0xa0000000ul + 0x17E00000ul) | ||
| 27 | |||
| 28 | #define PNX833X_REG(offs) (*((volatile unsigned long *)(PNX833X_BASE + offs))) | ||
| 29 | |||
| 30 | /* Registers are named exactly as in PNX833X docs, just with PNX833X_ prefix */ | ||
| 31 | |||
| 32 | /* Read access to multibit fields */ | ||
| 33 | #define PNX833X_BIT(val, reg, field) ((val) & PNX833X_##reg##_##field) | ||
| 34 | #define PNX833X_REGBIT(reg, field) PNX833X_BIT(PNX833X_##reg, reg, field) | ||
| 35 | |||
| 36 | /* Use PNX833X_FIELD to extract a field from val */ | ||
| 37 | #define PNX_FIELD(cpu, val, reg, field) \ | ||
| 38 | (((val) & PNX##cpu##_##reg##_##field##_MASK) >> \ | ||
| 39 | PNX##cpu##_##reg##_##field##_SHIFT) | ||
| 40 | #define PNX833X_FIELD(val, reg, field) PNX_FIELD(833X, val, reg, field) | ||
| 41 | #define PNX8330_FIELD(val, reg, field) PNX_FIELD(8330, val, reg, field) | ||
| 42 | #define PNX8335_FIELD(val, reg, field) PNX_FIELD(8335, val, reg, field) | ||
| 43 | |||
| 44 | /* Use PNX833X_REGFIELD to extract a field from a register */ | ||
| 45 | #define PNX833X_REGFIELD(reg, field) PNX833X_FIELD(PNX833X_##reg, reg, field) | ||
| 46 | #define PNX8330_REGFIELD(reg, field) PNX8330_FIELD(PNX8330_##reg, reg, field) | ||
| 47 | #define PNX8335_REGFIELD(reg, field) PNX8335_FIELD(PNX8335_##reg, reg, field) | ||
| 48 | |||
| 49 | |||
| 50 | #define PNX_WRITEFIELD(cpu, val, reg, field) \ | ||
| 51 | (PNX##cpu##_##reg = (PNX##cpu##_##reg & ~(PNX##cpu##_##reg##_##field##_MASK)) | \ | ||
| 52 | ((val) << PNX##cpu##_##reg##_##field##_SHIFT)) | ||
| 53 | #define PNX833X_WRITEFIELD(val, reg, field) \ | ||
| 54 | PNX_WRITEFIELD(833X, val, reg, field) | ||
| 55 | #define PNX8330_WRITEFIELD(val, reg, field) \ | ||
| 56 | PNX_WRITEFIELD(8330, val, reg, field) | ||
| 57 | #define PNX8335_WRITEFIELD(val, reg, field) \ | ||
| 58 | PNX_WRITEFIELD(8335, val, reg, field) | ||
| 59 | |||
| 60 | |||
| 61 | /* Macros to detect CPU type */ | ||
| 62 | |||
| 63 | #define PNX833X_CONFIG_MODULE_ID PNX833X_REG(0x7FFC) | ||
| 64 | #define PNX833X_CONFIG_MODULE_ID_MAJREV_MASK 0x0000f000 | ||
| 65 | #define PNX833X_CONFIG_MODULE_ID_MAJREV_SHIFT 12 | ||
| 66 | #define PNX8330_CONFIG_MODULE_MAJREV 4 | ||
| 67 | #define PNX8335_CONFIG_MODULE_MAJREV 5 | ||
| 68 | #define CPU_IS_PNX8330 (PNX833X_REGFIELD(CONFIG_MODULE_ID, MAJREV) == \ | ||
| 69 | PNX8330_CONFIG_MODULE_MAJREV) | ||
| 70 | #define CPU_IS_PNX8335 (PNX833X_REGFIELD(CONFIG_MODULE_ID, MAJREV) == \ | ||
| 71 | PNX8335_CONFIG_MODULE_MAJREV) | ||
| 72 | |||
| 73 | |||
| 74 | |||
| 75 | #define PNX833X_RESET_CONTROL PNX833X_REG(0x8004) | ||
| 76 | #define PNX833X_RESET_CONTROL_2 PNX833X_REG(0x8014) | ||
| 77 | |||
| 78 | #define PNX833X_PIC_REG(offs) PNX833X_REG(0x01000 + (offs)) | ||
| 79 | #define PNX833X_PIC_INT_PRIORITY PNX833X_PIC_REG(0x0) | ||
| 80 | #define PNX833X_PIC_INT_SRC PNX833X_PIC_REG(0x4) | ||
| 81 | #define PNX833X_PIC_INT_SRC_INT_SRC_MASK 0x00000FF8ul /* bits 11:3 */ | ||
| 82 | #define PNX833X_PIC_INT_SRC_INT_SRC_SHIFT 3 | ||
| 83 | #define PNX833X_PIC_INT_REG(irq) PNX833X_PIC_REG(0x10 + 4*(irq)) | ||
| 84 | |||
| 85 | #define PNX833X_CLOCK_CPUCP_CTL PNX833X_REG(0x9228) | ||
| 86 | #define PNX833X_CLOCK_CPUCP_CTL_EXIT_RESET 0x00000002ul /* bit 1 */ | ||
| 87 | #define PNX833X_CLOCK_CPUCP_CTL_DIV_CLOCK_MASK 0x00000018ul /* bits 4:3 */ | ||
| 88 | #define PNX833X_CLOCK_CPUCP_CTL_DIV_CLOCK_SHIFT 3 | ||
| 89 | |||
| 90 | #define PNX8335_CLOCK_PLL_CPU_CTL PNX833X_REG(0x9020) | ||
| 91 | #define PNX8335_CLOCK_PLL_CPU_CTL_FREQ_MASK 0x1f | ||
| 92 | #define PNX8335_CLOCK_PLL_CPU_CTL_FREQ_SHIFT 0 | ||
| 93 | |||
| 94 | #define PNX833X_CONFIG_MUX PNX833X_REG(0x7004) | ||
| 95 | #define PNX833X_CONFIG_MUX_IDE_MUX 0x00000080 /* bit 7 */ | ||
| 96 | |||
| 97 | #define PNX8330_CONFIG_POLYFUSE_7 PNX833X_REG(0x7040) | ||
| 98 | #define PNX8330_CONFIG_POLYFUSE_7_BOOT_MODE_MASK 0x00180000 | ||
| 99 | #define PNX8330_CONFIG_POLYFUSE_7_BOOT_MODE_SHIFT 19 | ||
| 100 | |||
| 101 | #define PNX833X_PIO_IN PNX833X_REG(0xF000) | ||
| 102 | #define PNX833X_PIO_OUT PNX833X_REG(0xF004) | ||
| 103 | #define PNX833X_PIO_DIR PNX833X_REG(0xF008) | ||
| 104 | #define PNX833X_PIO_SEL PNX833X_REG(0xF014) | ||
| 105 | #define PNX833X_PIO_INT_EDGE PNX833X_REG(0xF020) | ||
| 106 | #define PNX833X_PIO_INT_HI PNX833X_REG(0xF024) | ||
| 107 | #define PNX833X_PIO_INT_LO PNX833X_REG(0xF028) | ||
| 108 | #define PNX833X_PIO_INT_STATUS PNX833X_REG(0xFFE0) | ||
| 109 | #define PNX833X_PIO_INT_ENABLE PNX833X_REG(0xFFE4) | ||
| 110 | #define PNX833X_PIO_INT_CLEAR PNX833X_REG(0xFFE8) | ||
| 111 | #define PNX833X_PIO_IN2 PNX833X_REG(0xF05C) | ||
| 112 | #define PNX833X_PIO_OUT2 PNX833X_REG(0xF060) | ||
| 113 | #define PNX833X_PIO_DIR2 PNX833X_REG(0xF064) | ||
| 114 | #define PNX833X_PIO_SEL2 PNX833X_REG(0xF068) | ||
| 115 | |||
| 116 | #define PNX833X_UART0_PORTS_START (PNX833X_BASE + 0xB000) | ||
| 117 | #define PNX833X_UART0_PORTS_END (PNX833X_BASE + 0xBFFF) | ||
| 118 | #define PNX833X_UART1_PORTS_START (PNX833X_BASE + 0xC000) | ||
| 119 | #define PNX833X_UART1_PORTS_END (PNX833X_BASE + 0xCFFF) | ||
| 120 | |||
| 121 | #define PNX833X_USB_PORTS_START (PNX833X_BASE + 0x19000) | ||
| 122 | #define PNX833X_USB_PORTS_END (PNX833X_BASE + 0x19FFF) | ||
| 123 | |||
| 124 | #define PNX833X_CONFIG_USB PNX833X_REG(0x7008) | ||
| 125 | |||
| 126 | #define PNX833X_I2C0_PORTS_START (PNX833X_BASE + 0xD000) | ||
| 127 | #define PNX833X_I2C0_PORTS_END (PNX833X_BASE + 0xDFFF) | ||
| 128 | #define PNX833X_I2C1_PORTS_START (PNX833X_BASE + 0xE000) | ||
| 129 | #define PNX833X_I2C1_PORTS_END (PNX833X_BASE + 0xEFFF) | ||
| 130 | |||
| 131 | #define PNX833X_IDE_PORTS_START (PNX833X_BASE + 0x1A000) | ||
| 132 | #define PNX833X_IDE_PORTS_END (PNX833X_BASE + 0x1AFFF) | ||
| 133 | #define PNX833X_IDE_MODULE_ID PNX833X_REG(0x1AFFC) | ||
| 134 | |||
| 135 | #define PNX833X_IDE_MODULE_ID_MODULE_ID_MASK 0xFFFF0000 | ||
| 136 | #define PNX833X_IDE_MODULE_ID_MODULE_ID_SHIFT 16 | ||
| 137 | #define PNX833X_IDE_MODULE_ID_VALUE 0xA009 | ||
| 138 | |||
| 139 | |||
| 140 | #define PNX833X_MIU_SEL0 PNX833X_REG(0x2004) | ||
| 141 | #define PNX833X_MIU_SEL0_TIMING PNX833X_REG(0x2008) | ||
| 142 | #define PNX833X_MIU_SEL1 PNX833X_REG(0x200C) | ||
| 143 | #define PNX833X_MIU_SEL1_TIMING PNX833X_REG(0x2010) | ||
| 144 | #define PNX833X_MIU_SEL2 PNX833X_REG(0x2014) | ||
| 145 | #define PNX833X_MIU_SEL2_TIMING PNX833X_REG(0x2018) | ||
| 146 | #define PNX833X_MIU_SEL3 PNX833X_REG(0x201C) | ||
| 147 | #define PNX833X_MIU_SEL3_TIMING PNX833X_REG(0x2020) | ||
| 148 | |||
| 149 | #define PNX833X_MIU_SEL0_SPI_MODE_ENABLE_MASK (1 << 14) | ||
| 150 | #define PNX833X_MIU_SEL0_SPI_MODE_ENABLE_SHIFT 14 | ||
| 151 | |||
| 152 | #define PNX833X_MIU_SEL0_BURST_MODE_ENABLE_MASK (1 << 7) | ||
| 153 | #define PNX833X_MIU_SEL0_BURST_MODE_ENABLE_SHIFT 7 | ||
| 154 | |||
| 155 | #define PNX833X_MIU_SEL0_BURST_PAGE_LEN_MASK (0xF << 9) | ||
| 156 | #define PNX833X_MIU_SEL0_BURST_PAGE_LEN_SHIFT 9 | ||
| 157 | |||
| 158 | #define PNX833X_MIU_CONFIG_SPI PNX833X_REG(0x2000) | ||
| 159 | |||
| 160 | #define PNX833X_MIU_CONFIG_SPI_OPCODE_MASK (0xFF << 3) | ||
| 161 | #define PNX833X_MIU_CONFIG_SPI_OPCODE_SHIFT 3 | ||
| 162 | |||
| 163 | #define PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_MASK (1 << 2) | ||
| 164 | #define PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_SHIFT 2 | ||
| 165 | |||
| 166 | #define PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_MASK (1 << 1) | ||
| 167 | #define PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_SHIFT 1 | ||
| 168 | |||
| 169 | #define PNX833X_MIU_CONFIG_SPI_SYNC_MASK (1 << 0) | ||
| 170 | #define PNX833X_MIU_CONFIG_SPI_SYNC_SHIFT 0 | ||
| 171 | |||
| 172 | #define PNX833X_WRITE_CONFIG_SPI(opcode, data_enable, addr_enable, sync) \ | ||
| 173 | (PNX833X_MIU_CONFIG_SPI = \ | ||
| 174 | ((opcode) << PNX833X_MIU_CONFIG_SPI_OPCODE_SHIFT) | \ | ||
| 175 | ((data_enable) << PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_SHIFT) | \ | ||
| 176 | ((addr_enable) << PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_SHIFT) | \ | ||
| 177 | ((sync) << PNX833X_MIU_CONFIG_SPI_SYNC_SHIFT)) | ||
| 178 | |||
| 179 | #define PNX8335_IP3902_PORTS_START (PNX833X_BASE + 0x2F000) | ||
| 180 | #define PNX8335_IP3902_PORTS_END (PNX833X_BASE + 0x2FFFF) | ||
| 181 | #define PNX8335_IP3902_MODULE_ID PNX833X_REG(0x2FFFC) | ||
| 182 | |||
| 183 | #define PNX8335_IP3902_MODULE_ID_MODULE_ID_MASK 0xFFFF0000 | ||
| 184 | #define PNX8335_IP3902_MODULE_ID_MODULE_ID_SHIFT 16 | ||
| 185 | #define PNX8335_IP3902_MODULE_ID_VALUE 0x3902 | ||
| 186 | |||
| 187 | /* I/O location(gets remapped)*/ | ||
| 188 | #define PNX8335_NAND_BASE 0x18000000 | ||
| 189 | /* I/O location with CLE high */ | ||
| 190 | #define PNX8335_NAND_CLE_MASK 0x00100000 | ||
| 191 | /* I/O location with ALE high */ | ||
| 192 | #define PNX8335_NAND_ALE_MASK 0x00010000 | ||
| 193 | |||
| 194 | #define PNX8335_SATA_PORTS_START (PNX833X_BASE + 0x2E000) | ||
| 195 | #define PNX8335_SATA_PORTS_END (PNX833X_BASE + 0x2EFFF) | ||
| 196 | #define PNX8335_SATA_MODULE_ID PNX833X_REG(0x2EFFC) | ||
| 197 | |||
| 198 | #define PNX8335_SATA_MODULE_ID_MODULE_ID_MASK 0xFFFF0000 | ||
| 199 | #define PNX8335_SATA_MODULE_ID_MODULE_ID_SHIFT 16 | ||
| 200 | #define PNX8335_SATA_MODULE_ID_VALUE 0xA099 | ||
| 201 | |||
| 202 | #endif | ||
diff --git a/arch/mips/include/asm/mach-pnx833x/war.h b/arch/mips/include/asm/mach-pnx833x/war.h new file mode 100644 index 000000000000..82cd1e97bc2e --- /dev/null +++ b/arch/mips/include/asm/mach-pnx833x/war.h | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org> | ||
| 7 | */ | ||
| 8 | #ifndef __ASM_MIPS_MACH_PNX833X_WAR_H | ||
| 9 | #define __ASM_MIPS_MACH_PNX833X_WAR_H | ||
| 10 | |||
| 11 | #define R4600_V1_INDEX_ICACHEOP_WAR 0 | ||
| 12 | #define R4600_V1_HIT_CACHEOP_WAR 0 | ||
| 13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | ||
| 14 | #define R5432_CP0_INTERRUPT_WAR 0 | ||
| 15 | #define BCM1250_M3_WAR 0 | ||
| 16 | #define SIBYTE_1956_WAR 0 | ||
| 17 | #define MIPS4K_ICACHE_REFILL_WAR 0 | ||
| 18 | #define MIPS_CACHE_SYNC_WAR 0 | ||
| 19 | #define TX49XX_ICACHE_INDEX_INV_WAR 0 | ||
| 20 | #define RM9000_CDEX_SMP_WAR 0 | ||
| 21 | #define ICACHE_REFILLS_WORKAROUND_WAR 0 | ||
| 22 | #define R10000_LLSC_WAR 0 | ||
| 23 | #define MIPS34K_MISSED_ITLB_WAR 0 | ||
| 24 | |||
| 25 | #endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */ | ||
diff --git a/arch/mips/include/asm/mach-tx49xx/mangle-port.h b/arch/mips/include/asm/mach-tx49xx/mangle-port.h new file mode 100644 index 000000000000..5e6912fdd0ed --- /dev/null +++ b/arch/mips/include/asm/mach-tx49xx/mangle-port.h | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | #ifndef __ASM_MACH_TX49XX_MANGLE_PORT_H | ||
| 2 | #define __ASM_MACH_TX49XX_MANGLE_PORT_H | ||
| 3 | |||
| 4 | #define __swizzle_addr_b(port) (port) | ||
| 5 | #define __swizzle_addr_w(port) (port) | ||
| 6 | #define __swizzle_addr_l(port) (port) | ||
| 7 | #define __swizzle_addr_q(port) (port) | ||
| 8 | |||
| 9 | #define ioswabb(a, x) (x) | ||
| 10 | #define __mem_ioswabb(a, x) (x) | ||
| 11 | #if defined(CONFIG_TOSHIBA_RBTX4939) && \ | ||
| 12 | (defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)) && \ | ||
| 13 | defined(__BIG_ENDIAN) | ||
| 14 | #define NEEDS_TXX9_IOSWABW | ||
| 15 | extern u16 (*ioswabw)(volatile u16 *a, u16 x); | ||
| 16 | extern u16 (*__mem_ioswabw)(volatile u16 *a, u16 x); | ||
| 17 | #else | ||
| 18 | #define ioswabw(a, x) le16_to_cpu(x) | ||
| 19 | #define __mem_ioswabw(a, x) (x) | ||
| 20 | #endif | ||
| 21 | #define ioswabl(a, x) le32_to_cpu(x) | ||
| 22 | #define __mem_ioswabl(a, x) (x) | ||
| 23 | #define ioswabq(a, x) le64_to_cpu(x) | ||
| 24 | #define __mem_ioswabq(a, x) (x) | ||
| 25 | |||
| 26 | #endif /* __ASM_MACH_TX49XX_MANGLE_PORT_H */ | ||
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 979866000da4..9316324d070d 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
| @@ -192,6 +192,7 @@ | |||
| 192 | #define PM_16M 0x01ffe000 | 192 | #define PM_16M 0x01ffe000 |
| 193 | #define PM_64M 0x07ffe000 | 193 | #define PM_64M 0x07ffe000 |
| 194 | #define PM_256M 0x1fffe000 | 194 | #define PM_256M 0x1fffe000 |
| 195 | #define PM_1G 0x7fffe000 | ||
| 195 | 196 | ||
| 196 | #endif | 197 | #endif |
| 197 | 198 | ||
diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h index de6d09ebbd80..e2e09b2cd265 100644 --- a/arch/mips/include/asm/module.h +++ b/arch/mips/include/asm/module.h | |||
| @@ -98,6 +98,8 @@ search_module_dbetables(unsigned long addr) | |||
| 98 | #define MODULE_PROC_FAMILY "R5000 " | 98 | #define MODULE_PROC_FAMILY "R5000 " |
| 99 | #elif defined CONFIG_CPU_R5432 | 99 | #elif defined CONFIG_CPU_R5432 |
| 100 | #define MODULE_PROC_FAMILY "R5432 " | 100 | #define MODULE_PROC_FAMILY "R5432 " |
| 101 | #elif defined CONFIG_CPU_R5500 | ||
| 102 | #define MODULE_PROC_FAMILY "R5500 " | ||
| 101 | #elif defined CONFIG_CPU_R6000 | 103 | #elif defined CONFIG_CPU_R6000 |
| 102 | #define MODULE_PROC_FAMILY "R6000 " | 104 | #define MODULE_PROC_FAMILY "R6000 " |
| 103 | #elif defined CONFIG_CPU_NEVADA | 105 | #elif defined CONFIG_CPU_NEVADA |
diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index 9c22571b160d..813abd16255d 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h | |||
| @@ -80,25 +80,25 @@ enum pt_watch_style { | |||
| 80 | pt_watch_style_mips64 | 80 | pt_watch_style_mips64 |
| 81 | }; | 81 | }; |
| 82 | struct mips32_watch_regs { | 82 | struct mips32_watch_regs { |
| 83 | uint32_t watchlo[8]; | 83 | unsigned int watchlo[8]; |
| 84 | /* Lower 16 bits of watchhi. */ | 84 | /* Lower 16 bits of watchhi. */ |
| 85 | uint16_t watchhi[8]; | 85 | unsigned short watchhi[8]; |
| 86 | /* Valid mask and I R W bits. | 86 | /* Valid mask and I R W bits. |
| 87 | * bit 0 -- 1 if W bit is usable. | 87 | * bit 0 -- 1 if W bit is usable. |
| 88 | * bit 1 -- 1 if R bit is usable. | 88 | * bit 1 -- 1 if R bit is usable. |
| 89 | * bit 2 -- 1 if I bit is usable. | 89 | * bit 2 -- 1 if I bit is usable. |
| 90 | * bits 3 - 11 -- Valid watchhi mask bits. | 90 | * bits 3 - 11 -- Valid watchhi mask bits. |
| 91 | */ | 91 | */ |
| 92 | uint16_t watch_masks[8]; | 92 | unsigned short watch_masks[8]; |
| 93 | /* The number of valid watch register pairs. */ | 93 | /* The number of valid watch register pairs. */ |
| 94 | uint32_t num_valid; | 94 | unsigned int num_valid; |
| 95 | } __attribute__((aligned(8))); | 95 | } __attribute__((aligned(8))); |
| 96 | 96 | ||
| 97 | struct mips64_watch_regs { | 97 | struct mips64_watch_regs { |
| 98 | uint64_t watchlo[8]; | 98 | unsigned long long watchlo[8]; |
| 99 | uint16_t watchhi[8]; | 99 | unsigned short watchhi[8]; |
| 100 | uint16_t watch_masks[8]; | 100 | unsigned short watch_masks[8]; |
| 101 | uint32_t num_valid; | 101 | unsigned int num_valid; |
| 102 | } __attribute__((aligned(8))); | 102 | } __attribute__((aligned(8))); |
| 103 | 103 | ||
| 104 | struct pt_watch_regs { | 104 | struct pt_watch_regs { |
| @@ -116,6 +116,7 @@ struct pt_watch_regs { | |||
| 116 | 116 | ||
| 117 | #include <linux/compiler.h> | 117 | #include <linux/compiler.h> |
| 118 | #include <linux/linkage.h> | 118 | #include <linux/linkage.h> |
| 119 | #include <linux/types.h> | ||
| 119 | #include <asm/isadep.h> | 120 | #include <asm/isadep.h> |
| 120 | 121 | ||
| 121 | struct task_struct; | 122 | struct task_struct; |
diff --git a/arch/mips/include/asm/txx9/generic.h b/arch/mips/include/asm/txx9/generic.h index 4316a3e57678..9cde0090cbf6 100644 --- a/arch/mips/include/asm/txx9/generic.h +++ b/arch/mips/include/asm/txx9/generic.h | |||
| @@ -86,4 +86,9 @@ void txx9_iocled_init(unsigned long baseaddr, | |||
| 86 | int basenum, unsigned int num, int lowactive, | 86 | int basenum, unsigned int num, int lowactive, |
| 87 | const char *color, char **deftriggers); | 87 | const char *color, char **deftriggers); |
| 88 | 88 | ||
| 89 | /* 7SEG LED */ | ||
| 90 | void txx9_7segled_init(unsigned int num, | ||
| 91 | void (*putc)(unsigned int pos, unsigned char val)); | ||
| 92 | int txx9_7segled_putc(unsigned int pos, char c); | ||
| 93 | |||
| 89 | #endif /* __ASM_TXX9_GENERIC_H */ | 94 | #endif /* __ASM_TXX9_GENERIC_H */ |
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index d9da7112aaf8..b1372c27f136 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
| @@ -33,6 +33,7 @@ obj-$(CONFIG_CPU_R4X00) += r4k_fpu.o r4k_switch.o | |||
| 33 | obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o | 33 | obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o |
| 34 | obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o | 34 | obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o |
| 35 | obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o | 35 | obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o |
| 36 | obj-$(CONFIG_CPU_R5500) += r4k_fpu.o r4k_switch.o | ||
| 36 | obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o | 37 | obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o |
| 37 | obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o | 38 | obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o |
| 38 | obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o | 39 | obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 5e75a316f6b1..759f68066b5d 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
| @@ -180,7 +180,7 @@ bad_stack: | |||
| 180 | * The system call does not exist in this kernel | 180 | * The system call does not exist in this kernel |
| 181 | */ | 181 | */ |
| 182 | illegal_syscall: | 182 | illegal_syscall: |
| 183 | li v0, -ENOSYS # error | 183 | li v0, ENOSYS # error |
| 184 | sw v0, PT_R2(sp) | 184 | sw v0, PT_R2(sp) |
| 185 | li t0, 1 # set error flag | 185 | li t0, 1 # set error flag |
| 186 | sw t0, PT_R7(sp) | 186 | sw t0, PT_R7(sp) |
| @@ -293,7 +293,7 @@ bad_alignment: | |||
| 293 | jr t2 | 293 | jr t2 |
| 294 | /* Unreached */ | 294 | /* Unreached */ |
| 295 | 295 | ||
| 296 | einval: li v0, -EINVAL | 296 | einval: li v0, -ENOSYS |
| 297 | jr ra | 297 | jr ra |
| 298 | END(sys_syscall) | 298 | END(sys_syscall) |
| 299 | 299 | ||
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 3d58204c9d44..a9e171618994 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
| @@ -117,7 +117,7 @@ syscall_trace_entry: | |||
| 117 | 117 | ||
| 118 | illegal_syscall: | 118 | illegal_syscall: |
| 119 | /* This also isn't a 64-bit syscall, throw an error. */ | 119 | /* This also isn't a 64-bit syscall, throw an error. */ |
| 120 | li v0, -ENOSYS # error | 120 | li v0, ENOSYS # error |
| 121 | sd v0, PT_R2(sp) | 121 | sd v0, PT_R2(sp) |
| 122 | li t0, 1 # set error flag | 122 | li t0, 1 # set error flag |
| 123 | sd t0, PT_R7(sp) | 123 | sd t0, PT_R7(sp) |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 16f8edfe5cdc..4430a1f8fdf1 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
| @@ -601,8 +601,8 @@ static int __init debugfs_mips(void) | |||
| 601 | struct dentry *d; | 601 | struct dentry *d; |
| 602 | 602 | ||
| 603 | d = debugfs_create_dir("mips", NULL); | 603 | d = debugfs_create_dir("mips", NULL); |
| 604 | if (IS_ERR(d)) | 604 | if (!d) |
| 605 | return PTR_ERR(d); | 605 | return -ENOMEM; |
| 606 | mips_debugfs_dir = d; | 606 | mips_debugfs_dir = d; |
| 607 | return 0; | 607 | return 0; |
| 608 | } | 608 | } |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 7b59cfb7e602..b79ea7055ec3 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -163,8 +163,10 @@ static void stop_this_cpu(void *dummy) | |||
| 163 | * Remove this CPU: | 163 | * Remove this CPU: |
| 164 | */ | 164 | */ |
| 165 | cpu_clear(smp_processor_id(), cpu_online_map); | 165 | cpu_clear(smp_processor_id(), cpu_online_map); |
| 166 | local_irq_enable(); /* May need to service _machine_restart IPI */ | 166 | for (;;) { |
| 167 | for (;;); /* Wait if available. */ | 167 | if (cpu_wait) |
| 168 | (*cpu_wait)(); /* Wait if available. */ | ||
| 169 | } | ||
| 168 | } | 170 | } |
| 169 | 171 | ||
| 170 | void smp_send_stop(void) | 172 | void smp_send_stop(void) |
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c index c327b21bca81..20709669e592 100644 --- a/arch/mips/kernel/unaligned.c +++ b/arch/mips/kernel/unaligned.c | |||
| @@ -560,12 +560,12 @@ static int __init debugfs_unaligned(void) | |||
| 560 | return -ENODEV; | 560 | return -ENODEV; |
| 561 | d = debugfs_create_u32("unaligned_instructions", S_IRUGO, | 561 | d = debugfs_create_u32("unaligned_instructions", S_IRUGO, |
| 562 | mips_debugfs_dir, &unaligned_instructions); | 562 | mips_debugfs_dir, &unaligned_instructions); |
| 563 | if (IS_ERR(d)) | 563 | if (!d) |
| 564 | return PTR_ERR(d); | 564 | return -ENOMEM; |
| 565 | d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR, | 565 | d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR, |
| 566 | mips_debugfs_dir, &unaligned_action); | 566 | mips_debugfs_dir, &unaligned_action); |
| 567 | if (IS_ERR(d)) | 567 | if (!d) |
| 568 | return PTR_ERR(d); | 568 | return -ENOMEM; |
| 569 | return 0; | 569 | return 0; |
| 570 | } | 570 | } |
| 571 | __initcall(debugfs_unaligned); | 571 | __initcall(debugfs_unaligned); |
diff --git a/arch/mips/lemote/lm2e/pci.c b/arch/mips/lemote/lm2e/pci.c index c1e41f15cc7e..8be03a8e1ad4 100644 --- a/arch/mips/lemote/lm2e/pci.c +++ b/arch/mips/lemote/lm2e/pci.c | |||
| @@ -30,19 +30,20 @@ | |||
| 30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <asm/mips-boards/bonito64.h> | 32 | #include <asm/mips-boards/bonito64.h> |
| 33 | #include <asm/mach-lemote/pci.h> | ||
| 33 | 34 | ||
| 34 | extern struct pci_ops bonito64_pci_ops; | 35 | extern struct pci_ops bonito64_pci_ops; |
| 35 | 36 | ||
| 36 | static struct resource loongson2e_pci_mem_resource = { | 37 | static struct resource loongson2e_pci_mem_resource = { |
| 37 | .name = "LOONGSON2E PCI MEM", | 38 | .name = "LOONGSON2E PCI MEM", |
| 38 | .start = 0x14000000UL, | 39 | .start = LOONGSON2E_PCI_MEM_START, |
| 39 | .end = 0x1fffffffUL, | 40 | .end = LOONGSON2E_PCI_MEM_END, |
| 40 | .flags = IORESOURCE_MEM, | 41 | .flags = IORESOURCE_MEM, |
| 41 | }; | 42 | }; |
| 42 | 43 | ||
| 43 | static struct resource loongson2e_pci_io_resource = { | 44 | static struct resource loongson2e_pci_io_resource = { |
| 44 | .name = "LOONGSON2E PCI IO MEM", | 45 | .name = "LOONGSON2E PCI IO MEM", |
| 45 | .start = 0x00004000UL, | 46 | .start = LOONGSON2E_PCI_IO_START, |
| 46 | .end = IO_SPACE_LIMIT, | 47 | .end = IO_SPACE_LIMIT, |
| 47 | .flags = IORESOURCE_IO, | 48 | .flags = IORESOURCE_IO, |
| 48 | }; | 49 | }; |
| @@ -82,6 +83,12 @@ static void __init ict_pcimap(void) | |||
| 82 | static int __init pcibios_init(void) | 83 | static int __init pcibios_init(void) |
| 83 | { | 84 | { |
| 84 | ict_pcimap(); | 85 | ict_pcimap(); |
| 86 | |||
| 87 | loongson2e_pci_controller.io_map_base = | ||
| 88 | (unsigned long) ioremap(LOONGSON2E_IO_PORT_BASE, | ||
| 89 | loongson2e_pci_io_resource.end - | ||
| 90 | loongson2e_pci_io_resource.start + 1); | ||
| 91 | |||
| 85 | register_pci_controller(&loongson2e_pci_controller); | 92 | register_pci_controller(&loongson2e_pci_controller); |
| 86 | 93 | ||
| 87 | return 0; | 94 | return 0; |
diff --git a/arch/mips/lemote/lm2e/setup.c b/arch/mips/lemote/lm2e/setup.c index 2cc6745991ab..ebd6ceaef2fd 100644 --- a/arch/mips/lemote/lm2e/setup.c +++ b/arch/mips/lemote/lm2e/setup.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <asm/mc146818-time.h> | 34 | #include <asm/mc146818-time.h> |
| 35 | #include <asm/time.h> | 35 | #include <asm/time.h> |
| 36 | #include <asm/wbflush.h> | 36 | #include <asm/wbflush.h> |
| 37 | #include <asm/mach-lemote/pci.h> | ||
| 37 | 38 | ||
| 38 | #ifdef CONFIG_VT | 39 | #ifdef CONFIG_VT |
| 39 | #include <linux/console.h> | 40 | #include <linux/console.h> |
| @@ -42,12 +43,6 @@ | |||
| 42 | 43 | ||
| 43 | extern void mips_reboot_setup(void); | 44 | extern void mips_reboot_setup(void); |
| 44 | 45 | ||
| 45 | #ifdef CONFIG_64BIT | ||
| 46 | #define PTR_PAD(p) ((0xffffffff00000000)|((unsigned long long)(p))) | ||
| 47 | #else | ||
| 48 | #define PTR_PAD(p) (p) | ||
| 49 | #endif | ||
| 50 | |||
| 51 | unsigned long cpu_clock_freq; | 46 | unsigned long cpu_clock_freq; |
| 52 | unsigned long bus_clock; | 47 | unsigned long bus_clock; |
| 53 | unsigned int memsize; | 48 | unsigned int memsize; |
| @@ -80,8 +75,8 @@ static void wbflush_loongson2e(void) | |||
| 80 | 75 | ||
| 81 | void __init plat_mem_setup(void) | 76 | void __init plat_mem_setup(void) |
| 82 | { | 77 | { |
| 83 | set_io_port_base(PTR_PAD(0xbfd00000)); | 78 | set_io_port_base((unsigned long)ioremap(LOONGSON2E_IO_PORT_BASE, |
| 84 | 79 | IO_SPACE_LIMIT - LOONGSON2E_PCI_IO_START + 1)); | |
| 85 | mips_reboot_setup(); | 80 | mips_reboot_setup(); |
| 86 | 81 | ||
| 87 | __wbflush = wbflush_loongson2e; | 82 | __wbflush = wbflush_loongson2e; |
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 8810dfb915dd..dbcf6511b74e 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile | |||
| @@ -18,6 +18,7 @@ obj-$(CONFIG_CPU_R4300) += dump_tlb.o | |||
| 18 | obj-$(CONFIG_CPU_R4X00) += dump_tlb.o | 18 | obj-$(CONFIG_CPU_R4X00) += dump_tlb.o |
| 19 | obj-$(CONFIG_CPU_R5000) += dump_tlb.o | 19 | obj-$(CONFIG_CPU_R5000) += dump_tlb.o |
| 20 | obj-$(CONFIG_CPU_R5432) += dump_tlb.o | 20 | obj-$(CONFIG_CPU_R5432) += dump_tlb.o |
| 21 | obj-$(CONFIG_CPU_R5500) += dump_tlb.o | ||
| 21 | obj-$(CONFIG_CPU_R6000) += | 22 | obj-$(CONFIG_CPU_R6000) += |
| 22 | obj-$(CONFIG_CPU_R8000) += | 23 | obj-$(CONFIG_CPU_R8000) += |
| 23 | obj-$(CONFIG_CPU_RM7000) += dump_tlb.o | 24 | obj-$(CONFIG_CPU_RM7000) += dump_tlb.o |
diff --git a/arch/mips/lib/dump_tlb.c b/arch/mips/lib/dump_tlb.c index 465ff0ec85b9..779821cd54ab 100644 --- a/arch/mips/lib/dump_tlb.c +++ b/arch/mips/lib/dump_tlb.c | |||
| @@ -25,6 +25,7 @@ static inline const char *msk2str(unsigned int mask) | |||
| 25 | case PM_16M: return "16Mb"; | 25 | case PM_16M: return "16Mb"; |
| 26 | case PM_64M: return "64Mb"; | 26 | case PM_64M: return "64Mb"; |
| 27 | case PM_256M: return "256Mb"; | 27 | case PM_256M: return "256Mb"; |
| 28 | case PM_1G: return "1Gb"; | ||
| 28 | #endif | 29 | #endif |
| 29 | } | 30 | } |
| 30 | return ""; | 31 | return ""; |
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index b08fc65c13a6..7ec0b217dfd3 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
| @@ -1299,12 +1299,12 @@ static int __init debugfs_fpuemu(void) | |||
| 1299 | if (!mips_debugfs_dir) | 1299 | if (!mips_debugfs_dir) |
| 1300 | return -ENODEV; | 1300 | return -ENODEV; |
| 1301 | dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir); | 1301 | dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir); |
| 1302 | if (IS_ERR(dir)) | 1302 | if (!dir) |
| 1303 | return PTR_ERR(dir); | 1303 | return -ENOMEM; |
| 1304 | for (i = 0; i < ARRAY_SIZE(vars); i++) { | 1304 | for (i = 0; i < ARRAY_SIZE(vars); i++) { |
| 1305 | d = debugfs_create_u32(vars[i].name, S_IRUGO, dir, vars[i].v); | 1305 | d = debugfs_create_u32(vars[i].name, S_IRUGO, dir, vars[i].v); |
| 1306 | if (IS_ERR(d)) | 1306 | if (!d) |
| 1307 | return PTR_ERR(d); | 1307 | return -ENOMEM; |
| 1308 | } | 1308 | } |
| 1309 | return 0; | 1309 | return 0; |
| 1310 | } | 1310 | } |
diff --git a/arch/mips/mm/Makefile b/arch/mips/mm/Makefile index 44e8dd8106bf..95ba32b5b720 100644 --- a/arch/mips/mm/Makefile +++ b/arch/mips/mm/Makefile | |||
| @@ -19,6 +19,7 @@ obj-$(CONFIG_CPU_R4300) += c-r4k.o cex-gen.o tlb-r4k.o | |||
| 19 | obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o | 19 | obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o |
| 20 | obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o | 20 | obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o |
| 21 | obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o | 21 | obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o |
| 22 | obj-$(CONFIG_CPU_R5500) += c-r4k.o cex-gen.o tlb-r4k.o | ||
| 22 | obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o | 23 | obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o |
| 23 | obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o | 24 | obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o |
| 24 | obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o | 25 | obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o |
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index 891312f8e5a6..5b98d0e731c2 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c | |||
| @@ -324,7 +324,6 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | |||
| 324 | if (cpu_is_noncoherent_r10000(dev)) | 324 | if (cpu_is_noncoherent_r10000(dev)) |
| 325 | __dma_sync((unsigned long)page_address(sg_page(sg)), | 325 | __dma_sync((unsigned long)page_address(sg_page(sg)), |
| 326 | sg->length, direction); | 326 | sg->length, direction); |
| 327 | plat_unmap_dma_mem(sg->dma_address); | ||
| 328 | } | 327 | } |
| 329 | } | 328 | } |
| 330 | 329 | ||
| @@ -342,7 +341,6 @@ void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nele | |||
| 342 | if (!plat_device_is_coherent(dev)) | 341 | if (!plat_device_is_coherent(dev)) |
| 343 | __dma_sync((unsigned long)page_address(sg_page(sg)), | 342 | __dma_sync((unsigned long)page_address(sg_page(sg)), |
| 344 | sg->length, direction); | 343 | sg->length, direction); |
| 345 | plat_unmap_dma_mem(sg->dma_address); | ||
| 346 | } | 344 | } |
| 347 | } | 345 | } |
| 348 | 346 | ||
diff --git a/arch/mips/nxp/pnx833x/common/Makefile b/arch/mips/nxp/pnx833x/common/Makefile new file mode 100644 index 000000000000..4a16f3b503b5 --- /dev/null +++ b/arch/mips/nxp/pnx833x/common/Makefile | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | obj-y := interrupts.o platform.o prom.o setup.o reset.o | ||
| 2 | |||
| 3 | EXTRA_CFLAGS += -Werror | ||
diff --git a/arch/mips/nxp/pnx833x/common/interrupts.c b/arch/mips/nxp/pnx833x/common/interrupts.c new file mode 100644 index 000000000000..30533ba200e2 --- /dev/null +++ b/arch/mips/nxp/pnx833x/common/interrupts.c | |||
| @@ -0,0 +1,380 @@ | |||
| 1 | /* | ||
| 2 | * interrupts.c: Interrupt mappings for PNX833X. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.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 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | */ | ||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <linux/irq.h> | ||
| 24 | #include <linux/hardirq.h> | ||
| 25 | #include <linux/interrupt.h> | ||
| 26 | #include <asm/mipsregs.h> | ||
| 27 | #include <asm/irq_cpu.h> | ||
| 28 | #include <irq.h> | ||
| 29 | #include <irq-mapping.h> | ||
| 30 | #include <gpio.h> | ||
| 31 | |||
| 32 | static int mips_cpu_timer_irq; | ||
| 33 | |||
| 34 | static const unsigned int irq_prio[PNX833X_PIC_NUM_IRQ] = | ||
| 35 | { | ||
| 36 | 0, /* unused */ | ||
| 37 | 4, /* PNX833X_PIC_I2C0_INT 1 */ | ||
| 38 | 4, /* PNX833X_PIC_I2C1_INT 2 */ | ||
| 39 | 1, /* PNX833X_PIC_UART0_INT 3 */ | ||
| 40 | 1, /* PNX833X_PIC_UART1_INT 4 */ | ||
| 41 | 6, /* PNX833X_PIC_TS_IN0_DV_INT 5 */ | ||
| 42 | 6, /* PNX833X_PIC_TS_IN0_DMA_INT 6 */ | ||
| 43 | 7, /* PNX833X_PIC_GPIO_INT 7 */ | ||
| 44 | 4, /* PNX833X_PIC_AUDIO_DEC_INT 8 */ | ||
| 45 | 5, /* PNX833X_PIC_VIDEO_DEC_INT 9 */ | ||
| 46 | 4, /* PNX833X_PIC_CONFIG_INT 10 */ | ||
| 47 | 4, /* PNX833X_PIC_AOI_INT 11 */ | ||
| 48 | 9, /* PNX833X_PIC_SYNC_INT 12 */ | ||
| 49 | 9, /* PNX8335_PIC_SATA_INT 13 */ | ||
| 50 | 4, /* PNX833X_PIC_OSD_INT 14 */ | ||
| 51 | 9, /* PNX833X_PIC_DISP1_INT 15 */ | ||
| 52 | 4, /* PNX833X_PIC_DEINTERLACER_INT 16 */ | ||
| 53 | 9, /* PNX833X_PIC_DISPLAY2_INT 17 */ | ||
| 54 | 4, /* PNX833X_PIC_VC_INT 18 */ | ||
| 55 | 4, /* PNX833X_PIC_SC_INT 19 */ | ||
| 56 | 9, /* PNX833X_PIC_IDE_INT 20 */ | ||
| 57 | 9, /* PNX833X_PIC_IDE_DMA_INT 21 */ | ||
| 58 | 6, /* PNX833X_PIC_TS_IN1_DV_INT 22 */ | ||
| 59 | 6, /* PNX833X_PIC_TS_IN1_DMA_INT 23 */ | ||
| 60 | 4, /* PNX833X_PIC_SGDX_DMA_INT 24 */ | ||
| 61 | 4, /* PNX833X_PIC_TS_OUT_INT 25 */ | ||
| 62 | 4, /* PNX833X_PIC_IR_INT 26 */ | ||
| 63 | 3, /* PNX833X_PIC_VMSP1_INT 27 */ | ||
| 64 | 3, /* PNX833X_PIC_VMSP2_INT 28 */ | ||
| 65 | 4, /* PNX833X_PIC_PIBC_INT 29 */ | ||
| 66 | 4, /* PNX833X_PIC_TS_IN0_TRD_INT 30 */ | ||
| 67 | 4, /* PNX833X_PIC_SGDX_TPD_INT 31 */ | ||
| 68 | 5, /* PNX833X_PIC_USB_INT 32 */ | ||
| 69 | 4, /* PNX833X_PIC_TS_IN1_TRD_INT 33 */ | ||
| 70 | 4, /* PNX833X_PIC_CLOCK_INT 34 */ | ||
| 71 | 4, /* PNX833X_PIC_SGDX_PARSER_INT 35 */ | ||
| 72 | 4, /* PNX833X_PIC_VMSP_DMA_INT 36 */ | ||
| 73 | #if defined(CONFIG_SOC_PNX8335) | ||
| 74 | 4, /* PNX8335_PIC_MIU_INT 37 */ | ||
| 75 | 4, /* PNX8335_PIC_AVCHIP_IRQ_INT 38 */ | ||
| 76 | 9, /* PNX8335_PIC_SYNC_HD_INT 39 */ | ||
| 77 | 9, /* PNX8335_PIC_DISP_HD_INT 40 */ | ||
| 78 | 9, /* PNX8335_PIC_DISP_SCALER_INT 41 */ | ||
| 79 | 4, /* PNX8335_PIC_OSD_HD1_INT 42 */ | ||
| 80 | 4, /* PNX8335_PIC_DTL_WRITER_Y_INT 43 */ | ||
| 81 | 4, /* PNX8335_PIC_DTL_WRITER_C_INT 44 */ | ||
| 82 | 4, /* PNX8335_PIC_DTL_EMULATOR_Y_IR_INT 45 */ | ||
| 83 | 4, /* PNX8335_PIC_DTL_EMULATOR_C_IR_INT 46 */ | ||
| 84 | 4, /* PNX8335_PIC_DENC_TTX_INT 47 */ | ||
| 85 | 4, /* PNX8335_PIC_MMI_SIF0_INT 48 */ | ||
| 86 | 4, /* PNX8335_PIC_MMI_SIF1_INT 49 */ | ||
| 87 | 4, /* PNX8335_PIC_MMI_CDMMU_INT 50 */ | ||
| 88 | 4, /* PNX8335_PIC_PIBCS_INT 51 */ | ||
| 89 | 12, /* PNX8335_PIC_ETHERNET_INT 52 */ | ||
| 90 | 3, /* PNX8335_PIC_VMSP1_0_INT 53 */ | ||
| 91 | 3, /* PNX8335_PIC_VMSP1_1_INT 54 */ | ||
| 92 | 4, /* PNX8335_PIC_VMSP1_DMA_INT 55 */ | ||
| 93 | 4, /* PNX8335_PIC_TDGR_DE_INT 56 */ | ||
| 94 | 4, /* PNX8335_PIC_IR1_IRQ_INT 57 */ | ||
| 95 | #endif | ||
| 96 | }; | ||
| 97 | |||
| 98 | static void pnx833x_timer_dispatch(void) | ||
| 99 | { | ||
| 100 | do_IRQ(mips_cpu_timer_irq); | ||
| 101 | } | ||
| 102 | |||
| 103 | static void pic_dispatch(void) | ||
| 104 | { | ||
| 105 | unsigned int irq = PNX833X_REGFIELD(PIC_INT_SRC, INT_SRC); | ||
| 106 | |||
| 107 | if ((irq >= 1) && (irq < (PNX833X_PIC_NUM_IRQ))) { | ||
| 108 | unsigned long priority = PNX833X_PIC_INT_PRIORITY; | ||
| 109 | PNX833X_PIC_INT_PRIORITY = irq_prio[irq]; | ||
| 110 | |||
| 111 | if (irq == PNX833X_PIC_GPIO_INT) { | ||
| 112 | unsigned long mask = PNX833X_PIO_INT_STATUS & PNX833X_PIO_INT_ENABLE; | ||
| 113 | int pin; | ||
| 114 | while ((pin = ffs(mask & 0xffff))) { | ||
| 115 | pin -= 1; | ||
| 116 | do_IRQ(PNX833X_GPIO_IRQ_BASE + pin); | ||
| 117 | mask &= ~(1 << pin); | ||
| 118 | } | ||
| 119 | } else { | ||
| 120 | do_IRQ(irq + PNX833X_PIC_IRQ_BASE); | ||
| 121 | } | ||
| 122 | |||
| 123 | PNX833X_PIC_INT_PRIORITY = priority; | ||
| 124 | } else { | ||
| 125 | printk(KERN_ERR "plat_irq_dispatch: unexpected irq %u\n", irq); | ||
| 126 | } | ||
| 127 | } | ||
| 128 | |||
| 129 | asmlinkage void plat_irq_dispatch(void) | ||
| 130 | { | ||
| 131 | unsigned int pending = read_c0_status() & read_c0_cause(); | ||
| 132 | |||
| 133 | if (pending & STATUSF_IP4) | ||
| 134 | pic_dispatch(); | ||
| 135 | else if (pending & STATUSF_IP7) | ||
| 136 | do_IRQ(PNX833X_TIMER_IRQ); | ||
| 137 | else | ||
| 138 | spurious_interrupt(); | ||
| 139 | } | ||
| 140 | |||
| 141 | static inline void pnx833x_hard_enable_pic_irq(unsigned int irq) | ||
| 142 | { | ||
| 143 | /* Currently we do this by setting IRQ priority to 1. | ||
| 144 | If priority support is being implemented, 1 should be repalced | ||
| 145 | by a better value. */ | ||
| 146 | PNX833X_PIC_INT_REG(irq) = irq_prio[irq]; | ||
| 147 | } | ||
| 148 | |||
| 149 | static inline void pnx833x_hard_disable_pic_irq(unsigned int irq) | ||
| 150 | { | ||
| 151 | /* Disable IRQ by writing setting it's priority to 0 */ | ||
| 152 | PNX833X_PIC_INT_REG(irq) = 0; | ||
| 153 | } | ||
| 154 | |||
| 155 | static int irqflags[PNX833X_PIC_NUM_IRQ]; /* initialized by zeroes */ | ||
| 156 | #define IRQFLAG_STARTED 1 | ||
| 157 | #define IRQFLAG_DISABLED 2 | ||
| 158 | |||
| 159 | static DEFINE_SPINLOCK(pnx833x_irq_lock); | ||
| 160 | |||
| 161 | static unsigned int pnx833x_startup_pic_irq(unsigned int irq) | ||
| 162 | { | ||
| 163 | unsigned long flags; | ||
| 164 | unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE; | ||
| 165 | |||
| 166 | spin_lock_irqsave(&pnx833x_irq_lock, flags); | ||
| 167 | |||
| 168 | irqflags[pic_irq] = IRQFLAG_STARTED; /* started, not disabled */ | ||
| 169 | pnx833x_hard_enable_pic_irq(pic_irq); | ||
| 170 | |||
| 171 | spin_unlock_irqrestore(&pnx833x_irq_lock, flags); | ||
| 172 | return 0; | ||
| 173 | } | ||
| 174 | |||
| 175 | static void pnx833x_shutdown_pic_irq(unsigned int irq) | ||
| 176 | { | ||
| 177 | unsigned long flags; | ||
| 178 | unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE; | ||
| 179 | |||
| 180 | spin_lock_irqsave(&pnx833x_irq_lock, flags); | ||
| 181 | |||
| 182 | irqflags[pic_irq] = 0; /* not started */ | ||
| 183 | pnx833x_hard_disable_pic_irq(pic_irq); | ||
| 184 | |||
| 185 | spin_unlock_irqrestore(&pnx833x_irq_lock, flags); | ||
| 186 | } | ||
| 187 | |||
| 188 | static void pnx833x_enable_pic_irq(unsigned int irq) | ||
| 189 | { | ||
| 190 | unsigned long flags; | ||
| 191 | unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE; | ||
| 192 | |||
| 193 | spin_lock_irqsave(&pnx833x_irq_lock, flags); | ||
| 194 | |||
| 195 | irqflags[pic_irq] &= ~IRQFLAG_DISABLED; | ||
| 196 | if (irqflags[pic_irq] == IRQFLAG_STARTED) | ||
| 197 | pnx833x_hard_enable_pic_irq(pic_irq); | ||
| 198 | |||
| 199 | spin_unlock_irqrestore(&pnx833x_irq_lock, flags); | ||
| 200 | } | ||
| 201 | |||
| 202 | static void pnx833x_disable_pic_irq(unsigned int irq) | ||
| 203 | { | ||
| 204 | unsigned long flags; | ||
| 205 | unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE; | ||
| 206 | |||
| 207 | spin_lock_irqsave(&pnx833x_irq_lock, flags); | ||
| 208 | |||
| 209 | irqflags[pic_irq] |= IRQFLAG_DISABLED; | ||
| 210 | pnx833x_hard_disable_pic_irq(pic_irq); | ||
| 211 | |||
| 212 | spin_unlock_irqrestore(&pnx833x_irq_lock, flags); | ||
| 213 | } | ||
| 214 | |||
| 215 | static void pnx833x_ack_pic_irq(unsigned int irq) | ||
| 216 | { | ||
| 217 | } | ||
| 218 | |||
| 219 | static void pnx833x_end_pic_irq(unsigned int irq) | ||
| 220 | { | ||
| 221 | } | ||
| 222 | |||
| 223 | static DEFINE_SPINLOCK(pnx833x_gpio_pnx833x_irq_lock); | ||
| 224 | |||
| 225 | static unsigned int pnx833x_startup_gpio_irq(unsigned int irq) | ||
| 226 | { | ||
| 227 | int pin = irq - PNX833X_GPIO_IRQ_BASE; | ||
| 228 | unsigned long flags; | ||
| 229 | spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 230 | pnx833x_gpio_enable_irq(pin); | ||
| 231 | spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 232 | return 0; | ||
| 233 | } | ||
| 234 | |||
| 235 | static void pnx833x_enable_gpio_irq(unsigned int irq) | ||
| 236 | { | ||
| 237 | int pin = irq - PNX833X_GPIO_IRQ_BASE; | ||
| 238 | unsigned long flags; | ||
| 239 | spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 240 | pnx833x_gpio_enable_irq(pin); | ||
| 241 | spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 242 | } | ||
| 243 | |||
| 244 | static void pnx833x_disable_gpio_irq(unsigned int irq) | ||
| 245 | { | ||
| 246 | int pin = irq - PNX833X_GPIO_IRQ_BASE; | ||
| 247 | unsigned long flags; | ||
| 248 | spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 249 | pnx833x_gpio_disable_irq(pin); | ||
| 250 | spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 251 | } | ||
| 252 | |||
| 253 | static void pnx833x_ack_gpio_irq(unsigned int irq) | ||
| 254 | { | ||
| 255 | } | ||
| 256 | |||
| 257 | static void pnx833x_end_gpio_irq(unsigned int irq) | ||
| 258 | { | ||
| 259 | int pin = irq - PNX833X_GPIO_IRQ_BASE; | ||
| 260 | unsigned long flags; | ||
| 261 | spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 262 | pnx833x_gpio_clear_irq(pin); | ||
| 263 | spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags); | ||
| 264 | } | ||
| 265 | |||
| 266 | static int pnx833x_set_type_gpio_irq(unsigned int irq, unsigned int flow_type) | ||
| 267 | { | ||
| 268 | int pin = irq - PNX833X_GPIO_IRQ_BASE; | ||
| 269 | int gpio_mode; | ||
| 270 | |||
| 271 | switch (flow_type) { | ||
| 272 | case IRQ_TYPE_EDGE_RISING: | ||
| 273 | gpio_mode = GPIO_INT_EDGE_RISING; | ||
| 274 | break; | ||
| 275 | case IRQ_TYPE_EDGE_FALLING: | ||
| 276 | gpio_mode = GPIO_INT_EDGE_FALLING; | ||
| 277 | break; | ||
| 278 | case IRQ_TYPE_EDGE_BOTH: | ||
| 279 | gpio_mode = GPIO_INT_EDGE_BOTH; | ||
| 280 | break; | ||
| 281 | case IRQ_TYPE_LEVEL_HIGH: | ||
| 282 | gpio_mode = GPIO_INT_LEVEL_HIGH; | ||
| 283 | break; | ||
| 284 | case IRQ_TYPE_LEVEL_LOW: | ||
| 285 | gpio_mode = GPIO_INT_LEVEL_LOW; | ||
| 286 | break; | ||
| 287 | default: | ||
| 288 | gpio_mode = GPIO_INT_NONE; | ||
| 289 | break; | ||
| 290 | } | ||
| 291 | |||
| 292 | pnx833x_gpio_setup_irq(gpio_mode, pin); | ||
| 293 | |||
| 294 | return 0; | ||
| 295 | } | ||
| 296 | |||
| 297 | static struct irq_chip pnx833x_pic_irq_type = { | ||
| 298 | .typename = "PNX-PIC", | ||
| 299 | .startup = pnx833x_startup_pic_irq, | ||
| 300 | .shutdown = pnx833x_shutdown_pic_irq, | ||
| 301 | .enable = pnx833x_enable_pic_irq, | ||
| 302 | .disable = pnx833x_disable_pic_irq, | ||
| 303 | .ack = pnx833x_ack_pic_irq, | ||
| 304 | .end = pnx833x_end_pic_irq | ||
| 305 | }; | ||
| 306 | |||
| 307 | static struct irq_chip pnx833x_gpio_irq_type = { | ||
| 308 | .typename = "PNX-GPIO", | ||
| 309 | .startup = pnx833x_startup_gpio_irq, | ||
| 310 | .shutdown = pnx833x_disable_gpio_irq, | ||
| 311 | .enable = pnx833x_enable_gpio_irq, | ||
| 312 | .disable = pnx833x_disable_gpio_irq, | ||
| 313 | .ack = pnx833x_ack_gpio_irq, | ||
| 314 | .end = pnx833x_end_gpio_irq, | ||
| 315 | .set_type = pnx833x_set_type_gpio_irq | ||
| 316 | }; | ||
| 317 | |||
| 318 | void __init arch_init_irq(void) | ||
| 319 | { | ||
| 320 | unsigned int irq; | ||
| 321 | |||
| 322 | /* setup standard internal cpu irqs */ | ||
| 323 | mips_cpu_irq_init(); | ||
| 324 | |||
| 325 | /* Set IRQ information in irq_desc */ | ||
| 326 | for (irq = PNX833X_PIC_IRQ_BASE; irq < (PNX833X_PIC_IRQ_BASE + PNX833X_PIC_NUM_IRQ); irq++) { | ||
| 327 | pnx833x_hard_disable_pic_irq(irq); | ||
| 328 | set_irq_chip_and_handler(irq, &pnx833x_pic_irq_type, handle_simple_irq); | ||
| 329 | } | ||
| 330 | |||
| 331 | for (irq = PNX833X_GPIO_IRQ_BASE; irq < (PNX833X_GPIO_IRQ_BASE + PNX833X_GPIO_NUM_IRQ); irq++) | ||
| 332 | set_irq_chip_and_handler(irq, &pnx833x_gpio_irq_type, handle_simple_irq); | ||
| 333 | |||
| 334 | /* Set PIC priority limiter register to 0 */ | ||
| 335 | PNX833X_PIC_INT_PRIORITY = 0; | ||
| 336 | |||
| 337 | /* Setup GPIO IRQ dispatching */ | ||
| 338 | pnx833x_startup_pic_irq(PNX833X_PIC_GPIO_INT); | ||
| 339 | |||
| 340 | /* Enable PIC IRQs (HWIRQ2) */ | ||
| 341 | if (cpu_has_vint) | ||
| 342 | set_vi_handler(4, pic_dispatch); | ||
| 343 | |||
| 344 | write_c0_status(read_c0_status() | IE_IRQ2); | ||
| 345 | } | ||
| 346 | |||
| 347 | unsigned int __cpuinit get_c0_compare_int(void) | ||
| 348 | { | ||
| 349 | if (cpu_has_vint) | ||
| 350 | set_vi_handler(cp0_compare_irq, pnx833x_timer_dispatch); | ||
| 351 | |||
| 352 | mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; | ||
| 353 | return mips_cpu_timer_irq; | ||
| 354 | } | ||
| 355 | |||
| 356 | void __init plat_time_init(void) | ||
| 357 | { | ||
| 358 | /* calculate mips_hpt_frequency based on PNX833X_CLOCK_CPUCP_CTL reg */ | ||
| 359 | |||
| 360 | extern unsigned long mips_hpt_frequency; | ||
| 361 | unsigned long reg = PNX833X_CLOCK_CPUCP_CTL; | ||
| 362 | |||
| 363 | if (!(PNX833X_BIT(reg, CLOCK_CPUCP_CTL, EXIT_RESET))) { | ||
| 364 | /* Functional clock is disabled so use crystal frequency */ | ||
| 365 | mips_hpt_frequency = 25; | ||
| 366 | } else { | ||
| 367 | #if defined(CONFIG_SOC_PNX8335) | ||
| 368 | /* Functional clock is enabled, so get clock multiplier */ | ||
| 369 | mips_hpt_frequency = 90 + (10 * PNX8335_REGFIELD(CLOCK_PLL_CPU_CTL, FREQ)); | ||
| 370 | #else | ||
| 371 | static const unsigned long int freq[4] = {240, 160, 120, 80}; | ||
| 372 | mips_hpt_frequency = freq[PNX833X_FIELD(reg, CLOCK_CPUCP_CTL, DIV_CLOCK)]; | ||
| 373 | #endif | ||
| 374 | } | ||
| 375 | |||
| 376 | printk(KERN_INFO "CPU clock is %ld MHz\n", mips_hpt_frequency); | ||
| 377 | |||
| 378 | mips_hpt_frequency *= 500000; | ||
| 379 | } | ||
| 380 | |||
diff --git a/arch/mips/nxp/pnx833x/common/platform.c b/arch/mips/nxp/pnx833x/common/platform.c new file mode 100644 index 000000000000..b1ccbcc18f78 --- /dev/null +++ b/arch/mips/nxp/pnx833x/common/platform.c | |||
| @@ -0,0 +1,319 @@ | |||
| 1 | /* | ||
| 2 | * platform.c: platform support for PNX833X. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.com> | ||
| 7 | * | ||
| 8 | * Based on software written by: | ||
| 9 | * Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | */ | ||
| 25 | #include <linux/device.h> | ||
| 26 | #include <linux/dma-mapping.h> | ||
| 27 | #include <linux/platform_device.h> | ||
| 28 | #include <linux/kernel.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/resource.h> | ||
| 31 | #include <linux/serial.h> | ||
| 32 | #include <linux/serial_pnx8xxx.h> | ||
| 33 | #include <linux/mtd/nand.h> | ||
| 34 | #include <linux/mtd/partitions.h> | ||
| 35 | |||
| 36 | #ifdef CONFIG_I2C_PNX0105 | ||
| 37 | /* Until i2c driver available in kernel.*/ | ||
| 38 | #include <linux/i2c-pnx0105.h> | ||
| 39 | #endif | ||
| 40 | |||
| 41 | #include <irq.h> | ||
| 42 | #include <irq-mapping.h> | ||
| 43 | #include <pnx833x.h> | ||
| 44 | |||
| 45 | static u64 uart_dmamask = DMA_32BIT_MASK; | ||
| 46 | |||
| 47 | static struct resource pnx833x_uart_resources[] = { | ||
| 48 | [0] = { | ||
| 49 | .start = PNX833X_UART0_PORTS_START, | ||
| 50 | .end = PNX833X_UART0_PORTS_END, | ||
| 51 | .flags = IORESOURCE_MEM, | ||
| 52 | }, | ||
| 53 | [1] = { | ||
| 54 | .start = PNX833X_PIC_UART0_INT, | ||
| 55 | .end = PNX833X_PIC_UART0_INT, | ||
| 56 | .flags = IORESOURCE_IRQ, | ||
| 57 | }, | ||
| 58 | [2] = { | ||
| 59 | .start = PNX833X_UART1_PORTS_START, | ||
| 60 | .end = PNX833X_UART1_PORTS_END, | ||
| 61 | .flags = IORESOURCE_MEM, | ||
| 62 | }, | ||
| 63 | [3] = { | ||
| 64 | .start = PNX833X_PIC_UART1_INT, | ||
| 65 | .end = PNX833X_PIC_UART1_INT, | ||
| 66 | .flags = IORESOURCE_IRQ, | ||
| 67 | }, | ||
| 68 | }; | ||
| 69 | |||
| 70 | struct pnx8xxx_port pnx8xxx_ports[] = { | ||
| 71 | [0] = { | ||
| 72 | .port = { | ||
| 73 | .type = PORT_PNX8XXX, | ||
| 74 | .iotype = UPIO_MEM, | ||
| 75 | .membase = (void __iomem *)PNX833X_UART0_PORTS_START, | ||
| 76 | .mapbase = PNX833X_UART0_PORTS_START, | ||
| 77 | .irq = PNX833X_PIC_UART0_INT, | ||
| 78 | .uartclk = 3692300, | ||
| 79 | .fifosize = 16, | ||
| 80 | .flags = UPF_BOOT_AUTOCONF, | ||
| 81 | .line = 0, | ||
| 82 | }, | ||
| 83 | }, | ||
| 84 | [1] = { | ||
| 85 | .port = { | ||
| 86 | .type = PORT_PNX8XXX, | ||
| 87 | .iotype = UPIO_MEM, | ||
| 88 | .membase = (void __iomem *)PNX833X_UART1_PORTS_START, | ||
| 89 | .mapbase = PNX833X_UART1_PORTS_START, | ||
| 90 | .irq = PNX833X_PIC_UART1_INT, | ||
| 91 | .uartclk = 3692300, | ||
| 92 | .fifosize = 16, | ||
| 93 | .flags = UPF_BOOT_AUTOCONF, | ||
| 94 | .line = 1, | ||
| 95 | }, | ||
| 96 | }, | ||
| 97 | }; | ||
| 98 | |||
| 99 | static struct platform_device pnx833x_uart_device = { | ||
| 100 | .name = "pnx8xxx-uart", | ||
| 101 | .id = -1, | ||
| 102 | .dev = { | ||
| 103 | .dma_mask = &uart_dmamask, | ||
| 104 | .coherent_dma_mask = DMA_32BIT_MASK, | ||
| 105 | .platform_data = pnx8xxx_ports, | ||
| 106 | }, | ||
| 107 | .num_resources = ARRAY_SIZE(pnx833x_uart_resources), | ||
| 108 | .resource = pnx833x_uart_resources, | ||
| 109 | }; | ||
| 110 | |||
| 111 | static u64 ehci_dmamask = DMA_32BIT_MASK; | ||
| 112 | |||
| 113 | static struct resource pnx833x_usb_ehci_resources[] = { | ||
| 114 | [0] = { | ||
| 115 | .start = PNX833X_USB_PORTS_START, | ||
| 116 | .end = PNX833X_USB_PORTS_END, | ||
| 117 | .flags = IORESOURCE_MEM, | ||
| 118 | }, | ||
| 119 | [1] = { | ||
| 120 | .start = PNX833X_PIC_USB_INT, | ||
| 121 | .end = PNX833X_PIC_USB_INT, | ||
| 122 | .flags = IORESOURCE_IRQ, | ||
| 123 | }, | ||
| 124 | }; | ||
| 125 | |||
| 126 | static struct platform_device pnx833x_usb_ehci_device = { | ||
| 127 | .name = "pnx833x-ehci", | ||
| 128 | .id = -1, | ||
| 129 | .dev = { | ||
| 130 | .dma_mask = &ehci_dmamask, | ||
| 131 | .coherent_dma_mask = DMA_32BIT_MASK, | ||
| 132 | }, | ||
| 133 | .num_resources = ARRAY_SIZE(pnx833x_usb_ehci_resources), | ||
| 134 | .resource = pnx833x_usb_ehci_resources, | ||
| 135 | }; | ||
| 136 | |||
| 137 | #ifdef CONFIG_I2C_PNX0105 | ||
| 138 | static struct resource pnx833x_i2c0_resources[] = { | ||
| 139 | { | ||
| 140 | .start = PNX833X_I2C0_PORTS_START, | ||
| 141 | .end = PNX833X_I2C0_PORTS_END, | ||
| 142 | .flags = IORESOURCE_MEM, | ||
| 143 | }, | ||
| 144 | { | ||
| 145 | .start = PNX833X_PIC_I2C0_INT, | ||
| 146 | .end = PNX833X_PIC_I2C0_INT, | ||
| 147 | .flags = IORESOURCE_IRQ, | ||
| 148 | }, | ||
| 149 | }; | ||
| 150 | |||
| 151 | static struct resource pnx833x_i2c1_resources[] = { | ||
| 152 | { | ||
| 153 | .start = PNX833X_I2C1_PORTS_START, | ||
| 154 | .end = PNX833X_I2C1_PORTS_END, | ||
| 155 | .flags = IORESOURCE_MEM, | ||
| 156 | }, | ||
| 157 | { | ||
| 158 | .start = PNX833X_PIC_I2C1_INT, | ||
| 159 | .end = PNX833X_PIC_I2C1_INT, | ||
| 160 | .flags = IORESOURCE_IRQ, | ||
| 161 | }, | ||
| 162 | }; | ||
| 163 | |||
| 164 | static struct i2c_pnx0105_dev pnx833x_i2c_dev[] = { | ||
| 165 | { | ||
| 166 | .base = PNX833X_I2C0_PORTS_START, | ||
| 167 | .irq = -1, /* should be PNX833X_PIC_I2C0_INT but polling is faster */ | ||
| 168 | .clock = 6, /* 0 == 400 kHz, 4 == 100 kHz(Maximum HDMI), 6 = 50kHz(Prefered HDCP) */ | ||
| 169 | .bus_addr = 0, /* no slave support */ | ||
| 170 | }, | ||
| 171 | { | ||
| 172 | .base = PNX833X_I2C1_PORTS_START, | ||
| 173 | .irq = -1, /* on high freq, polling is faster */ | ||
| 174 | /*.irq = PNX833X_PIC_I2C1_INT,*/ | ||
| 175 | .clock = 4, /* 0 == 400 kHz, 4 == 100 kHz. 100 kHz seems a safe default for now */ | ||
| 176 | .bus_addr = 0, /* no slave support */ | ||
| 177 | }, | ||
| 178 | }; | ||
| 179 | |||
| 180 | static struct platform_device pnx833x_i2c0_device = { | ||
| 181 | .name = "i2c-pnx0105", | ||
| 182 | .id = 0, | ||
| 183 | .dev = { | ||
| 184 | .platform_data = &pnx833x_i2c_dev[0], | ||
| 185 | }, | ||
| 186 | .num_resources = ARRAY_SIZE(pnx833x_i2c0_resources), | ||
| 187 | .resource = pnx833x_i2c0_resources, | ||
| 188 | }; | ||
| 189 | |||
| 190 | static struct platform_device pnx833x_i2c1_device = { | ||
| 191 | .name = "i2c-pnx0105", | ||
| 192 | .id = 1, | ||
| 193 | .dev = { | ||
| 194 | .platform_data = &pnx833x_i2c_dev[1], | ||
| 195 | }, | ||
| 196 | .num_resources = ARRAY_SIZE(pnx833x_i2c1_resources), | ||
| 197 | .resource = pnx833x_i2c1_resources, | ||
| 198 | }; | ||
| 199 | #endif | ||
| 200 | |||
| 201 | static u64 ethernet_dmamask = DMA_32BIT_MASK; | ||
| 202 | |||
| 203 | static struct resource pnx833x_ethernet_resources[] = { | ||
| 204 | [0] = { | ||
| 205 | .start = PNX8335_IP3902_PORTS_START, | ||
| 206 | .end = PNX8335_IP3902_PORTS_END, | ||
| 207 | .flags = IORESOURCE_MEM, | ||
| 208 | }, | ||
| 209 | [1] = { | ||
| 210 | .start = PNX8335_PIC_ETHERNET_INT, | ||
| 211 | .end = PNX8335_PIC_ETHERNET_INT, | ||
| 212 | .flags = IORESOURCE_IRQ, | ||
| 213 | }, | ||
| 214 | }; | ||
| 215 | |||
| 216 | static struct platform_device pnx833x_ethernet_device = { | ||
| 217 | .name = "ip3902-eth", | ||
| 218 | .id = -1, | ||
| 219 | .dev = { | ||
| 220 | .dma_mask = ðernet_dmamask, | ||
| 221 | .coherent_dma_mask = DMA_32BIT_MASK, | ||
| 222 | }, | ||
| 223 | .num_resources = ARRAY_SIZE(pnx833x_ethernet_resources), | ||
| 224 | .resource = pnx833x_ethernet_resources, | ||
| 225 | }; | ||
| 226 | |||
| 227 | static struct resource pnx833x_sata_resources[] = { | ||
| 228 | [0] = { | ||
| 229 | .start = PNX8335_SATA_PORTS_START, | ||
| 230 | .end = PNX8335_SATA_PORTS_END, | ||
| 231 | .flags = IORESOURCE_MEM, | ||
| 232 | }, | ||
| 233 | [1] = { | ||
| 234 | .start = PNX8335_PIC_SATA_INT, | ||
| 235 | .end = PNX8335_PIC_SATA_INT, | ||
| 236 | .flags = IORESOURCE_IRQ, | ||
| 237 | }, | ||
| 238 | }; | ||
| 239 | |||
| 240 | static struct platform_device pnx833x_sata_device = { | ||
| 241 | .name = "pnx833x-sata", | ||
| 242 | .id = -1, | ||
| 243 | .num_resources = ARRAY_SIZE(pnx833x_sata_resources), | ||
| 244 | .resource = pnx833x_sata_resources, | ||
| 245 | }; | ||
| 246 | |||
| 247 | static const char *part_probes[] = { | ||
| 248 | "cmdlinepart", | ||
| 249 | NULL | ||
| 250 | }; | ||
| 251 | |||
| 252 | static void | ||
| 253 | pnx833x_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) | ||
| 254 | { | ||
| 255 | struct nand_chip *this = mtd->priv; | ||
| 256 | unsigned long nandaddr = (unsigned long)this->IO_ADDR_W; | ||
| 257 | |||
| 258 | if (cmd == NAND_CMD_NONE) | ||
| 259 | return; | ||
| 260 | |||
| 261 | if (ctrl & NAND_CLE) | ||
| 262 | writeb(cmd, (void __iomem *)(nandaddr + PNX8335_NAND_CLE_MASK)); | ||
| 263 | else | ||
| 264 | writeb(cmd, (void __iomem *)(nandaddr + PNX8335_NAND_ALE_MASK)); | ||
| 265 | } | ||
| 266 | |||
| 267 | static struct platform_nand_data pnx833x_flash_nand_data = { | ||
| 268 | .chip = { | ||
| 269 | .chip_delay = 25, | ||
| 270 | .part_probe_types = part_probes, | ||
| 271 | }, | ||
| 272 | .ctrl = { | ||
| 273 | .cmd_ctrl = pnx833x_flash_nand_cmd_ctrl | ||
| 274 | } | ||
| 275 | }; | ||
| 276 | |||
| 277 | /* | ||
| 278 | * Set start to be the correct address (PNX8335_NAND_BASE with no 0xb!!), | ||
| 279 | * 12 bytes more seems to be the standard that allows for NAND access. | ||
| 280 | */ | ||
| 281 | static struct resource pnx833x_flash_nand_resource = { | ||
| 282 | .start = PNX8335_NAND_BASE, | ||
| 283 | .end = PNX8335_NAND_BASE + 12, | ||
| 284 | .flags = IORESOURCE_MEM, | ||
| 285 | }; | ||
| 286 | |||
| 287 | static struct platform_device pnx833x_flash_nand = { | ||
| 288 | .name = "gen_nand", | ||
| 289 | .id = -1, | ||
| 290 | .num_resources = 1, | ||
| 291 | .resource = &pnx833x_flash_nand_resource, | ||
| 292 | .dev = { | ||
| 293 | .platform_data = &pnx833x_flash_nand_data, | ||
| 294 | }, | ||
| 295 | }; | ||
| 296 | |||
| 297 | static struct platform_device *pnx833x_platform_devices[] __initdata = { | ||
| 298 | &pnx833x_uart_device, | ||
| 299 | &pnx833x_usb_ehci_device, | ||
| 300 | #ifdef CONFIG_I2C_PNX0105 | ||
| 301 | &pnx833x_i2c0_device, | ||
| 302 | &pnx833x_i2c1_device, | ||
| 303 | #endif | ||
| 304 | &pnx833x_ethernet_device, | ||
| 305 | &pnx833x_sata_device, | ||
| 306 | &pnx833x_flash_nand, | ||
| 307 | }; | ||
| 308 | |||
| 309 | static int __init pnx833x_platform_init(void) | ||
| 310 | { | ||
| 311 | int res; | ||
| 312 | |||
| 313 | res = platform_add_devices(pnx833x_platform_devices, | ||
| 314 | ARRAY_SIZE(pnx833x_platform_devices)); | ||
| 315 | |||
| 316 | return res; | ||
| 317 | } | ||
| 318 | |||
| 319 | arch_initcall(pnx833x_platform_init); | ||
diff --git a/arch/mips/nxp/pnx833x/common/prom.c b/arch/mips/nxp/pnx833x/common/prom.c new file mode 100644 index 000000000000..2a41e8fec210 --- /dev/null +++ b/arch/mips/nxp/pnx833x/common/prom.c | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | /* | ||
| 2 | * prom.c: | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.com> | ||
| 7 | * | ||
| 8 | * Based on software written by: | ||
| 9 | * Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | */ | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <asm/bootinfo.h> | ||
| 27 | #include <linux/string.h> | ||
| 28 | |||
| 29 | void __init prom_init_cmdline(void) | ||
| 30 | { | ||
| 31 | int argc = fw_arg0; | ||
| 32 | char **argv = (char **)fw_arg1; | ||
| 33 | char *c = &(arcs_cmdline[0]); | ||
| 34 | int i; | ||
| 35 | |||
| 36 | for (i = 1; i < argc; i++) { | ||
| 37 | strcpy(c, argv[i]); | ||
| 38 | c += strlen(argv[i]); | ||
| 39 | if (i < argc-1) | ||
| 40 | *c++ = ' '; | ||
| 41 | } | ||
| 42 | *c = 0; | ||
| 43 | } | ||
| 44 | |||
| 45 | char __init *prom_getenv(char *envname) | ||
| 46 | { | ||
| 47 | extern char **prom_envp; | ||
| 48 | char **env = prom_envp; | ||
| 49 | int i; | ||
| 50 | |||
| 51 | i = strlen(envname); | ||
| 52 | |||
| 53 | while (*env) { | ||
| 54 | if (strncmp(envname, *env, i) == 0 && *(*env+i) == '=') | ||
| 55 | return *env + i + 1; | ||
| 56 | env++; | ||
| 57 | } | ||
| 58 | |||
| 59 | return 0; | ||
| 60 | } | ||
| 61 | |||
| 62 | void __init prom_free_prom_memory(void) | ||
| 63 | { | ||
| 64 | } | ||
| 65 | |||
| 66 | char * __init prom_getcmdline(void) | ||
| 67 | { | ||
| 68 | return arcs_cmdline; | ||
| 69 | } | ||
| 70 | |||
diff --git a/arch/mips/nxp/pnx833x/common/reset.c b/arch/mips/nxp/pnx833x/common/reset.c new file mode 100644 index 000000000000..a9bc9bacad2b --- /dev/null +++ b/arch/mips/nxp/pnx833x/common/reset.c | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* | ||
| 2 | * reset.c: reset support for PNX833X. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.com> | ||
| 7 | * | ||
| 8 | * Based on software written by: | ||
| 9 | * Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | */ | ||
| 25 | #include <linux/slab.h> | ||
| 26 | #include <linux/reboot.h> | ||
| 27 | #include <pnx833x.h> | ||
| 28 | |||
| 29 | void pnx833x_machine_restart(char *command) | ||
| 30 | { | ||
| 31 | PNX833X_RESET_CONTROL_2 = 0; | ||
| 32 | PNX833X_RESET_CONTROL = 0; | ||
| 33 | } | ||
| 34 | |||
| 35 | void pnx833x_machine_halt(void) | ||
| 36 | { | ||
| 37 | while (1) | ||
| 38 | __asm__ __volatile__ ("wait"); | ||
| 39 | |||
| 40 | } | ||
| 41 | |||
| 42 | void pnx833x_machine_power_off(void) | ||
| 43 | { | ||
| 44 | pnx833x_machine_halt(); | ||
| 45 | } | ||
diff --git a/arch/mips/nxp/pnx833x/common/setup.c b/arch/mips/nxp/pnx833x/common/setup.c new file mode 100644 index 000000000000..e51fbc4b644d --- /dev/null +++ b/arch/mips/nxp/pnx833x/common/setup.c | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | /* | ||
| 2 | * setup.c: Setup PNX833X Soc. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.com> | ||
| 7 | * | ||
| 8 | * Based on software written by: | ||
| 9 | * Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | */ | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <linux/interrupt.h> | ||
| 27 | #include <linux/ioport.h> | ||
| 28 | #include <linux/io.h> | ||
| 29 | #include <linux/pci.h> | ||
| 30 | #include <asm/reboot.h> | ||
| 31 | #include <pnx833x.h> | ||
| 32 | #include <gpio.h> | ||
| 33 | |||
| 34 | extern void pnx833x_board_setup(void); | ||
| 35 | extern void pnx833x_machine_restart(char *); | ||
| 36 | extern void pnx833x_machine_halt(void); | ||
| 37 | extern void pnx833x_machine_power_off(void); | ||
| 38 | |||
| 39 | int __init plat_mem_setup(void) | ||
| 40 | { | ||
| 41 | /* fake pci bus to avoid bounce buffers */ | ||
| 42 | PCI_DMA_BUS_IS_PHYS = 1; | ||
| 43 | |||
| 44 | /* set mips clock to 320MHz */ | ||
| 45 | #if defined(CONFIG_SOC_PNX8335) | ||
| 46 | PNX8335_WRITEFIELD(0x17, CLOCK_PLL_CPU_CTL, FREQ); | ||
| 47 | #endif | ||
| 48 | pnx833x_gpio_init(); /* so it will be ready in board_setup() */ | ||
| 49 | |||
| 50 | pnx833x_board_setup(); | ||
| 51 | |||
| 52 | _machine_restart = pnx833x_machine_restart; | ||
| 53 | _machine_halt = pnx833x_machine_halt; | ||
| 54 | pm_power_off = pnx833x_machine_power_off; | ||
| 55 | |||
| 56 | /* IO/MEM resources. */ | ||
| 57 | set_io_port_base(KSEG1); | ||
| 58 | ioport_resource.start = 0; | ||
| 59 | ioport_resource.end = ~0; | ||
| 60 | iomem_resource.start = 0; | ||
| 61 | iomem_resource.end = ~0; | ||
| 62 | |||
| 63 | return 0; | ||
| 64 | } | ||
diff --git a/arch/mips/nxp/pnx833x/stb22x/Makefile b/arch/mips/nxp/pnx833x/stb22x/Makefile new file mode 100644 index 000000000000..f81c5801f455 --- /dev/null +++ b/arch/mips/nxp/pnx833x/stb22x/Makefile | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | lib-y := board.o | ||
| 2 | |||
| 3 | EXTRA_CFLAGS += -Werror | ||
diff --git a/arch/mips/nxp/pnx833x/stb22x/board.c b/arch/mips/nxp/pnx833x/stb22x/board.c new file mode 100644 index 000000000000..90cc604bdadf --- /dev/null +++ b/arch/mips/nxp/pnx833x/stb22x/board.c | |||
| @@ -0,0 +1,133 @@ | |||
| 1 | /* | ||
| 2 | * board.c: STB225 board support. | ||
| 3 | * | ||
| 4 | * Copyright 2008 NXP Semiconductors | ||
| 5 | * Chris Steel <chris.steel@nxp.com> | ||
| 6 | * Daniel Laird <daniel.j.laird@nxp.com> | ||
| 7 | * | ||
| 8 | * Based on software written by: | ||
| 9 | * Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or modify | ||
| 12 | * it under the terms of the GNU General Public License as published by | ||
| 13 | * the Free Software Foundation; either version 2 of the License, or | ||
| 14 | * (at your option) any later version. | ||
| 15 | * | ||
| 16 | * This program is distributed in the hope that it will be useful, | ||
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | * GNU General Public License for more details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | */ | ||
| 25 | #include <linux/init.h> | ||
| 26 | #include <asm/bootinfo.h> | ||
| 27 | #include <linux/mm.h> | ||
| 28 | #include <pnx833x.h> | ||
| 29 | #include <gpio.h> | ||
| 30 | |||
| 31 | /* endianess twiddlers */ | ||
| 32 | #define PNX8335_DEBUG0 0x4400 | ||
| 33 | #define PNX8335_DEBUG1 0x4404 | ||
| 34 | #define PNX8335_DEBUG2 0x4408 | ||
| 35 | #define PNX8335_DEBUG3 0x440c | ||
| 36 | #define PNX8335_DEBUG4 0x4410 | ||
| 37 | #define PNX8335_DEBUG5 0x4414 | ||
| 38 | #define PNX8335_DEBUG6 0x4418 | ||
| 39 | #define PNX8335_DEBUG7 0x441c | ||
| 40 | |||
| 41 | int prom_argc; | ||
| 42 | char **prom_argv = 0, **prom_envp = 0; | ||
| 43 | |||
| 44 | extern void prom_init_cmdline(void); | ||
| 45 | extern char *prom_getenv(char *envname); | ||
| 46 | |||
| 47 | const char *get_system_type(void) | ||
| 48 | { | ||
| 49 | return "NXP STB22x"; | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline unsigned long env_or_default(char *env, unsigned long dfl) | ||
| 53 | { | ||
| 54 | char *str = prom_getenv(env); | ||
| 55 | return str ? simple_strtol(str, 0, 0) : dfl; | ||
| 56 | } | ||
| 57 | |||
| 58 | void __init prom_init(void) | ||
| 59 | { | ||
| 60 | unsigned long memsize; | ||
| 61 | |||
| 62 | prom_argc = fw_arg0; | ||
| 63 | prom_argv = (char **)fw_arg1; | ||
| 64 | prom_envp = (char **)fw_arg2; | ||
| 65 | |||
| 66 | prom_init_cmdline(); | ||
| 67 | |||
| 68 | memsize = env_or_default("memsize", 0x02000000); | ||
| 69 | add_memory_region(0, memsize, BOOT_MEM_RAM); | ||
| 70 | } | ||
| 71 | |||
| 72 | void __init pnx833x_board_setup(void) | ||
| 73 | { | ||
| 74 | pnx833x_gpio_select_function_alt(4); | ||
| 75 | pnx833x_gpio_select_output(4); | ||
| 76 | pnx833x_gpio_select_function_alt(5); | ||
| 77 | pnx833x_gpio_select_input(5); | ||
| 78 | pnx833x_gpio_select_function_alt(6); | ||
| 79 | pnx833x_gpio_select_input(6); | ||
| 80 | pnx833x_gpio_select_function_alt(7); | ||
| 81 | pnx833x_gpio_select_output(7); | ||
| 82 | |||
| 83 | pnx833x_gpio_select_function_alt(25); | ||
| 84 | pnx833x_gpio_select_function_alt(26); | ||
| 85 | |||
| 86 | pnx833x_gpio_select_function_alt(27); | ||
| 87 | pnx833x_gpio_select_function_alt(28); | ||
| 88 | pnx833x_gpio_select_function_alt(29); | ||
| 89 | pnx833x_gpio_select_function_alt(30); | ||
| 90 | pnx833x_gpio_select_function_alt(31); | ||
| 91 | pnx833x_gpio_select_function_alt(32); | ||
| 92 | pnx833x_gpio_select_function_alt(33); | ||
| 93 | |||
| 94 | #if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE) | ||
| 95 | /* Setup MIU for NAND access on CS0... | ||
| 96 | * | ||
| 97 | * (it seems that we must also configure CS1 for reliable operation, | ||
| 98 | * otherwise the first read ID command will fail if it's read as 4 bytes | ||
| 99 | * but pass if it's read as 1 word.) | ||
| 100 | */ | ||
| 101 | |||
| 102 | /* Setup MIU CS0 & CS1 timing */ | ||
| 103 | PNX833X_MIU_SEL0 = 0; | ||
| 104 | PNX833X_MIU_SEL1 = 0; | ||
| 105 | PNX833X_MIU_SEL0_TIMING = 0x50003081; | ||
| 106 | PNX833X_MIU_SEL1_TIMING = 0x50003081; | ||
| 107 | |||
| 108 | /* Setup GPIO 00 for use as MIU CS1 (CS0 is not multiplexed, so does not need this) */ | ||
| 109 | pnx833x_gpio_select_function_alt(0); | ||
| 110 | |||
| 111 | /* Setup GPIO 04 to input NAND read/busy signal */ | ||
| 112 | pnx833x_gpio_select_function_io(4); | ||
| 113 | pnx833x_gpio_select_input(4); | ||
| 114 | |||
| 115 | /* Setup GPIO 05 to disable NAND write protect */ | ||
| 116 | pnx833x_gpio_select_function_io(5); | ||
| 117 | pnx833x_gpio_select_output(5); | ||
| 118 | pnx833x_gpio_write(1, 5); | ||
| 119 | |||
| 120 | #elif defined(CONFIG_MTD_CFI) || defined(CONFIG_MTD_CFI_MODULE) | ||
| 121 | |||
| 122 | /* Set up MIU for 16-bit NOR access on CS0 and CS1... */ | ||
| 123 | |||
| 124 | /* Setup MIU CS0 & CS1 timing */ | ||
| 125 | PNX833X_MIU_SEL0 = 1; | ||
| 126 | PNX833X_MIU_SEL1 = 1; | ||
| 127 | PNX833X_MIU_SEL0_TIMING = 0x6A08D082; | ||
| 128 | PNX833X_MIU_SEL1_TIMING = 0x6A08D082; | ||
| 129 | |||
| 130 | /* Setup GPIO 00 for use as MIU CS1 (CS0 is not multiplexed, so does not need this) */ | ||
| 131 | pnx833x_gpio_select_function_alt(0); | ||
| 132 | #endif | ||
| 133 | } | ||
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile index b1886244cedf..e8a97f59e066 100644 --- a/arch/mips/pci/Makefile +++ b/arch/mips/pci/Makefile | |||
| @@ -13,7 +13,7 @@ obj-$(CONFIG_MIPS_MSC) += ops-msc.o | |||
| 13 | obj-$(CONFIG_MIPS_NILE4) += ops-nile4.o | 13 | obj-$(CONFIG_MIPS_NILE4) += ops-nile4.o |
| 14 | obj-$(CONFIG_SOC_TX3927) += ops-tx3927.o | 14 | obj-$(CONFIG_SOC_TX3927) += ops-tx3927.o |
| 15 | obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o | 15 | obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o |
| 16 | obj-$(CONFIG_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o | 16 | obj-$(CONFIG_NEC_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o |
| 17 | obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o | 17 | obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o |
| 18 | obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o | 18 | obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o |
| 19 | 19 | ||
diff --git a/arch/mips/pci/fixup-emma2rh.c b/arch/mips/pci/fixup-emma2rh.c index 846eae9cdd05..fba5aad00d51 100644 --- a/arch/mips/pci/fixup-emma2rh.c +++ b/arch/mips/pci/fixup-emma2rh.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | #include <asm/bootinfo.h> | 31 | #include <asm/bootinfo.h> |
| 32 | 32 | ||
| 33 | #include <asm/emma2rh/emma2rh.h> | 33 | #include <asm/emma/emma2rh.h> |
| 34 | 34 | ||
| 35 | #define EMMA2RH_PCI_HOST_SLOT 0x09 | 35 | #define EMMA2RH_PCI_HOST_SLOT 0x09 |
| 36 | #define EMMA2RH_USB_SLOT 0x03 | 36 | #define EMMA2RH_USB_SLOT 0x03 |
diff --git a/arch/mips/pci/fixup-rc32434.c b/arch/mips/pci/fixup-rc32434.c index 75b90dcb7a09..3d86823d03a0 100644 --- a/arch/mips/pci/fixup-rc32434.c +++ b/arch/mips/pci/fixup-rc32434.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
| 31 | 31 | ||
| 32 | #include <asm/mach-rc32434/rc32434.h> | 32 | #include <asm/mach-rc32434/rc32434.h> |
| 33 | #include <asm/mach-rc32434/irq.h> | ||
| 33 | 34 | ||
| 34 | static int __devinitdata irq_map[2][12] = { | 35 | static int __devinitdata irq_map[2][12] = { |
| 35 | {0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1}, | 36 | {0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1}, |
diff --git a/arch/mips/pci/ops-emma2rh.c b/arch/mips/pci/ops-emma2rh.c index d31bfc6d4150..5947a70b0b7f 100644 --- a/arch/mips/pci/ops-emma2rh.c +++ b/arch/mips/pci/ops-emma2rh.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #include <asm/addrspace.h> | 30 | #include <asm/addrspace.h> |
| 31 | #include <asm/debug.h> | 31 | #include <asm/debug.h> |
| 32 | 32 | ||
| 33 | #include <asm/emma2rh/emma2rh.h> | 33 | #include <asm/emma/emma2rh.h> |
| 34 | 34 | ||
| 35 | #define RTABORT (0x1<<9) | 35 | #define RTABORT (0x1<<9) |
| 36 | #define RMABORT (0x1<<10) | 36 | #define RMABORT (0x1<<10) |
diff --git a/arch/mips/pci/pci-emma2rh.c b/arch/mips/pci/pci-emma2rh.c index 772e283daa63..2df4190232cd 100644 --- a/arch/mips/pci/pci-emma2rh.c +++ b/arch/mips/pci/pci-emma2rh.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | #include <asm/bootinfo.h> | 31 | #include <asm/bootinfo.h> |
| 32 | 32 | ||
| 33 | #include <asm/emma2rh/emma2rh.h> | 33 | #include <asm/emma/emma2rh.h> |
| 34 | 34 | ||
| 35 | static struct resource pci_io_resource = { | 35 | static struct resource pci_io_resource = { |
| 36 | .name = "pci IO space", | 36 | .name = "pci IO space", |
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index 31619c601b11..2f22d714d5b0 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c | |||
| @@ -280,7 +280,7 @@ static int __init plat_setup_devices(void) | |||
| 280 | { | 280 | { |
| 281 | /* Look for the CF card reader */ | 281 | /* Look for the CF card reader */ |
| 282 | if (!readl(IDT434_REG_BASE + DEV1MASK)) | 282 | if (!readl(IDT434_REG_BASE + DEV1MASK)) |
| 283 | rb532_devs[1] = NULL; | 283 | rb532_devs[2] = NULL; /* disable cf_slot0 at index 2 */ |
| 284 | else { | 284 | else { |
| 285 | cf_slot0_res[0].start = | 285 | cf_slot0_res[0].start = |
| 286 | readl(IDT434_REG_BASE + DEV1BASE); | 286 | readl(IDT434_REG_BASE + DEV1BASE); |
diff --git a/arch/mips/rb532/gpio.c b/arch/mips/rb532/gpio.c index 76a7fd96d564..70c4a6726377 100644 --- a/arch/mips/rb532/gpio.c +++ b/arch/mips/rb532/gpio.c | |||
| @@ -310,6 +310,10 @@ int __init rb532_gpio_init(void) | |||
| 310 | return -ENXIO; | 310 | return -ENXIO; |
| 311 | } | 311 | } |
| 312 | 312 | ||
| 313 | /* Set the interrupt status and level for the CF pin */ | ||
| 314 | rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1); | ||
| 315 | rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0); | ||
| 316 | |||
| 313 | return 0; | 317 | return 0; |
| 314 | } | 318 | } |
| 315 | arch_initcall(rb532_gpio_init); | 319 | arch_initcall(rb532_gpio_init); |
diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c index f6d9bf4b26e7..f8b18af141a1 100644 --- a/arch/mips/sgi-ip22/ip22-int.c +++ b/arch/mips/sgi-ip22/ip22-int.c | |||
| @@ -12,20 +12,11 @@ | |||
| 12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | #include <linux/kernel_stat.h> | 14 | #include <linux/kernel_stat.h> |
| 15 | #include <linux/signal.h> | ||
| 16 | #include <linux/sched.h> | ||
| 17 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
| 18 | #include <linux/irq.h> | ||
| 19 | 16 | ||
| 20 | #include <asm/mipsregs.h> | ||
| 21 | #include <asm/addrspace.h> | ||
| 22 | #include <asm/irq_cpu.h> | 17 | #include <asm/irq_cpu.h> |
| 23 | #include <asm/sgi/ioc.h> | ||
| 24 | #include <asm/sgi/hpc3.h> | 18 | #include <asm/sgi/hpc3.h> |
| 25 | #include <asm/sgi/ip22.h> | 19 | #include <asm/sgi/ip22.h> |
| 26 | #include <asm/time.h> | ||
| 27 | |||
| 28 | /* #define DEBUG_SGINT */ | ||
| 29 | 20 | ||
| 30 | /* So far nothing hangs here */ | 21 | /* So far nothing hangs here */ |
| 31 | #undef USE_LIO3_IRQ | 22 | #undef USE_LIO3_IRQ |
| @@ -68,7 +59,7 @@ static void enable_local1_irq(unsigned int irq) | |||
| 68 | sgint->imask1 |= (1 << (irq - SGINT_LOCAL1)); | 59 | sgint->imask1 |= (1 << (irq - SGINT_LOCAL1)); |
| 69 | } | 60 | } |
| 70 | 61 | ||
| 71 | void disable_local1_irq(unsigned int irq) | 62 | static void disable_local1_irq(unsigned int irq) |
| 72 | { | 63 | { |
| 73 | sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1)); | 64 | sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1)); |
| 74 | } | 65 | } |
| @@ -87,7 +78,7 @@ static void enable_local2_irq(unsigned int irq) | |||
| 87 | sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2)); | 78 | sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2)); |
| 88 | } | 79 | } |
| 89 | 80 | ||
| 90 | void disable_local2_irq(unsigned int irq) | 81 | static void disable_local2_irq(unsigned int irq) |
| 91 | { | 82 | { |
| 92 | sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2)); | 83 | sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2)); |
| 93 | if (!sgint->cmeimask0) | 84 | if (!sgint->cmeimask0) |
| @@ -108,7 +99,7 @@ static void enable_local3_irq(unsigned int irq) | |||
| 108 | sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3)); | 99 | sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3)); |
| 109 | } | 100 | } |
| 110 | 101 | ||
| 111 | void disable_local3_irq(unsigned int irq) | 102 | static void disable_local3_irq(unsigned int irq) |
| 112 | { | 103 | { |
| 113 | sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3)); | 104 | sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3)); |
| 114 | if (!sgint->cmeimask1) | 105 | if (!sgint->cmeimask1) |
| @@ -344,6 +335,6 @@ void __init arch_init_irq(void) | |||
| 344 | 335 | ||
| 345 | #ifdef CONFIG_EISA | 336 | #ifdef CONFIG_EISA |
| 346 | if (ip22_is_fullhouse()) /* Only Indigo-2 has EISA stuff */ | 337 | if (ip22_is_fullhouse()) /* Only Indigo-2 has EISA stuff */ |
| 347 | ip22_eisa_init(); | 338 | ip22_eisa_init(); |
| 348 | #endif | 339 | #endif |
| 349 | } | 340 | } |
diff --git a/arch/mips/txx9/Kconfig b/arch/mips/txx9/Kconfig index 17052db4161d..226e8bb2f0a1 100644 --- a/arch/mips/txx9/Kconfig +++ b/arch/mips/txx9/Kconfig | |||
| @@ -46,9 +46,10 @@ config TOSHIBA_RBTX4938 | |||
| 46 | support this machine type | 46 | support this machine type |
| 47 | 47 | ||
| 48 | config TOSHIBA_RBTX4939 | 48 | config TOSHIBA_RBTX4939 |
| 49 | bool "Toshiba RBTX4939 bobard" | 49 | bool "Toshiba RBTX4939 board" |
| 50 | depends on MACH_TX49XX | 50 | depends on MACH_TX49XX |
| 51 | select SOC_TX4939 | 51 | select SOC_TX4939 |
| 52 | select TXX9_7SEGLED | ||
| 52 | help | 53 | help |
| 53 | This Toshiba board is based on the TX4939 processor. Say Y here to | 54 | This Toshiba board is based on the TX4939 processor. Say Y here to |
| 54 | support this machine type | 55 | support this machine type |
| @@ -86,6 +87,9 @@ config SOC_TX4939 | |||
| 86 | select HW_HAS_PCI | 87 | select HW_HAS_PCI |
| 87 | select PCI_TX4927 | 88 | select PCI_TX4927 |
| 88 | 89 | ||
| 90 | config TXX9_7SEGLED | ||
| 91 | bool | ||
| 92 | |||
| 89 | config TOSHIBA_FPCIB0 | 93 | config TOSHIBA_FPCIB0 |
| 90 | bool "FPCIB0 Backplane Support" | 94 | bool "FPCIB0 Backplane Support" |
| 91 | depends on PCI && MACH_TXX9 | 95 | depends on PCI && MACH_TXX9 |
diff --git a/arch/mips/txx9/generic/7segled.c b/arch/mips/txx9/generic/7segled.c new file mode 100644 index 000000000000..727ab21b6618 --- /dev/null +++ b/arch/mips/txx9/generic/7segled.c | |||
| @@ -0,0 +1,112 @@ | |||
| 1 | /* | ||
| 2 | * 7 Segment LED routines | ||
| 3 | * Based on RBTX49xx patch from CELF patch archive. | ||
| 4 | * | ||
| 5 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 6 | * License. See the file "COPYING" in the main directory of this archive | ||
| 7 | * for more details. | ||
| 8 | * | ||
| 9 | * (C) Copyright TOSHIBA CORPORATION 2005-2007 | ||
| 10 | * All Rights Reserved. | ||
| 11 | */ | ||
| 12 | #include <linux/sysdev.h> | ||
| 13 | #include <linux/slab.h> | ||
| 14 | #include <linux/map_to_7segment.h> | ||
| 15 | #include <asm/txx9/generic.h> | ||
| 16 | |||
| 17 | static unsigned int tx_7segled_num; | ||
| 18 | static void (*tx_7segled_putc)(unsigned int pos, unsigned char val); | ||
| 19 | |||
| 20 | void __init txx9_7segled_init(unsigned int num, | ||
| 21 | void (*putc)(unsigned int pos, unsigned char val)) | ||
| 22 | { | ||
| 23 | tx_7segled_num = num; | ||
| 24 | tx_7segled_putc = putc; | ||
| 25 | } | ||
| 26 | |||
| 27 | static SEG7_CONVERSION_MAP(txx9_seg7map, MAP_ASCII7SEG_ALPHANUM_LC); | ||
| 28 | |||
| 29 | int txx9_7segled_putc(unsigned int pos, char c) | ||
| 30 | { | ||
| 31 | if (pos >= tx_7segled_num) | ||
| 32 | return -EINVAL; | ||
| 33 | c = map_to_seg7(&txx9_seg7map, c); | ||
| 34 | if (c < 0) | ||
| 35 | return c; | ||
| 36 | tx_7segled_putc(pos, c); | ||
| 37 | return 0; | ||
| 38 | } | ||
| 39 | |||
| 40 | static ssize_t ascii_store(struct sys_device *dev, | ||
| 41 | struct sysdev_attribute *attr, | ||
| 42 | const char *buf, size_t size) | ||
| 43 | { | ||
| 44 | unsigned int ch = dev->id; | ||
| 45 | txx9_7segled_putc(ch, buf[0]); | ||
| 46 | return size; | ||
| 47 | } | ||
| 48 | |||
| 49 | static ssize_t raw_store(struct sys_device *dev, | ||
| 50 | struct sysdev_attribute *attr, | ||
| 51 | const char *buf, size_t size) | ||
| 52 | { | ||
| 53 | unsigned int ch = dev->id; | ||
| 54 | tx_7segled_putc(ch, buf[0]); | ||
| 55 | return size; | ||
| 56 | } | ||
| 57 | |||
| 58 | static SYSDEV_ATTR(ascii, 0200, NULL, ascii_store); | ||
| 59 | static SYSDEV_ATTR(raw, 0200, NULL, raw_store); | ||
| 60 | |||
| 61 | static ssize_t map_seg7_show(struct sysdev_class *class, char *buf) | ||
| 62 | { | ||
| 63 | memcpy(buf, &txx9_seg7map, sizeof(txx9_seg7map)); | ||
| 64 | return sizeof(txx9_seg7map); | ||
| 65 | } | ||
| 66 | |||
| 67 | static ssize_t map_seg7_store(struct sysdev_class *class, | ||
| 68 | const char *buf, size_t size) | ||
| 69 | { | ||
| 70 | if (size != sizeof(txx9_seg7map)) | ||
| 71 | return -EINVAL; | ||
| 72 | memcpy(&txx9_seg7map, buf, size); | ||
| 73 | return size; | ||
| 74 | } | ||
| 75 | |||
| 76 | static SYSDEV_CLASS_ATTR(map_seg7, 0600, map_seg7_show, map_seg7_store); | ||
| 77 | |||
| 78 | static struct sysdev_class tx_7segled_sysdev_class = { | ||
| 79 | .name = "7segled", | ||
| 80 | }; | ||
| 81 | |||
| 82 | static int __init tx_7segled_init_sysfs(void) | ||
| 83 | { | ||
| 84 | int error, i; | ||
| 85 | if (!tx_7segled_num) | ||
| 86 | return -ENODEV; | ||
| 87 | error = sysdev_class_register(&tx_7segled_sysdev_class); | ||
| 88 | if (error) | ||
| 89 | return error; | ||
| 90 | error = sysdev_class_create_file(&tx_7segled_sysdev_class, | ||
| 91 | &attr_map_seg7); | ||
| 92 | if (error) | ||
| 93 | return error; | ||
| 94 | for (i = 0; i < tx_7segled_num; i++) { | ||
| 95 | struct sys_device *dev; | ||
| 96 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
| 97 | if (!dev) { | ||
| 98 | error = -ENODEV; | ||
| 99 | break; | ||
| 100 | } | ||
| 101 | dev->id = i; | ||
| 102 | dev->cls = &tx_7segled_sysdev_class; | ||
| 103 | error = sysdev_register(dev); | ||
| 104 | if (!error) { | ||
| 105 | sysdev_create_file(dev, &attr_ascii); | ||
| 106 | sysdev_create_file(dev, &attr_raw); | ||
| 107 | } | ||
| 108 | } | ||
| 109 | return error; | ||
| 110 | } | ||
| 111 | |||
| 112 | device_initcall(tx_7segled_init_sysfs); | ||
diff --git a/arch/mips/txx9/generic/Makefile b/arch/mips/txx9/generic/Makefile index 0030d23bef5b..f2579ce054a1 100644 --- a/arch/mips/txx9/generic/Makefile +++ b/arch/mips/txx9/generic/Makefile | |||
| @@ -10,5 +10,6 @@ obj-$(CONFIG_SOC_TX4938) += mem_tx4927.o setup_tx4938.o irq_tx4938.o | |||
| 10 | obj-$(CONFIG_SOC_TX4939) += setup_tx4939.o irq_tx4939.o | 10 | obj-$(CONFIG_SOC_TX4939) += setup_tx4939.o irq_tx4939.o |
| 11 | obj-$(CONFIG_TOSHIBA_FPCIB0) += smsc_fdc37m81x.o | 11 | obj-$(CONFIG_TOSHIBA_FPCIB0) += smsc_fdc37m81x.o |
| 12 | obj-$(CONFIG_SPI) += spi_eeprom.o | 12 | obj-$(CONFIG_SPI) += spi_eeprom.o |
| 13 | obj-$(CONFIG_TXX9_7SEGLED) += 7segled.o | ||
| 13 | 14 | ||
| 14 | EXTRA_CFLAGS += -Werror | 15 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index 5526375010f8..a13a08b8c9ec 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c | |||
| @@ -156,11 +156,23 @@ static struct txx9_board_vec *__init find_board_byname(const char *name) | |||
| 156 | 156 | ||
| 157 | static void __init prom_init_cmdline(void) | 157 | static void __init prom_init_cmdline(void) |
| 158 | { | 158 | { |
| 159 | int argc = (int)fw_arg0; | 159 | int argc; |
| 160 | int *argv32 = (int *)fw_arg1; | 160 | int *argv32; |
| 161 | int i; /* Always ignore the "-c" at argv[0] */ | 161 | int i; /* Always ignore the "-c" at argv[0] */ |
| 162 | char builtin[CL_SIZE]; | 162 | char builtin[CL_SIZE]; |
| 163 | 163 | ||
| 164 | if (fw_arg0 >= CKSEG0 || fw_arg1 < CKSEG0) { | ||
| 165 | /* | ||
| 166 | * argc is not a valid number, or argv32 is not a valid | ||
| 167 | * pointer | ||
| 168 | */ | ||
| 169 | argc = 0; | ||
| 170 | argv32 = NULL; | ||
| 171 | } else { | ||
| 172 | argc = (int)fw_arg0; | ||
| 173 | argv32 = (int *)fw_arg1; | ||
| 174 | } | ||
| 175 | |||
| 164 | /* ignore all built-in args if any f/w args given */ | 176 | /* ignore all built-in args if any f/w args given */ |
| 165 | /* | 177 | /* |
| 166 | * But if built-in strings was started with '+', append them | 178 | * But if built-in strings was started with '+', append them |
| @@ -414,10 +426,12 @@ char * __init prom_getcmdline(void) | |||
| 414 | 426 | ||
| 415 | const char *__init prom_getenv(const char *name) | 427 | const char *__init prom_getenv(const char *name) |
| 416 | { | 428 | { |
| 417 | const s32 *str = (const s32 *)fw_arg2; | 429 | const s32 *str; |
| 418 | 430 | ||
| 419 | if (!str) | 431 | if (fw_arg2 < CKSEG0) |
| 420 | return NULL; | 432 | return NULL; |
| 433 | |||
| 434 | str = (const s32 *)fw_arg2; | ||
| 421 | /* YAMON style ("name", "value" pairs) */ | 435 | /* YAMON style ("name", "value" pairs) */ |
| 422 | while (str[0] && str[1]) { | 436 | while (str[0] && str[1]) { |
| 423 | if (!strcmp((const char *)(unsigned long)str[0], name)) | 437 | if (!strcmp((const char *)(unsigned long)str[0], name)) |
| @@ -622,6 +636,21 @@ unsigned long (*__swizzle_addr_b)(unsigned long port) = __swizzle_addr_none; | |||
| 622 | EXPORT_SYMBOL(__swizzle_addr_b); | 636 | EXPORT_SYMBOL(__swizzle_addr_b); |
| 623 | #endif | 637 | #endif |
| 624 | 638 | ||
| 639 | #ifdef NEEDS_TXX9_IOSWABW | ||
| 640 | static u16 ioswabw_default(volatile u16 *a, u16 x) | ||
| 641 | { | ||
| 642 | return le16_to_cpu(x); | ||
| 643 | } | ||
| 644 | static u16 __mem_ioswabw_default(volatile u16 *a, u16 x) | ||
| 645 | { | ||
| 646 | return x; | ||
| 647 | } | ||
| 648 | u16 (*ioswabw)(volatile u16 *a, u16 x) = ioswabw_default; | ||
| 649 | EXPORT_SYMBOL(ioswabw); | ||
| 650 | u16 (*__mem_ioswabw)(volatile u16 *a, u16 x) = __mem_ioswabw_default; | ||
| 651 | EXPORT_SYMBOL(__mem_ioswabw); | ||
| 652 | #endif | ||
| 653 | |||
| 625 | void __init txx9_physmap_flash_init(int no, unsigned long addr, | 654 | void __init txx9_physmap_flash_init(int no, unsigned long addr, |
| 626 | unsigned long size, | 655 | unsigned long size, |
| 627 | const struct physmap_flash_data *pdata) | 656 | const struct physmap_flash_data *pdata) |
diff --git a/arch/mips/txx9/rbtx4939/setup.c b/arch/mips/txx9/rbtx4939/setup.c index 9855d7bccc20..6daee9b1cd5e 100644 --- a/arch/mips/txx9/rbtx4939/setup.c +++ b/arch/mips/txx9/rbtx4939/setup.c | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 16 | #include <linux/leds.h> | 16 | #include <linux/leds.h> |
| 17 | #include <linux/interrupt.h> | ||
| 18 | #include <linux/smc91x.h> | ||
| 17 | #include <asm/reboot.h> | 19 | #include <asm/reboot.h> |
| 18 | #include <asm/txx9/generic.h> | 20 | #include <asm/txx9/generic.h> |
| 19 | #include <asm/txx9/pci.h> | 21 | #include <asm/txx9/pci.h> |
| @@ -33,6 +35,21 @@ static void __init rbtx4939_time_init(void) | |||
| 33 | tx4939_time_init(0); | 35 | tx4939_time_init(0); |
| 34 | } | 36 | } |
| 35 | 37 | ||
| 38 | #if defined(__BIG_ENDIAN) && \ | ||
| 39 | (defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)) | ||
| 40 | #define HAVE_RBTX4939_IOSWAB | ||
| 41 | #define IS_CE1_ADDR(addr) \ | ||
| 42 | ((((unsigned long)(addr) - IO_BASE) & 0xfff00000) == TXX9_CE(1)) | ||
| 43 | static u16 rbtx4939_ioswabw(volatile u16 *a, u16 x) | ||
| 44 | { | ||
| 45 | return IS_CE1_ADDR(a) ? x : le16_to_cpu(x); | ||
| 46 | } | ||
| 47 | static u16 rbtx4939_mem_ioswabw(volatile u16 *a, u16 x) | ||
| 48 | { | ||
| 49 | return !IS_CE1_ADDR(a) ? x : le16_to_cpu(x); | ||
| 50 | } | ||
| 51 | #endif /* __BIG_ENDIAN && CONFIG_SMC91X */ | ||
| 52 | |||
| 36 | static void __init rbtx4939_pci_setup(void) | 53 | static void __init rbtx4939_pci_setup(void) |
| 37 | { | 54 | { |
| 38 | #ifdef CONFIG_PCI | 55 | #ifdef CONFIG_PCI |
| @@ -239,6 +256,32 @@ static inline void rbtx4939_led_setup(void) | |||
| 239 | } | 256 | } |
| 240 | #endif | 257 | #endif |
| 241 | 258 | ||
| 259 | static void __rbtx4939_7segled_putc(unsigned int pos, unsigned char val) | ||
| 260 | { | ||
| 261 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) | ||
| 262 | unsigned long flags; | ||
| 263 | local_irq_save(flags); | ||
| 264 | /* bit7: reserved for LED class */ | ||
| 265 | led_val[pos] = (led_val[pos] & 0x80) | (val & 0x7f); | ||
| 266 | val = led_val[pos]; | ||
| 267 | local_irq_restore(flags); | ||
| 268 | #endif | ||
| 269 | writeb(val, rbtx4939_7seg_addr(pos / 4, pos % 4)); | ||
| 270 | } | ||
| 271 | |||
| 272 | static void rbtx4939_7segled_putc(unsigned int pos, unsigned char val) | ||
| 273 | { | ||
| 274 | /* convert from map_to_seg7() notation */ | ||
| 275 | val = (val & 0x88) | | ||
| 276 | ((val & 0x40) >> 6) | | ||
| 277 | ((val & 0x20) >> 4) | | ||
| 278 | ((val & 0x10) >> 2) | | ||
| 279 | ((val & 0x04) << 2) | | ||
| 280 | ((val & 0x02) << 4) | | ||
| 281 | ((val & 0x01) << 6); | ||
| 282 | __rbtx4939_7segled_putc(pos, val); | ||
| 283 | } | ||
| 284 | |||
| 242 | static void __init rbtx4939_arch_init(void) | 285 | static void __init rbtx4939_arch_init(void) |
| 243 | { | 286 | { |
| 244 | rbtx4939_pci_setup(); | 287 | rbtx4939_pci_setup(); |
| @@ -246,6 +289,22 @@ static void __init rbtx4939_arch_init(void) | |||
| 246 | 289 | ||
| 247 | static void __init rbtx4939_device_init(void) | 290 | static void __init rbtx4939_device_init(void) |
| 248 | { | 291 | { |
| 292 | unsigned long smc_addr = RBTX4939_ETHER_ADDR - IO_BASE; | ||
| 293 | struct resource smc_res[] = { | ||
| 294 | { | ||
| 295 | .start = smc_addr, | ||
| 296 | .end = smc_addr + 0x10 - 1, | ||
| 297 | .flags = IORESOURCE_MEM, | ||
| 298 | }, { | ||
| 299 | .start = RBTX4939_IRQ_ETHER, | ||
| 300 | /* override default irq flag defined in smc91x.h */ | ||
| 301 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, | ||
| 302 | }, | ||
| 303 | }; | ||
| 304 | struct smc91x_platdata smc_pdata = { | ||
| 305 | .flags = SMC91X_USE_16BIT, | ||
| 306 | }; | ||
| 307 | struct platform_device *pdev; | ||
| 249 | #if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE) | 308 | #if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE) |
| 250 | int i, j; | 309 | int i, j; |
| 251 | unsigned char ethaddr[2][6]; | 310 | unsigned char ethaddr[2][6]; |
| @@ -262,6 +321,12 @@ static void __init rbtx4939_device_init(void) | |||
| 262 | } | 321 | } |
| 263 | tx4939_ethaddr_init(ethaddr[0], ethaddr[1]); | 322 | tx4939_ethaddr_init(ethaddr[0], ethaddr[1]); |
| 264 | #endif | 323 | #endif |
| 324 | pdev = platform_device_alloc("smc91x", -1); | ||
| 325 | if (!pdev || | ||
| 326 | platform_device_add_resources(pdev, smc_res, ARRAY_SIZE(smc_res)) || | ||
| 327 | platform_device_add_data(pdev, &smc_pdata, sizeof(smc_pdata)) || | ||
| 328 | platform_device_add(pdev)) | ||
| 329 | platform_device_put(pdev); | ||
| 265 | rbtx4939_led_setup(); | 330 | rbtx4939_led_setup(); |
| 266 | tx4939_wdt_init(); | 331 | tx4939_wdt_init(); |
| 267 | tx4939_ata_init(); | 332 | tx4939_ata_init(); |
| @@ -269,6 +334,8 @@ static void __init rbtx4939_device_init(void) | |||
| 269 | 334 | ||
| 270 | static void __init rbtx4939_setup(void) | 335 | static void __init rbtx4939_setup(void) |
| 271 | { | 336 | { |
| 337 | int i; | ||
| 338 | |||
| 272 | rbtx4939_ebusc_setup(); | 339 | rbtx4939_ebusc_setup(); |
| 273 | /* always enable ATA0 */ | 340 | /* always enable ATA0 */ |
| 274 | txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE); | 341 | txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE); |
| @@ -276,9 +343,16 @@ static void __init rbtx4939_setup(void) | |||
| 276 | if (txx9_master_clock == 0) | 343 | if (txx9_master_clock == 0) |
| 277 | txx9_master_clock = 20000000; | 344 | txx9_master_clock = 20000000; |
| 278 | tx4939_setup(); | 345 | tx4939_setup(); |
| 346 | #ifdef HAVE_RBTX4939_IOSWAB | ||
| 347 | ioswabw = rbtx4939_ioswabw; | ||
| 348 | __mem_ioswabw = rbtx4939_mem_ioswabw; | ||
| 349 | #endif | ||
| 279 | 350 | ||
| 280 | _machine_restart = rbtx4939_machine_restart; | 351 | _machine_restart = rbtx4939_machine_restart; |
| 281 | 352 | ||
| 353 | txx9_7segled_init(RBTX4939_MAX_7SEGLEDS, rbtx4939_7segled_putc); | ||
| 354 | for (i = 0; i < RBTX4939_MAX_7SEGLEDS; i++) | ||
| 355 | txx9_7segled_putc(i, '-'); | ||
| 282 | pr_info("RBTX4939 (Rev %02x) --- FPGA(Rev %02x) DIPSW:%02x,%02x\n", | 356 | pr_info("RBTX4939 (Rev %02x) --- FPGA(Rev %02x) DIPSW:%02x,%02x\n", |
| 283 | readb(rbtx4939_board_rev_addr), readb(rbtx4939_ioc_rev_addr), | 357 | readb(rbtx4939_board_rev_addr), readb(rbtx4939_ioc_rev_addr), |
| 284 | readb(rbtx4939_udipsw_addr), readb(rbtx4939_bdipsw_addr)); | 358 | readb(rbtx4939_udipsw_addr), readb(rbtx4939_bdipsw_addr)); |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 5b1527883fcb..525c13a4de93 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -108,8 +108,7 @@ config ARCH_NO_VIRT_TO_BUS | |||
| 108 | config PPC | 108 | config PPC |
| 109 | bool | 109 | bool |
| 110 | default y | 110 | default y |
| 111 | select HAVE_DYNAMIC_FTRACE | 111 | select HAVE_FUNCTION_TRACER |
| 112 | select HAVE_FTRACE | ||
| 113 | select ARCH_WANT_OPTIONAL_GPIOLIB | 112 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| 114 | select HAVE_IDE | 113 | select HAVE_IDE |
| 115 | select HAVE_IOREMAP_PROT | 114 | select HAVE_IOREMAP_PROT |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 24dd1a37f8fb..1f0667069940 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -122,7 +122,7 @@ KBUILD_CFLAGS += -mcpu=powerpc | |||
| 122 | endif | 122 | endif |
| 123 | 123 | ||
| 124 | # Work around a gcc code-gen bug with -fno-omit-frame-pointer. | 124 | # Work around a gcc code-gen bug with -fno-omit-frame-pointer. |
| 125 | ifeq ($(CONFIG_FTRACE),y) | 125 | ifeq ($(CONFIG_FUNCTION_TRACER),y) |
| 126 | KBUILD_CFLAGS += -mno-sched-epilog | 126 | KBUILD_CFLAGS += -mno-sched-epilog |
| 127 | endif | 127 | endif |
| 128 | 128 | ||
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h index de921326cca8..b298f7a631e6 100644 --- a/arch/powerpc/include/asm/ftrace.h +++ b/arch/powerpc/include/asm/ftrace.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ASM_POWERPC_FTRACE | 1 | #ifndef _ASM_POWERPC_FTRACE |
| 2 | #define _ASM_POWERPC_FTRACE | 2 | #define _ASM_POWERPC_FTRACE |
| 3 | 3 | ||
| 4 | #ifdef CONFIG_FTRACE | 4 | #ifdef CONFIG_FUNCTION_TRACER |
| 5 | #define MCOUNT_ADDR ((long)(_mcount)) | 5 | #define MCOUNT_ADDR ((long)(_mcount)) |
| 6 | #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ | 6 | #define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ |
| 7 | 7 | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index fdb58253fa5b..92673b43858d 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
| @@ -12,7 +12,7 @@ CFLAGS_prom_init.o += -fPIC | |||
| 12 | CFLAGS_btext.o += -fPIC | 12 | CFLAGS_btext.o += -fPIC |
| 13 | endif | 13 | endif |
| 14 | 14 | ||
| 15 | ifdef CONFIG_FTRACE | 15 | ifdef CONFIG_FUNCTION_TRACER |
| 16 | # Do not trace early boot code | 16 | # Do not trace early boot code |
| 17 | CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog | 17 | CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog |
| 18 | CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog | 18 | CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 1cbbf7033641..7ecc0d1855c3 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
| @@ -1158,7 +1158,7 @@ machine_check_in_rtas: | |||
| 1158 | 1158 | ||
| 1159 | #endif /* CONFIG_PPC_RTAS */ | 1159 | #endif /* CONFIG_PPC_RTAS */ |
| 1160 | 1160 | ||
| 1161 | #ifdef CONFIG_FTRACE | 1161 | #ifdef CONFIG_FUNCTION_TRACER |
| 1162 | #ifdef CONFIG_DYNAMIC_FTRACE | 1162 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 1163 | _GLOBAL(mcount) | 1163 | _GLOBAL(mcount) |
| 1164 | _GLOBAL(_mcount) | 1164 | _GLOBAL(_mcount) |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index fd8b4bae9b04..e6d52845854f 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -884,7 +884,7 @@ _GLOBAL(enter_prom) | |||
| 884 | mtlr r0 | 884 | mtlr r0 |
| 885 | blr | 885 | blr |
| 886 | 886 | ||
| 887 | #ifdef CONFIG_FTRACE | 887 | #ifdef CONFIG_FUNCTION_TRACER |
| 888 | #ifdef CONFIG_DYNAMIC_FTRACE | 888 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 889 | _GLOBAL(mcount) | 889 | _GLOBAL(mcount) |
| 890 | _GLOBAL(_mcount) | 890 | _GLOBAL(_mcount) |
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index 3855ceb937b0..f4b006ed0ab1 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
| @@ -28,17 +28,17 @@ static unsigned int ftrace_nop = 0x60000000; | |||
| 28 | #endif | 28 | #endif |
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | static unsigned int notrace ftrace_calc_offset(long ip, long addr) | 31 | static unsigned int ftrace_calc_offset(long ip, long addr) |
| 32 | { | 32 | { |
| 33 | return (int)(addr - ip); | 33 | return (int)(addr - ip); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | notrace unsigned char *ftrace_nop_replace(void) | 36 | unsigned char *ftrace_nop_replace(void) |
| 37 | { | 37 | { |
| 38 | return (char *)&ftrace_nop; | 38 | return (char *)&ftrace_nop; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | 41 | unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) |
| 42 | { | 42 | { |
| 43 | static unsigned int op; | 43 | static unsigned int op; |
| 44 | 44 | ||
| @@ -68,7 +68,7 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
| 68 | # define _ASM_PTR " .long " | 68 | # define _ASM_PTR " .long " |
| 69 | #endif | 69 | #endif |
| 70 | 70 | ||
| 71 | notrace int | 71 | int |
| 72 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, | 72 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, |
| 73 | unsigned char *new_code) | 73 | unsigned char *new_code) |
| 74 | { | 74 | { |
| @@ -113,7 +113,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
| 113 | return faulted; | 113 | return faulted; |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | notrace int ftrace_update_ftrace_func(ftrace_func_t func) | 116 | int ftrace_update_ftrace_func(ftrace_func_t func) |
| 117 | { | 117 | { |
| 118 | unsigned long ip = (unsigned long)(&ftrace_call); | 118 | unsigned long ip = (unsigned long)(&ftrace_call); |
| 119 | unsigned char old[MCOUNT_INSN_SIZE], *new; | 119 | unsigned char old[MCOUNT_INSN_SIZE], *new; |
| @@ -126,23 +126,6 @@ notrace int ftrace_update_ftrace_func(ftrace_func_t func) | |||
| 126 | return ret; | 126 | return ret; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | notrace int ftrace_mcount_set(unsigned long *data) | ||
| 130 | { | ||
| 131 | unsigned long ip = (long)(&mcount_call); | ||
| 132 | unsigned long *addr = data; | ||
| 133 | unsigned char old[MCOUNT_INSN_SIZE], *new; | ||
| 134 | |||
| 135 | /* | ||
| 136 | * Replace the mcount stub with a pointer to the | ||
| 137 | * ip recorder function. | ||
| 138 | */ | ||
| 139 | memcpy(old, &mcount_call, MCOUNT_INSN_SIZE); | ||
| 140 | new = ftrace_call_replace(ip, *addr); | ||
| 141 | *addr = ftrace_modify_code(ip, old, new); | ||
| 142 | |||
| 143 | return 0; | ||
| 144 | } | ||
| 145 | |||
| 146 | int __init ftrace_dyn_arch_init(void *data) | 129 | int __init ftrace_dyn_arch_init(void *data) |
| 147 | { | 130 | { |
| 148 | /* This is running in kstop_machine */ | 131 | /* This is running in kstop_machine */ |
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index 8edc2359c419..260089dccfb0 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
| @@ -68,7 +68,7 @@ EXPORT_SYMBOL(single_step_exception); | |||
| 68 | EXPORT_SYMBOL(sys_sigreturn); | 68 | EXPORT_SYMBOL(sys_sigreturn); |
| 69 | #endif | 69 | #endif |
| 70 | 70 | ||
| 71 | #ifdef CONFIG_FTRACE | 71 | #ifdef CONFIG_FUNCTION_TRACER |
| 72 | EXPORT_SYMBOL(_mcount); | 72 | EXPORT_SYMBOL(_mcount); |
| 73 | #endif | 73 | #endif |
| 74 | 74 | ||
diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile index be60d64be7ad..50f169392551 100644 --- a/arch/powerpc/platforms/powermac/Makefile +++ b/arch/powerpc/platforms/powermac/Makefile | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | CFLAGS_bootx_init.o += -fPIC | 1 | CFLAGS_bootx_init.o += -fPIC |
| 2 | 2 | ||
| 3 | ifdef CONFIG_FTRACE | 3 | ifdef CONFIG_FUNCTION_TRACER |
| 4 | # Do not trace early boot code | 4 | # Do not trace early boot code |
| 5 | CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog | 5 | CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog |
| 6 | endif | 6 | endif |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 70b7645ce745..8116a3328a19 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
| @@ -241,19 +241,17 @@ config PACK_STACK | |||
| 241 | Say Y if you are unsure. | 241 | Say Y if you are unsure. |
| 242 | 242 | ||
| 243 | config SMALL_STACK | 243 | config SMALL_STACK |
| 244 | bool "Use 4kb/8kb for kernel stack instead of 8kb/16kb" | 244 | bool "Use 8kb for kernel stack instead of 16kb" |
| 245 | depends on PACK_STACK && !LOCKDEP | 245 | depends on PACK_STACK && 64BIT && !LOCKDEP |
| 246 | help | 246 | help |
| 247 | If you say Y here and the compiler supports the -mkernel-backchain | 247 | If you say Y here and the compiler supports the -mkernel-backchain |
| 248 | option the kernel will use a smaller kernel stack size. For 31 bit | 248 | option the kernel will use a smaller kernel stack size. The reduced |
| 249 | the reduced size is 4kb instead of 8kb and for 64 bit it is 8kb | 249 | size is 8kb instead of 16kb. This allows to run more threads on a |
| 250 | instead of 16kb. This allows to run more thread on a system and | 250 | system and reduces the pressure on the memory management for higher |
| 251 | reduces the pressure on the memory management for higher order | 251 | order page allocations. |
| 252 | page allocations. | ||
| 253 | 252 | ||
| 254 | Say N if you are unsure. | 253 | Say N if you are unsure. |
| 255 | 254 | ||
| 256 | |||
| 257 | config CHECK_STACK | 255 | config CHECK_STACK |
| 258 | bool "Detect kernel stack overflow" | 256 | bool "Detect kernel stack overflow" |
| 259 | help | 257 | help |
| @@ -384,7 +382,7 @@ config IPL | |||
| 384 | choice | 382 | choice |
| 385 | prompt "IPL method generated into head.S" | 383 | prompt "IPL method generated into head.S" |
| 386 | depends on IPL | 384 | depends on IPL |
| 387 | default IPL_TAPE | 385 | default IPL_VM |
| 388 | help | 386 | help |
| 389 | Select "tape" if you want to IPL the image from a Tape. | 387 | Select "tape" if you want to IPL the image from a Tape. |
| 390 | 388 | ||
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index a7f8979fb925..a06a47cdd5e0 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
| @@ -424,7 +424,7 @@ out: | |||
| 424 | */ | 424 | */ |
| 425 | int appldata_register_ops(struct appldata_ops *ops) | 425 | int appldata_register_ops(struct appldata_ops *ops) |
| 426 | { | 426 | { |
| 427 | if ((ops->size > APPLDATA_MAX_REC_SIZE) || (ops->size < 0)) | 427 | if (ops->size > APPLDATA_MAX_REC_SIZE) |
| 428 | return -EINVAL; | 428 | return -EINVAL; |
| 429 | 429 | ||
| 430 | ops->ctl_table = kzalloc(4 * sizeof(struct ctl_table), GFP_KERNEL); | 430 | ops->ctl_table = kzalloc(4 * sizeof(struct ctl_table), GFP_KERNEL); |
diff --git a/arch/s390/include/asm/kvm_virtio.h b/arch/s390/include/asm/kvm_virtio.h index 146100224def..c13568b9351c 100644 --- a/arch/s390/include/asm/kvm_virtio.h +++ b/arch/s390/include/asm/kvm_virtio.h | |||
| @@ -52,7 +52,7 @@ struct kvm_vqconfig { | |||
| 52 | 52 | ||
| 53 | #ifdef __KERNEL__ | 53 | #ifdef __KERNEL__ |
| 54 | /* early virtio console setup */ | 54 | /* early virtio console setup */ |
| 55 | #ifdef CONFIG_VIRTIO_CONSOLE | 55 | #ifdef CONFIG_S390_GUEST |
| 56 | extern void s390_virtio_console_init(void); | 56 | extern void s390_virtio_console_init(void); |
| 57 | #else | 57 | #else |
| 58 | static inline void s390_virtio_console_init(void) | 58 | static inline void s390_virtio_console_init(void) |
diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h index 5dd5e7b3476f..d2b4ff831477 100644 --- a/arch/s390/include/asm/mmu.h +++ b/arch/s390/include/asm/mmu.h | |||
| @@ -7,7 +7,8 @@ typedef struct { | |||
| 7 | unsigned long asce_bits; | 7 | unsigned long asce_bits; |
| 8 | unsigned long asce_limit; | 8 | unsigned long asce_limit; |
| 9 | int noexec; | 9 | int noexec; |
| 10 | int pgstes; | 10 | int has_pgste; /* The mmu context has extended page tables */ |
| 11 | int alloc_pgste; /* cloned contexts will have extended page tables */ | ||
| 11 | } mm_context_t; | 12 | } mm_context_t; |
| 12 | 13 | ||
| 13 | #endif | 14 | #endif |
diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h index 4c2fbf48c9c4..28ec870655af 100644 --- a/arch/s390/include/asm/mmu_context.h +++ b/arch/s390/include/asm/mmu_context.h | |||
| @@ -20,12 +20,25 @@ static inline int init_new_context(struct task_struct *tsk, | |||
| 20 | #ifdef CONFIG_64BIT | 20 | #ifdef CONFIG_64BIT |
| 21 | mm->context.asce_bits |= _ASCE_TYPE_REGION3; | 21 | mm->context.asce_bits |= _ASCE_TYPE_REGION3; |
| 22 | #endif | 22 | #endif |
| 23 | if (current->mm->context.pgstes) { | 23 | if (current->mm->context.alloc_pgste) { |
| 24 | /* | ||
| 25 | * alloc_pgste indicates, that any NEW context will be created | ||
| 26 | * with extended page tables. The old context is unchanged. The | ||
| 27 | * page table allocation and the page table operations will | ||
| 28 | * look at has_pgste to distinguish normal and extended page | ||
| 29 | * tables. The only way to create extended page tables is to | ||
| 30 | * set alloc_pgste and then create a new context (e.g. dup_mm). | ||
| 31 | * The page table allocation is called after init_new_context | ||
| 32 | * and if has_pgste is set, it will create extended page | ||
| 33 | * tables. | ||
| 34 | */ | ||
| 24 | mm->context.noexec = 0; | 35 | mm->context.noexec = 0; |
| 25 | mm->context.pgstes = 1; | 36 | mm->context.has_pgste = 1; |
| 37 | mm->context.alloc_pgste = 1; | ||
| 26 | } else { | 38 | } else { |
| 27 | mm->context.noexec = s390_noexec; | 39 | mm->context.noexec = s390_noexec; |
| 28 | mm->context.pgstes = 0; | 40 | mm->context.has_pgste = 0; |
| 41 | mm->context.alloc_pgste = 0; | ||
| 29 | } | 42 | } |
| 30 | mm->context.asce_limit = STACK_TOP_MAX; | 43 | mm->context.asce_limit = STACK_TOP_MAX; |
| 31 | crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm)); | 44 | crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm)); |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 1a928f84afd6..7fc76133b3e4 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
| @@ -679,7 +679,7 @@ static inline void pmd_clear(pmd_t *pmd) | |||
| 679 | 679 | ||
| 680 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 680 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
| 681 | { | 681 | { |
| 682 | if (mm->context.pgstes) | 682 | if (mm->context.has_pgste) |
| 683 | ptep_rcp_copy(ptep); | 683 | ptep_rcp_copy(ptep); |
| 684 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; | 684 | pte_val(*ptep) = _PAGE_TYPE_EMPTY; |
| 685 | if (mm->context.noexec) | 685 | if (mm->context.noexec) |
| @@ -763,7 +763,7 @@ static inline int kvm_s390_test_and_clear_page_dirty(struct mm_struct *mm, | |||
| 763 | struct page *page; | 763 | struct page *page; |
| 764 | unsigned int skey; | 764 | unsigned int skey; |
| 765 | 765 | ||
| 766 | if (!mm->context.pgstes) | 766 | if (!mm->context.has_pgste) |
| 767 | return -EINVAL; | 767 | return -EINVAL; |
| 768 | rcp_lock(ptep); | 768 | rcp_lock(ptep); |
| 769 | pgste = (unsigned long *) (ptep + PTRS_PER_PTE); | 769 | pgste = (unsigned long *) (ptep + PTRS_PER_PTE); |
| @@ -794,7 +794,7 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, | |||
| 794 | int young; | 794 | int young; |
| 795 | unsigned long *pgste; | 795 | unsigned long *pgste; |
| 796 | 796 | ||
| 797 | if (!vma->vm_mm->context.pgstes) | 797 | if (!vma->vm_mm->context.has_pgste) |
| 798 | return 0; | 798 | return 0; |
| 799 | physpage = pte_val(*ptep) & PAGE_MASK; | 799 | physpage = pte_val(*ptep) & PAGE_MASK; |
| 800 | pgste = (unsigned long *) (ptep + PTRS_PER_PTE); | 800 | pgste = (unsigned long *) (ptep + PTRS_PER_PTE); |
| @@ -844,7 +844,7 @@ static inline void __ptep_ipte(unsigned long address, pte_t *ptep) | |||
| 844 | static inline void ptep_invalidate(struct mm_struct *mm, | 844 | static inline void ptep_invalidate(struct mm_struct *mm, |
| 845 | unsigned long address, pte_t *ptep) | 845 | unsigned long address, pte_t *ptep) |
| 846 | { | 846 | { |
| 847 | if (mm->context.pgstes) { | 847 | if (mm->context.has_pgste) { |
| 848 | rcp_lock(ptep); | 848 | rcp_lock(ptep); |
| 849 | __ptep_ipte(address, ptep); | 849 | __ptep_ipte(address, ptep); |
| 850 | ptep_rcp_copy(ptep); | 850 | ptep_rcp_copy(ptep); |
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h index de3fad60c682..c1eaf9604da7 100644 --- a/arch/s390/include/asm/thread_info.h +++ b/arch/s390/include/asm/thread_info.h | |||
| @@ -15,13 +15,8 @@ | |||
| 15 | * Size of kernel stack for each process | 15 | * Size of kernel stack for each process |
| 16 | */ | 16 | */ |
| 17 | #ifndef __s390x__ | 17 | #ifndef __s390x__ |
| 18 | #ifndef __SMALL_STACK | ||
| 19 | #define THREAD_ORDER 1 | 18 | #define THREAD_ORDER 1 |
| 20 | #define ASYNC_ORDER 1 | 19 | #define ASYNC_ORDER 1 |
| 21 | #else | ||
| 22 | #define THREAD_ORDER 0 | ||
| 23 | #define ASYNC_ORDER 0 | ||
| 24 | #endif | ||
| 25 | #else /* __s390x__ */ | 20 | #else /* __s390x__ */ |
| 26 | #ifndef __SMALL_STACK | 21 | #ifndef __SMALL_STACK |
| 27 | #define THREAD_ORDER 2 | 22 | #define THREAD_ORDER 2 |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 9e8b1f9b8f4d..b5595688a477 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
| @@ -1119,9 +1119,7 @@ out: | |||
| 1119 | return rc; | 1119 | return rc; |
| 1120 | } | 1120 | } |
| 1121 | 1121 | ||
| 1122 | static ssize_t __ref rescan_store(struct sys_device *dev, | 1122 | static ssize_t __ref rescan_store(struct sysdev_class *class, const char *buf, |
| 1123 | struct sysdev_attribute *attr, | ||
| 1124 | const char *buf, | ||
| 1125 | size_t count) | 1123 | size_t count) |
| 1126 | { | 1124 | { |
| 1127 | int rc; | 1125 | int rc; |
| @@ -1129,12 +1127,10 @@ static ssize_t __ref rescan_store(struct sys_device *dev, | |||
| 1129 | rc = smp_rescan_cpus(); | 1127 | rc = smp_rescan_cpus(); |
| 1130 | return rc ? rc : count; | 1128 | return rc ? rc : count; |
| 1131 | } | 1129 | } |
| 1132 | static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store); | 1130 | static SYSDEV_CLASS_ATTR(rescan, 0200, NULL, rescan_store); |
| 1133 | #endif /* CONFIG_HOTPLUG_CPU */ | 1131 | #endif /* CONFIG_HOTPLUG_CPU */ |
| 1134 | 1132 | ||
| 1135 | static ssize_t dispatching_show(struct sys_device *dev, | 1133 | static ssize_t dispatching_show(struct sysdev_class *class, char *buf) |
| 1136 | struct sysdev_attribute *attr, | ||
| 1137 | char *buf) | ||
| 1138 | { | 1134 | { |
| 1139 | ssize_t count; | 1135 | ssize_t count; |
| 1140 | 1136 | ||
| @@ -1144,9 +1140,8 @@ static ssize_t dispatching_show(struct sys_device *dev, | |||
| 1144 | return count; | 1140 | return count; |
| 1145 | } | 1141 | } |
| 1146 | 1142 | ||
| 1147 | static ssize_t dispatching_store(struct sys_device *dev, | 1143 | static ssize_t dispatching_store(struct sysdev_class *dev, const char *buf, |
| 1148 | struct sysdev_attribute *attr, | 1144 | size_t count) |
| 1149 | const char *buf, size_t count) | ||
| 1150 | { | 1145 | { |
| 1151 | int val, rc; | 1146 | int val, rc; |
| 1152 | char delim; | 1147 | char delim; |
| @@ -1168,7 +1163,8 @@ out: | |||
| 1168 | put_online_cpus(); | 1163 | put_online_cpus(); |
| 1169 | return rc ? rc : count; | 1164 | return rc ? rc : count; |
| 1170 | } | 1165 | } |
| 1171 | static SYSDEV_ATTR(dispatching, 0644, dispatching_show, dispatching_store); | 1166 | static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show, |
| 1167 | dispatching_store); | ||
| 1172 | 1168 | ||
| 1173 | static int __init topology_init(void) | 1169 | static int __init topology_init(void) |
| 1174 | { | 1170 | { |
| @@ -1178,13 +1174,11 @@ static int __init topology_init(void) | |||
| 1178 | register_cpu_notifier(&smp_cpu_nb); | 1174 | register_cpu_notifier(&smp_cpu_nb); |
| 1179 | 1175 | ||
| 1180 | #ifdef CONFIG_HOTPLUG_CPU | 1176 | #ifdef CONFIG_HOTPLUG_CPU |
| 1181 | rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj, | 1177 | rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_rescan); |
| 1182 | &attr_rescan.attr); | ||
| 1183 | if (rc) | 1178 | if (rc) |
| 1184 | return rc; | 1179 | return rc; |
| 1185 | #endif | 1180 | #endif |
| 1186 | rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj, | 1181 | rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_dispatching); |
| 1187 | &attr_dispatching.attr); | ||
| 1188 | if (rc) | 1182 | if (rc) |
| 1189 | return rc; | 1183 | return rc; |
| 1190 | for_each_present_cpu(cpu) { | 1184 | for_each_present_cpu(cpu) { |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 3d98ba82ea67..ef3635b52fc0 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -169,7 +169,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm) | |||
| 169 | unsigned long *table; | 169 | unsigned long *table; |
| 170 | unsigned long bits; | 170 | unsigned long bits; |
| 171 | 171 | ||
| 172 | bits = (mm->context.noexec || mm->context.pgstes) ? 3UL : 1UL; | 172 | bits = (mm->context.noexec || mm->context.has_pgste) ? 3UL : 1UL; |
| 173 | spin_lock(&mm->page_table_lock); | 173 | spin_lock(&mm->page_table_lock); |
| 174 | page = NULL; | 174 | page = NULL; |
| 175 | if (!list_empty(&mm->context.pgtable_list)) { | 175 | if (!list_empty(&mm->context.pgtable_list)) { |
| @@ -186,7 +186,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm) | |||
| 186 | pgtable_page_ctor(page); | 186 | pgtable_page_ctor(page); |
| 187 | page->flags &= ~FRAG_MASK; | 187 | page->flags &= ~FRAG_MASK; |
| 188 | table = (unsigned long *) page_to_phys(page); | 188 | table = (unsigned long *) page_to_phys(page); |
| 189 | if (mm->context.pgstes) | 189 | if (mm->context.has_pgste) |
| 190 | clear_table_pgstes(table); | 190 | clear_table_pgstes(table); |
| 191 | else | 191 | else |
| 192 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE); | 192 | clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE); |
| @@ -210,7 +210,7 @@ void page_table_free(struct mm_struct *mm, unsigned long *table) | |||
| 210 | struct page *page; | 210 | struct page *page; |
| 211 | unsigned long bits; | 211 | unsigned long bits; |
| 212 | 212 | ||
| 213 | bits = (mm->context.noexec || mm->context.pgstes) ? 3UL : 1UL; | 213 | bits = (mm->context.noexec || mm->context.has_pgste) ? 3UL : 1UL; |
| 214 | bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); | 214 | bits <<= (__pa(table) & (PAGE_SIZE - 1)) / 256 / sizeof(unsigned long); |
| 215 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | 215 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); |
| 216 | spin_lock(&mm->page_table_lock); | 216 | spin_lock(&mm->page_table_lock); |
| @@ -257,7 +257,7 @@ int s390_enable_sie(void) | |||
| 257 | struct mm_struct *mm, *old_mm; | 257 | struct mm_struct *mm, *old_mm; |
| 258 | 258 | ||
| 259 | /* Do we have pgstes? if yes, we are done */ | 259 | /* Do we have pgstes? if yes, we are done */ |
| 260 | if (tsk->mm->context.pgstes) | 260 | if (tsk->mm->context.has_pgste) |
| 261 | return 0; | 261 | return 0; |
| 262 | 262 | ||
| 263 | /* lets check if we are allowed to replace the mm */ | 263 | /* lets check if we are allowed to replace the mm */ |
| @@ -269,14 +269,14 @@ int s390_enable_sie(void) | |||
| 269 | } | 269 | } |
| 270 | task_unlock(tsk); | 270 | task_unlock(tsk); |
| 271 | 271 | ||
| 272 | /* we copy the mm with pgstes enabled */ | 272 | /* we copy the mm and let dup_mm create the page tables with_pgstes */ |
| 273 | tsk->mm->context.pgstes = 1; | 273 | tsk->mm->context.alloc_pgste = 1; |
| 274 | mm = dup_mm(tsk); | 274 | mm = dup_mm(tsk); |
| 275 | tsk->mm->context.pgstes = 0; | 275 | tsk->mm->context.alloc_pgste = 0; |
| 276 | if (!mm) | 276 | if (!mm) |
| 277 | return -ENOMEM; | 277 | return -ENOMEM; |
| 278 | 278 | ||
| 279 | /* Now lets check again if somebody attached ptrace etc */ | 279 | /* Now lets check again if something happened */ |
| 280 | task_lock(tsk); | 280 | task_lock(tsk); |
| 281 | if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 || | 281 | if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 || |
| 282 | tsk->mm != tsk->active_mm || tsk->mm->ioctx_list) { | 282 | tsk->mm != tsk->active_mm || tsk->mm->ioctx_list) { |
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index 035b15af90d8..3b96e70b4670 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig | |||
| @@ -11,8 +11,7 @@ config SPARC | |||
| 11 | config SPARC64 | 11 | config SPARC64 |
| 12 | bool | 12 | bool |
| 13 | default y | 13 | default y |
| 14 | select HAVE_DYNAMIC_FTRACE | 14 | select HAVE_FUNCTION_TRACER |
| 15 | select HAVE_FTRACE | ||
| 16 | select HAVE_IDE | 15 | select HAVE_IDE |
| 17 | select HAVE_LMB | 16 | select HAVE_LMB |
| 18 | select HAVE_ARCH_KGDB | 17 | select HAVE_ARCH_KGDB |
diff --git a/arch/sparc64/Kconfig.debug b/arch/sparc64/Kconfig.debug index d6d32d178fc8..c40515c06690 100644 --- a/arch/sparc64/Kconfig.debug +++ b/arch/sparc64/Kconfig.debug | |||
| @@ -33,7 +33,7 @@ config DEBUG_PAGEALLOC | |||
| 33 | 33 | ||
| 34 | config MCOUNT | 34 | config MCOUNT |
| 35 | bool | 35 | bool |
| 36 | depends on STACK_DEBUG || FTRACE | 36 | depends on STACK_DEBUG || FUNCTION_TRACER |
| 37 | default y | 37 | default y |
| 38 | 38 | ||
| 39 | config FRAME_POINTER | 39 | config FRAME_POINTER |
diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile index c0b8009ab196..b3e0b986bef8 100644 --- a/arch/sparc64/kernel/Makefile +++ b/arch/sparc64/kernel/Makefile | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | EXTRA_AFLAGS := -ansi | 5 | EXTRA_AFLAGS := -ansi |
| 6 | EXTRA_CFLAGS := -Werror | 6 | EXTRA_CFLAGS := -Werror |
| 7 | 7 | ||
| 8 | CFLAGS_REMOVE_ftrace.o = -pg | ||
| 9 | |||
| 8 | extra-y := head.o init_task.o vmlinux.lds | 10 | extra-y := head.o init_task.o vmlinux.lds |
| 9 | 11 | ||
| 10 | obj-y := process.o setup.o cpu.o idprom.o reboot.o \ | 12 | obj-y := process.o setup.o cpu.o idprom.o reboot.o \ |
diff --git a/arch/sparc64/kernel/ftrace.c b/arch/sparc64/kernel/ftrace.c index 4298d0aee713..d0218e73f982 100644 --- a/arch/sparc64/kernel/ftrace.c +++ b/arch/sparc64/kernel/ftrace.c | |||
| @@ -9,12 +9,12 @@ | |||
| 9 | 9 | ||
| 10 | static const u32 ftrace_nop = 0x01000000; | 10 | static const u32 ftrace_nop = 0x01000000; |
| 11 | 11 | ||
| 12 | notrace unsigned char *ftrace_nop_replace(void) | 12 | unsigned char *ftrace_nop_replace(void) |
| 13 | { | 13 | { |
| 14 | return (char *)&ftrace_nop; | 14 | return (char *)&ftrace_nop; |
| 15 | } | 15 | } |
| 16 | 16 | ||
| 17 | notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | 17 | unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) |
| 18 | { | 18 | { |
| 19 | static u32 call; | 19 | static u32 call; |
| 20 | s32 off; | 20 | s32 off; |
| @@ -25,7 +25,7 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
| 25 | return (unsigned char *) &call; | 25 | return (unsigned char *) &call; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | notrace int | 28 | int |
| 29 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, | 29 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, |
| 30 | unsigned char *new_code) | 30 | unsigned char *new_code) |
| 31 | { | 31 | { |
| @@ -59,7 +59,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
| 59 | return faulted; | 59 | return faulted; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | notrace int ftrace_update_ftrace_func(ftrace_func_t func) | 62 | int ftrace_update_ftrace_func(ftrace_func_t func) |
| 63 | { | 63 | { |
| 64 | unsigned long ip = (unsigned long)(&ftrace_call); | 64 | unsigned long ip = (unsigned long)(&ftrace_call); |
| 65 | unsigned char old[MCOUNT_INSN_SIZE], *new; | 65 | unsigned char old[MCOUNT_INSN_SIZE], *new; |
| @@ -69,24 +69,6 @@ notrace int ftrace_update_ftrace_func(ftrace_func_t func) | |||
| 69 | return ftrace_modify_code(ip, old, new); | 69 | return ftrace_modify_code(ip, old, new); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | notrace int ftrace_mcount_set(unsigned long *data) | ||
| 73 | { | ||
| 74 | unsigned long ip = (long)(&mcount_call); | ||
| 75 | unsigned long *addr = data; | ||
| 76 | unsigned char old[MCOUNT_INSN_SIZE], *new; | ||
| 77 | |||
| 78 | /* | ||
| 79 | * Replace the mcount stub with a pointer to the | ||
| 80 | * ip recorder function. | ||
| 81 | */ | ||
| 82 | memcpy(old, &mcount_call, MCOUNT_INSN_SIZE); | ||
| 83 | new = ftrace_call_replace(ip, *addr); | ||
| 84 | *addr = ftrace_modify_code(ip, old, new); | ||
| 85 | |||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | |||
| 89 | |||
| 90 | int __init ftrace_dyn_arch_init(void *data) | 72 | int __init ftrace_dyn_arch_init(void *data) |
| 91 | { | 73 | { |
| 92 | ftrace_mcount_set(data); | 74 | ftrace_mcount_set(data); |
diff --git a/arch/sparc64/lib/mcount.S b/arch/sparc64/lib/mcount.S index fad90ddb3a28..7ce9c65f3592 100644 --- a/arch/sparc64/lib/mcount.S +++ b/arch/sparc64/lib/mcount.S | |||
| @@ -93,7 +93,7 @@ mcount: | |||
| 93 | nop | 93 | nop |
| 94 | 1: | 94 | 1: |
| 95 | #endif | 95 | #endif |
| 96 | #ifdef CONFIG_FTRACE | 96 | #ifdef CONFIG_FUNCTION_TRACER |
| 97 | #ifdef CONFIG_DYNAMIC_FTRACE | 97 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 98 | mov %o7, %o0 | 98 | mov %o7, %o0 |
| 99 | .globl mcount_call | 99 | .globl mcount_call |
| @@ -119,7 +119,7 @@ mcount_call: | |||
| 119 | .size _mcount,.-_mcount | 119 | .size _mcount,.-_mcount |
| 120 | .size mcount,.-mcount | 120 | .size mcount,.-mcount |
| 121 | 121 | ||
| 122 | #ifdef CONFIG_FTRACE | 122 | #ifdef CONFIG_FUNCTION_TRACER |
| 123 | .globl ftrace_stub | 123 | .globl ftrace_stub |
| 124 | .type ftrace_stub,#function | 124 | .type ftrace_stub,#function |
| 125 | ftrace_stub: | 125 | ftrace_stub: |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 350bee1d54dc..d11d7b513191 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -28,7 +28,7 @@ config X86 | |||
| 28 | select HAVE_KRETPROBES | 28 | select HAVE_KRETPROBES |
| 29 | select HAVE_FTRACE_MCOUNT_RECORD | 29 | select HAVE_FTRACE_MCOUNT_RECORD |
| 30 | select HAVE_DYNAMIC_FTRACE | 30 | select HAVE_DYNAMIC_FTRACE |
| 31 | select HAVE_FTRACE | 31 | select HAVE_FUNCTION_TRACER |
| 32 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | 32 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) |
| 33 | select HAVE_ARCH_KGDB if !X86_VOYAGER | 33 | select HAVE_ARCH_KGDB if !X86_VOYAGER |
| 34 | select HAVE_ARCH_TRACEHOOK | 34 | select HAVE_ARCH_TRACEHOOK |
diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 4a5397bfce27..7f225a4b2a26 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h | |||
| @@ -255,9 +255,11 @@ static inline unsigned long dma_alloc_coherent_mask(struct device *dev, | |||
| 255 | 255 | ||
| 256 | static inline gfp_t dma_alloc_coherent_gfp_flags(struct device *dev, gfp_t gfp) | 256 | static inline gfp_t dma_alloc_coherent_gfp_flags(struct device *dev, gfp_t gfp) |
| 257 | { | 257 | { |
| 258 | #ifdef CONFIG_X86_64 | ||
| 259 | unsigned long dma_mask = dma_alloc_coherent_mask(dev, gfp); | 258 | unsigned long dma_mask = dma_alloc_coherent_mask(dev, gfp); |
| 260 | 259 | ||
| 260 | if (dma_mask <= DMA_24BIT_MASK) | ||
| 261 | gfp |= GFP_DMA; | ||
| 262 | #ifdef CONFIG_X86_64 | ||
| 261 | if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA)) | 263 | if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA)) |
| 262 | gfp |= GFP_DMA32; | 264 | gfp |= GFP_DMA32; |
| 263 | #endif | 265 | #endif |
diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index 47f7e65e6c1d..9e8bc29b8b17 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ASM_X86_FTRACE_H | 1 | #ifndef _ASM_X86_FTRACE_H |
| 2 | #define _ASM_X86_FTRACE_H | 2 | #define _ASM_X86_FTRACE_H |
| 3 | 3 | ||
| 4 | #ifdef CONFIG_FTRACE | 4 | #ifdef CONFIG_FUNCTION_TRACER |
| 5 | #define MCOUNT_ADDR ((long)(mcount)) | 5 | #define MCOUNT_ADDR ((long)(mcount)) |
| 6 | #define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */ | 6 | #define MCOUNT_INSN_SIZE 5 /* sizeof mcount call */ |
| 7 | 7 | ||
| @@ -19,6 +19,6 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) | |||
| 19 | } | 19 | } |
| 20 | #endif | 20 | #endif |
| 21 | 21 | ||
| 22 | #endif /* CONFIG_FTRACE */ | 22 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 23 | 23 | ||
| 24 | #endif /* _ASM_X86_FTRACE_H */ | 24 | #endif /* _ASM_X86_FTRACE_H */ |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 65679d006337..8346be87cfa1 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
| @@ -364,6 +364,9 @@ struct kvm_arch{ | |||
| 364 | 364 | ||
| 365 | struct page *ept_identity_pagetable; | 365 | struct page *ept_identity_pagetable; |
| 366 | bool ept_identity_pagetable_done; | 366 | bool ept_identity_pagetable_done; |
| 367 | |||
| 368 | unsigned long irq_sources_bitmap; | ||
| 369 | unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; | ||
| 367 | }; | 370 | }; |
| 368 | 371 | ||
| 369 | struct kvm_vm_stat { | 372 | struct kvm_vm_stat { |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index d7e5a58ee22f..e489ff9cb3e2 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -6,11 +6,12 @@ extra-y := head_$(BITS).o head$(BITS).o head.o init_task.o vmlinu | |||
| 6 | 6 | ||
| 7 | CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE) | 7 | CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE) |
| 8 | 8 | ||
| 9 | ifdef CONFIG_FTRACE | 9 | ifdef CONFIG_FUNCTION_TRACER |
| 10 | # Do not profile debug and lowlevel utilities | 10 | # Do not profile debug and lowlevel utilities |
| 11 | CFLAGS_REMOVE_tsc.o = -pg | 11 | CFLAGS_REMOVE_tsc.o = -pg |
| 12 | CFLAGS_REMOVE_rtc.o = -pg | 12 | CFLAGS_REMOVE_rtc.o = -pg |
| 13 | CFLAGS_REMOVE_paravirt-spinlocks.o = -pg | 13 | CFLAGS_REMOVE_paravirt-spinlocks.o = -pg |
| 14 | CFLAGS_REMOVE_ftrace.o = -pg | ||
| 14 | endif | 15 | endif |
| 15 | 16 | ||
| 16 | # | 17 | # |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index dd65143941a8..28b597ef9ca1 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -1149,7 +1149,7 @@ ENDPROC(xen_failsafe_callback) | |||
| 1149 | 1149 | ||
| 1150 | #endif /* CONFIG_XEN */ | 1150 | #endif /* CONFIG_XEN */ |
| 1151 | 1151 | ||
| 1152 | #ifdef CONFIG_FTRACE | 1152 | #ifdef CONFIG_FUNCTION_TRACER |
| 1153 | #ifdef CONFIG_DYNAMIC_FTRACE | 1153 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 1154 | 1154 | ||
| 1155 | ENTRY(mcount) | 1155 | ENTRY(mcount) |
| @@ -1204,7 +1204,7 @@ trace: | |||
| 1204 | jmp ftrace_stub | 1204 | jmp ftrace_stub |
| 1205 | END(mcount) | 1205 | END(mcount) |
| 1206 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 1206 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
| 1207 | #endif /* CONFIG_FTRACE */ | 1207 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 1208 | 1208 | ||
| 1209 | .section .rodata,"a" | 1209 | .section .rodata,"a" |
| 1210 | #include "syscall_table_32.S" | 1210 | #include "syscall_table_32.S" |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 09e7145484c5..b86f332c96a6 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | 61 | ||
| 62 | .code64 | 62 | .code64 |
| 63 | 63 | ||
| 64 | #ifdef CONFIG_FTRACE | 64 | #ifdef CONFIG_FUNCTION_TRACER |
| 65 | #ifdef CONFIG_DYNAMIC_FTRACE | 65 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 66 | ENTRY(mcount) | 66 | ENTRY(mcount) |
| 67 | retq | 67 | retq |
| @@ -138,7 +138,7 @@ trace: | |||
| 138 | jmp ftrace_stub | 138 | jmp ftrace_stub |
| 139 | END(mcount) | 139 | END(mcount) |
| 140 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 140 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
| 141 | #endif /* CONFIG_FTRACE */ | 141 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 142 | 142 | ||
| 143 | #ifndef CONFIG_PREEMPT | 143 | #ifndef CONFIG_PREEMPT |
| 144 | #define retint_kernel retint_restore_args | 144 | #define retint_kernel retint_restore_args |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index d073d981a730..50ea0ac8c9bf 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
| @@ -21,8 +21,7 @@ | |||
| 21 | #include <asm/nops.h> | 21 | #include <asm/nops.h> |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | /* Long is fine, even if it is only 4 bytes ;-) */ | 24 | static unsigned char ftrace_nop[MCOUNT_INSN_SIZE]; |
| 25 | static unsigned long *ftrace_nop; | ||
| 26 | 25 | ||
| 27 | union ftrace_code_union { | 26 | union ftrace_code_union { |
| 28 | char code[MCOUNT_INSN_SIZE]; | 27 | char code[MCOUNT_INSN_SIZE]; |
| @@ -33,17 +32,17 @@ union ftrace_code_union { | |||
| 33 | }; | 32 | }; |
| 34 | 33 | ||
| 35 | 34 | ||
| 36 | static int notrace ftrace_calc_offset(long ip, long addr) | 35 | static int ftrace_calc_offset(long ip, long addr) |
| 37 | { | 36 | { |
| 38 | return (int)(addr - ip); | 37 | return (int)(addr - ip); |
| 39 | } | 38 | } |
| 40 | 39 | ||
| 41 | notrace unsigned char *ftrace_nop_replace(void) | 40 | unsigned char *ftrace_nop_replace(void) |
| 42 | { | 41 | { |
| 43 | return (char *)ftrace_nop; | 42 | return ftrace_nop; |
| 44 | } | 43 | } |
| 45 | 44 | ||
| 46 | notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | 45 | unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) |
| 47 | { | 46 | { |
| 48 | static union ftrace_code_union calc; | 47 | static union ftrace_code_union calc; |
| 49 | 48 | ||
| @@ -57,7 +56,7 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
| 57 | return calc.code; | 56 | return calc.code; |
| 58 | } | 57 | } |
| 59 | 58 | ||
| 60 | notrace int | 59 | int |
| 61 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, | 60 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, |
| 62 | unsigned char *new_code) | 61 | unsigned char *new_code) |
| 63 | { | 62 | { |
| @@ -66,26 +65,31 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
| 66 | /* | 65 | /* |
| 67 | * Note: Due to modules and __init, code can | 66 | * Note: Due to modules and __init, code can |
| 68 | * disappear and change, we need to protect against faulting | 67 | * disappear and change, we need to protect against faulting |
| 69 | * as well as code changing. | 68 | * as well as code changing. We do this by using the |
| 69 | * probe_kernel_* functions. | ||
| 70 | * | 70 | * |
| 71 | * No real locking needed, this code is run through | 71 | * No real locking needed, this code is run through |
| 72 | * kstop_machine, or before SMP starts. | 72 | * kstop_machine, or before SMP starts. |
| 73 | */ | 73 | */ |
| 74 | if (__copy_from_user_inatomic(replaced, (char __user *)ip, MCOUNT_INSN_SIZE)) | ||
| 75 | return 1; | ||
| 76 | 74 | ||
| 75 | /* read the text we want to modify */ | ||
| 76 | if (probe_kernel_read(replaced, (void *)ip, MCOUNT_INSN_SIZE)) | ||
| 77 | return -EFAULT; | ||
| 78 | |||
| 79 | /* Make sure it is what we expect it to be */ | ||
| 77 | if (memcmp(replaced, old_code, MCOUNT_INSN_SIZE) != 0) | 80 | if (memcmp(replaced, old_code, MCOUNT_INSN_SIZE) != 0) |
| 78 | return 2; | 81 | return -EINVAL; |
| 79 | 82 | ||
| 80 | WARN_ON_ONCE(__copy_to_user_inatomic((char __user *)ip, new_code, | 83 | /* replace the text with the new text */ |
| 81 | MCOUNT_INSN_SIZE)); | 84 | if (probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE)) |
| 85 | return -EPERM; | ||
| 82 | 86 | ||
| 83 | sync_core(); | 87 | sync_core(); |
| 84 | 88 | ||
| 85 | return 0; | 89 | return 0; |
| 86 | } | 90 | } |
| 87 | 91 | ||
| 88 | notrace int ftrace_update_ftrace_func(ftrace_func_t func) | 92 | int ftrace_update_ftrace_func(ftrace_func_t func) |
| 89 | { | 93 | { |
| 90 | unsigned long ip = (unsigned long)(&ftrace_call); | 94 | unsigned long ip = (unsigned long)(&ftrace_call); |
| 91 | unsigned char old[MCOUNT_INSN_SIZE], *new; | 95 | unsigned char old[MCOUNT_INSN_SIZE], *new; |
| @@ -98,13 +102,6 @@ notrace int ftrace_update_ftrace_func(ftrace_func_t func) | |||
| 98 | return ret; | 102 | return ret; |
| 99 | } | 103 | } |
| 100 | 104 | ||
| 101 | notrace int ftrace_mcount_set(unsigned long *data) | ||
| 102 | { | ||
| 103 | /* mcount is initialized as a nop */ | ||
| 104 | *data = 0; | ||
| 105 | return 0; | ||
| 106 | } | ||
| 107 | |||
| 108 | int __init ftrace_dyn_arch_init(void *data) | 105 | int __init ftrace_dyn_arch_init(void *data) |
| 109 | { | 106 | { |
| 110 | extern const unsigned char ftrace_test_p6nop[]; | 107 | extern const unsigned char ftrace_test_p6nop[]; |
| @@ -127,9 +124,6 @@ int __init ftrace_dyn_arch_init(void *data) | |||
| 127 | * TODO: check the cpuid to determine the best nop. | 124 | * TODO: check the cpuid to determine the best nop. |
| 128 | */ | 125 | */ |
| 129 | asm volatile ( | 126 | asm volatile ( |
| 130 | "jmp ftrace_test_jmp\n" | ||
| 131 | /* This code needs to stay around */ | ||
| 132 | ".section .text, \"ax\"\n" | ||
| 133 | "ftrace_test_jmp:" | 127 | "ftrace_test_jmp:" |
| 134 | "jmp ftrace_test_p6nop\n" | 128 | "jmp ftrace_test_p6nop\n" |
| 135 | "nop\n" | 129 | "nop\n" |
| @@ -140,8 +134,6 @@ int __init ftrace_dyn_arch_init(void *data) | |||
| 140 | "jmp 1f\n" | 134 | "jmp 1f\n" |
| 141 | "ftrace_test_nop5:" | 135 | "ftrace_test_nop5:" |
| 142 | ".byte 0x66,0x66,0x66,0x66,0x90\n" | 136 | ".byte 0x66,0x66,0x66,0x66,0x90\n" |
| 143 | "jmp 1f\n" | ||
| 144 | ".previous\n" | ||
| 145 | "1:" | 137 | "1:" |
| 146 | ".section .fixup, \"ax\"\n" | 138 | ".section .fixup, \"ax\"\n" |
| 147 | "2: movl $1, %0\n" | 139 | "2: movl $1, %0\n" |
| @@ -156,15 +148,15 @@ int __init ftrace_dyn_arch_init(void *data) | |||
| 156 | switch (faulted) { | 148 | switch (faulted) { |
| 157 | case 0: | 149 | case 0: |
| 158 | pr_info("ftrace: converting mcount calls to 0f 1f 44 00 00\n"); | 150 | pr_info("ftrace: converting mcount calls to 0f 1f 44 00 00\n"); |
| 159 | ftrace_nop = (unsigned long *)ftrace_test_p6nop; | 151 | memcpy(ftrace_nop, ftrace_test_p6nop, MCOUNT_INSN_SIZE); |
| 160 | break; | 152 | break; |
| 161 | case 1: | 153 | case 1: |
| 162 | pr_info("ftrace: converting mcount calls to 66 66 66 66 90\n"); | 154 | pr_info("ftrace: converting mcount calls to 66 66 66 66 90\n"); |
| 163 | ftrace_nop = (unsigned long *)ftrace_test_nop5; | 155 | memcpy(ftrace_nop, ftrace_test_nop5, MCOUNT_INSN_SIZE); |
| 164 | break; | 156 | break; |
| 165 | case 2: | 157 | case 2: |
| 166 | pr_info("ftrace: converting mcount calls to jmp . + 5\n"); | 158 | pr_info("ftrace: converting mcount calls to jmp . + 5\n"); |
| 167 | ftrace_nop = (unsigned long *)ftrace_test_jmp; | 159 | memcpy(ftrace_nop, ftrace_test_jmp, MCOUNT_INSN_SIZE); |
| 168 | break; | 160 | break; |
| 169 | } | 161 | } |
| 170 | 162 | ||
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 680a06557c5e..2c7dbdb98278 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | #include <linux/ctype.h> | 15 | #include <linux/ctype.h> |
| 16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
| 18 | #include <linux/bootmem.h> | ||
| 19 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 20 | #include <linux/hardirq.h> | 19 | #include <linux/hardirq.h> |
| 21 | #include <asm/smp.h> | 20 | #include <asm/smp.h> |
| @@ -398,16 +397,16 @@ void __init uv_system_init(void) | |||
| 398 | printk(KERN_DEBUG "UV: Found %d blades\n", uv_num_possible_blades()); | 397 | printk(KERN_DEBUG "UV: Found %d blades\n", uv_num_possible_blades()); |
| 399 | 398 | ||
| 400 | bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades(); | 399 | bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades(); |
| 401 | uv_blade_info = alloc_bootmem_pages(bytes); | 400 | uv_blade_info = kmalloc(bytes, GFP_KERNEL); |
| 402 | 401 | ||
| 403 | get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); | 402 | get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); |
| 404 | 403 | ||
| 405 | bytes = sizeof(uv_node_to_blade[0]) * num_possible_nodes(); | 404 | bytes = sizeof(uv_node_to_blade[0]) * num_possible_nodes(); |
| 406 | uv_node_to_blade = alloc_bootmem_pages(bytes); | 405 | uv_node_to_blade = kmalloc(bytes, GFP_KERNEL); |
| 407 | memset(uv_node_to_blade, 255, bytes); | 406 | memset(uv_node_to_blade, 255, bytes); |
| 408 | 407 | ||
| 409 | bytes = sizeof(uv_cpu_to_blade[0]) * num_possible_cpus(); | 408 | bytes = sizeof(uv_cpu_to_blade[0]) * num_possible_cpus(); |
| 410 | uv_cpu_to_blade = alloc_bootmem_pages(bytes); | 409 | uv_cpu_to_blade = kmalloc(bytes, GFP_KERNEL); |
| 411 | memset(uv_cpu_to_blade, 255, bytes); | 410 | memset(uv_cpu_to_blade, 255, bytes); |
| 412 | 411 | ||
| 413 | blade = 0; | 412 | blade = 0; |
diff --git a/arch/x86/kernel/i386_ksyms_32.c b/arch/x86/kernel/i386_ksyms_32.c index dd7ebee446af..43cec6bdda63 100644 --- a/arch/x86/kernel/i386_ksyms_32.c +++ b/arch/x86/kernel/i386_ksyms_32.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | #include <asm/desc.h> | 5 | #include <asm/desc.h> |
| 6 | #include <asm/ftrace.h> | 6 | #include <asm/ftrace.h> |
| 7 | 7 | ||
| 8 | #ifdef CONFIG_FTRACE | 8 | #ifdef CONFIG_FUNCTION_TRACER |
| 9 | /* mcount is defined in assembly */ | 9 | /* mcount is defined in assembly */ |
| 10 | EXPORT_SYMBOL(mcount); | 10 | EXPORT_SYMBOL(mcount); |
| 11 | #endif | 11 | #endif |
diff --git a/arch/x86/kernel/pci-swiotlb_64.c b/arch/x86/kernel/pci-swiotlb_64.c index c4ce0332759e..3c539d111abb 100644 --- a/arch/x86/kernel/pci-swiotlb_64.c +++ b/arch/x86/kernel/pci-swiotlb_64.c | |||
| @@ -18,9 +18,21 @@ swiotlb_map_single_phys(struct device *hwdev, phys_addr_t paddr, size_t size, | |||
| 18 | return swiotlb_map_single(hwdev, phys_to_virt(paddr), size, direction); | 18 | return swiotlb_map_single(hwdev, phys_to_virt(paddr), size, direction); |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | static void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size, | ||
| 22 | dma_addr_t *dma_handle, gfp_t flags) | ||
| 23 | { | ||
| 24 | void *vaddr; | ||
| 25 | |||
| 26 | vaddr = dma_generic_alloc_coherent(hwdev, size, dma_handle, flags); | ||
| 27 | if (vaddr) | ||
| 28 | return vaddr; | ||
| 29 | |||
| 30 | return swiotlb_alloc_coherent(hwdev, size, dma_handle, flags); | ||
| 31 | } | ||
| 32 | |||
| 21 | struct dma_mapping_ops swiotlb_dma_ops = { | 33 | struct dma_mapping_ops swiotlb_dma_ops = { |
| 22 | .mapping_error = swiotlb_dma_mapping_error, | 34 | .mapping_error = swiotlb_dma_mapping_error, |
| 23 | .alloc_coherent = swiotlb_alloc_coherent, | 35 | .alloc_coherent = x86_swiotlb_alloc_coherent, |
| 24 | .free_coherent = swiotlb_free_coherent, | 36 | .free_coherent = swiotlb_free_coherent, |
| 25 | .map_single = swiotlb_map_single_phys, | 37 | .map_single = swiotlb_map_single_phys, |
| 26 | .unmap_single = swiotlb_unmap_single, | 38 | .unmap_single = swiotlb_unmap_single, |
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c index b545f371b5f5..695e426aa354 100644 --- a/arch/x86/kernel/x8664_ksyms_64.c +++ b/arch/x86/kernel/x8664_ksyms_64.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <asm/desc.h> | 12 | #include <asm/desc.h> |
| 13 | #include <asm/ftrace.h> | 13 | #include <asm/ftrace.h> |
| 14 | 14 | ||
| 15 | #ifdef CONFIG_FTRACE | 15 | #ifdef CONFIG_FUNCTION_TRACER |
| 16 | /* mcount is defined in assembly */ | 16 | /* mcount is defined in assembly */ |
| 17 | EXPORT_SYMBOL(mcount); | 17 | EXPORT_SYMBOL(mcount); |
| 18 | #endif | 18 | #endif |
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 11c6725fb798..8772dc946823 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c | |||
| @@ -545,6 +545,12 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm) | |||
| 545 | if (!pit) | 545 | if (!pit) |
| 546 | return NULL; | 546 | return NULL; |
| 547 | 547 | ||
| 548 | mutex_lock(&kvm->lock); | ||
| 549 | pit->irq_source_id = kvm_request_irq_source_id(kvm); | ||
| 550 | mutex_unlock(&kvm->lock); | ||
| 551 | if (pit->irq_source_id < 0) | ||
| 552 | return NULL; | ||
| 553 | |||
| 548 | mutex_init(&pit->pit_state.lock); | 554 | mutex_init(&pit->pit_state.lock); |
| 549 | mutex_lock(&pit->pit_state.lock); | 555 | mutex_lock(&pit->pit_state.lock); |
| 550 | spin_lock_init(&pit->pit_state.inject_lock); | 556 | spin_lock_init(&pit->pit_state.inject_lock); |
| @@ -587,6 +593,7 @@ void kvm_free_pit(struct kvm *kvm) | |||
| 587 | mutex_lock(&kvm->arch.vpit->pit_state.lock); | 593 | mutex_lock(&kvm->arch.vpit->pit_state.lock); |
| 588 | timer = &kvm->arch.vpit->pit_state.pit_timer.timer; | 594 | timer = &kvm->arch.vpit->pit_state.pit_timer.timer; |
| 589 | hrtimer_cancel(timer); | 595 | hrtimer_cancel(timer); |
| 596 | kvm_free_irq_source_id(kvm, kvm->arch.vpit->irq_source_id); | ||
| 590 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); | 597 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); |
| 591 | kfree(kvm->arch.vpit); | 598 | kfree(kvm->arch.vpit); |
| 592 | } | 599 | } |
| @@ -595,8 +602,8 @@ void kvm_free_pit(struct kvm *kvm) | |||
| 595 | static void __inject_pit_timer_intr(struct kvm *kvm) | 602 | static void __inject_pit_timer_intr(struct kvm *kvm) |
| 596 | { | 603 | { |
| 597 | mutex_lock(&kvm->lock); | 604 | mutex_lock(&kvm->lock); |
| 598 | kvm_set_irq(kvm, 0, 1); | 605 | kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 1); |
| 599 | kvm_set_irq(kvm, 0, 0); | 606 | kvm_set_irq(kvm, kvm->arch.vpit->irq_source_id, 0, 0); |
| 600 | mutex_unlock(&kvm->lock); | 607 | mutex_unlock(&kvm->lock); |
| 601 | } | 608 | } |
| 602 | 609 | ||
diff --git a/arch/x86/kvm/i8254.h b/arch/x86/kvm/i8254.h index e436d4983aa1..4178022b97aa 100644 --- a/arch/x86/kvm/i8254.h +++ b/arch/x86/kvm/i8254.h | |||
| @@ -44,6 +44,7 @@ struct kvm_pit { | |||
| 44 | struct kvm_io_device speaker_dev; | 44 | struct kvm_io_device speaker_dev; |
| 45 | struct kvm *kvm; | 45 | struct kvm *kvm; |
| 46 | struct kvm_kpit_state pit_state; | 46 | struct kvm_kpit_state pit_state; |
| 47 | int irq_source_id; | ||
| 47 | }; | 48 | }; |
| 48 | 49 | ||
| 49 | #define KVM_PIT_BASE_ADDRESS 0x40 | 50 | #define KVM_PIT_BASE_ADDRESS 0x40 |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 99c239c5c0ac..2a5e64881d9b 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2634,6 +2634,7 @@ static int kvm_pv_mmu_write(struct kvm_vcpu *vcpu, | |||
| 2634 | static int kvm_pv_mmu_flush_tlb(struct kvm_vcpu *vcpu) | 2634 | static int kvm_pv_mmu_flush_tlb(struct kvm_vcpu *vcpu) |
| 2635 | { | 2635 | { |
| 2636 | kvm_x86_ops->tlb_flush(vcpu); | 2636 | kvm_x86_ops->tlb_flush(vcpu); |
| 2637 | set_bit(KVM_REQ_MMU_SYNC, &vcpu->requests); | ||
| 2637 | return 1; | 2638 | return 1; |
| 2638 | } | 2639 | } |
| 2639 | 2640 | ||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4f0677d1eae8..f1f8ff2f1fa2 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -1742,7 +1742,8 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
| 1742 | goto out; | 1742 | goto out; |
| 1743 | if (irqchip_in_kernel(kvm)) { | 1743 | if (irqchip_in_kernel(kvm)) { |
| 1744 | mutex_lock(&kvm->lock); | 1744 | mutex_lock(&kvm->lock); |
| 1745 | kvm_set_irq(kvm, irq_event.irq, irq_event.level); | 1745 | kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, |
| 1746 | irq_event.irq, irq_event.level); | ||
| 1746 | mutex_unlock(&kvm->lock); | 1747 | mutex_unlock(&kvm->lock); |
| 1747 | r = 0; | 1748 | r = 0; |
| 1748 | } | 1749 | } |
| @@ -4013,6 +4014,9 @@ struct kvm *kvm_arch_create_vm(void) | |||
| 4013 | INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); | 4014 | INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); |
| 4014 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); | 4015 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); |
| 4015 | 4016 | ||
| 4017 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ | ||
| 4018 | set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); | ||
| 4019 | |||
| 4016 | return kvm; | 4020 | return kvm; |
| 4017 | } | 4021 | } |
| 4018 | 4022 | ||
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index b8e461d49412..f79a02f64d10 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -350,8 +350,10 @@ phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end, | |||
| 350 | * pagetable pages as RO. So assume someone who pre-setup | 350 | * pagetable pages as RO. So assume someone who pre-setup |
| 351 | * these mappings are more intelligent. | 351 | * these mappings are more intelligent. |
| 352 | */ | 352 | */ |
| 353 | if (pte_val(*pte)) | 353 | if (pte_val(*pte)) { |
| 354 | pages++; | ||
| 354 | continue; | 355 | continue; |
| 356 | } | ||
| 355 | 357 | ||
| 356 | if (0) | 358 | if (0) |
| 357 | printk(" pte=%p addr=%lx pte=%016lx\n", | 359 | printk(" pte=%p addr=%lx pte=%016lx\n", |
| @@ -418,8 +420,10 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
| 418 | * not differ with respect to page frame and | 420 | * not differ with respect to page frame and |
| 419 | * attributes. | 421 | * attributes. |
| 420 | */ | 422 | */ |
| 421 | if (page_size_mask & (1 << PG_LEVEL_2M)) | 423 | if (page_size_mask & (1 << PG_LEVEL_2M)) { |
| 424 | pages++; | ||
| 422 | continue; | 425 | continue; |
| 426 | } | ||
| 423 | new_prot = pte_pgprot(pte_clrhuge(*(pte_t *)pmd)); | 427 | new_prot = pte_pgprot(pte_clrhuge(*(pte_t *)pmd)); |
| 424 | } | 428 | } |
| 425 | 429 | ||
| @@ -499,8 +503,10 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end, | |||
| 499 | * not differ with respect to page frame and | 503 | * not differ with respect to page frame and |
| 500 | * attributes. | 504 | * attributes. |
| 501 | */ | 505 | */ |
| 502 | if (page_size_mask & (1 << PG_LEVEL_1G)) | 506 | if (page_size_mask & (1 << PG_LEVEL_1G)) { |
| 507 | pages++; | ||
| 503 | continue; | 508 | continue; |
| 509 | } | ||
| 504 | prot = pte_pgprot(pte_clrhuge(*(pte_t *)pud)); | 510 | prot = pte_pgprot(pte_clrhuge(*(pte_t *)pud)); |
| 505 | } | 511 | } |
| 506 | 512 | ||
| @@ -831,7 +837,7 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
| 831 | unsigned long nr_pages = size >> PAGE_SHIFT; | 837 | unsigned long nr_pages = size >> PAGE_SHIFT; |
| 832 | int ret; | 838 | int ret; |
| 833 | 839 | ||
| 834 | last_mapped_pfn = init_memory_mapping(start, start + size-1); | 840 | last_mapped_pfn = init_memory_mapping(start, start + size); |
| 835 | if (last_mapped_pfn > max_pfn_mapped) | 841 | if (last_mapped_pfn > max_pfn_mapped) |
| 836 | max_pfn_mapped = last_mapped_pfn; | 842 | max_pfn_mapped = last_mapped_pfn; |
| 837 | 843 | ||
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile index 313947940a1a..6dcefba7836f 100644 --- a/arch/x86/xen/Makefile +++ b/arch/x86/xen/Makefile | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | ifdef CONFIG_FTRACE | 1 | ifdef CONFIG_FUNCTION_TRACER |
| 2 | # Do not profile debug and lowlevel utilities | 2 | # Do not profile debug and lowlevel utilities |
| 3 | CFLAGS_REMOVE_spinlock.o = -pg | 3 | CFLAGS_REMOVE_spinlock.o = -pg |
| 4 | CFLAGS_REMOVE_time.o = -pg | 4 | CFLAGS_REMOVE_time.o = -pg |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index d4d52f5a1cf7..aba77b2b7d18 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -246,11 +246,21 @@ xmaddr_t arbitrary_virt_to_machine(void *vaddr) | |||
| 246 | { | 246 | { |
| 247 | unsigned long address = (unsigned long)vaddr; | 247 | unsigned long address = (unsigned long)vaddr; |
| 248 | unsigned int level; | 248 | unsigned int level; |
| 249 | pte_t *pte = lookup_address(address, &level); | 249 | pte_t *pte; |
| 250 | unsigned offset = address & ~PAGE_MASK; | 250 | unsigned offset; |
| 251 | 251 | ||
| 252 | BUG_ON(pte == NULL); | 252 | /* |
| 253 | * if the PFN is in the linear mapped vaddr range, we can just use | ||
| 254 | * the (quick) virt_to_machine() p2m lookup | ||
| 255 | */ | ||
| 256 | if (virt_addr_valid(vaddr)) | ||
| 257 | return virt_to_machine(vaddr); | ||
| 253 | 258 | ||
| 259 | /* otherwise we have to do a (slower) full page-table walk */ | ||
| 260 | |||
| 261 | pte = lookup_address(address, &level); | ||
| 262 | BUG_ON(pte == NULL); | ||
| 263 | offset = address & ~PAGE_MASK; | ||
| 254 | return XMADDR(((phys_addr_t)pte_mfn(*pte) << PAGE_SHIFT) + offset); | 264 | return XMADDR(((phys_addr_t)pte_mfn(*pte) << PAGE_SHIFT) + offset); |
| 255 | } | 265 | } |
| 256 | 266 | ||
| @@ -410,7 +420,7 @@ void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | |||
| 410 | 420 | ||
| 411 | xen_mc_batch(); | 421 | xen_mc_batch(); |
| 412 | 422 | ||
| 413 | u.ptr = virt_to_machine(ptep).maddr | MMU_PT_UPDATE_PRESERVE_AD; | 423 | u.ptr = arbitrary_virt_to_machine(ptep).maddr | MMU_PT_UPDATE_PRESERVE_AD; |
| 414 | u.val = pte_val_ma(pte); | 424 | u.val = pte_val_ma(pte); |
| 415 | xen_extend_mmu_update(&u); | 425 | xen_extend_mmu_update(&u); |
| 416 | 426 | ||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index aeadd00411a1..a67b8e7c712d 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -49,6 +49,17 @@ | |||
| 49 | #define DRV_NAME "ahci" | 49 | #define DRV_NAME "ahci" |
| 50 | #define DRV_VERSION "3.0" | 50 | #define DRV_VERSION "3.0" |
| 51 | 51 | ||
| 52 | /* Enclosure Management Control */ | ||
| 53 | #define EM_CTRL_MSG_TYPE 0x000f0000 | ||
| 54 | |||
| 55 | /* Enclosure Management LED Message Type */ | ||
| 56 | #define EM_MSG_LED_HBA_PORT 0x0000000f | ||
| 57 | #define EM_MSG_LED_PMP_SLOT 0x0000ff00 | ||
| 58 | #define EM_MSG_LED_VALUE 0xffff0000 | ||
| 59 | #define EM_MSG_LED_VALUE_ACTIVITY 0x00070000 | ||
| 60 | #define EM_MSG_LED_VALUE_OFF 0xfff80000 | ||
| 61 | #define EM_MSG_LED_VALUE_ON 0x00010000 | ||
| 62 | |||
| 52 | static int ahci_skip_host_reset; | 63 | static int ahci_skip_host_reset; |
| 53 | module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444); | 64 | module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444); |
| 54 | MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)"); | 65 | MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)"); |
| @@ -588,6 +599,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 588 | { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ | 599 | { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ |
| 589 | { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */ | 600 | { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */ |
| 590 | 601 | ||
| 602 | /* Promise */ | ||
| 603 | { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ | ||
| 604 | |||
| 591 | /* Generic, PCI class code for AHCI */ | 605 | /* Generic, PCI class code for AHCI */ |
| 592 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 606 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
| 593 | PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci }, | 607 | PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci }, |
| @@ -1220,18 +1234,20 @@ static void ahci_sw_activity_blink(unsigned long arg) | |||
| 1220 | struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; | 1234 | struct ahci_em_priv *emp = &pp->em_priv[link->pmp]; |
| 1221 | unsigned long led_message = emp->led_state; | 1235 | unsigned long led_message = emp->led_state; |
| 1222 | u32 activity_led_state; | 1236 | u32 activity_led_state; |
| 1237 | unsigned long flags; | ||
| 1223 | 1238 | ||
| 1224 | led_message &= 0xffff0000; | 1239 | led_message &= EM_MSG_LED_VALUE; |
| 1225 | led_message |= ap->port_no | (link->pmp << 8); | 1240 | led_message |= ap->port_no | (link->pmp << 8); |
| 1226 | 1241 | ||
| 1227 | /* check to see if we've had activity. If so, | 1242 | /* check to see if we've had activity. If so, |
| 1228 | * toggle state of LED and reset timer. If not, | 1243 | * toggle state of LED and reset timer. If not, |
| 1229 | * turn LED to desired idle state. | 1244 | * turn LED to desired idle state. |
| 1230 | */ | 1245 | */ |
| 1246 | spin_lock_irqsave(ap->lock, flags); | ||
| 1231 | if (emp->saved_activity != emp->activity) { | 1247 | if (emp->saved_activity != emp->activity) { |
| 1232 | emp->saved_activity = emp->activity; | 1248 | emp->saved_activity = emp->activity; |
| 1233 | /* get the current LED state */ | 1249 | /* get the current LED state */ |
| 1234 | activity_led_state = led_message & 0x00010000; | 1250 | activity_led_state = led_message & EM_MSG_LED_VALUE_ON; |
| 1235 | 1251 | ||
| 1236 | if (activity_led_state) | 1252 | if (activity_led_state) |
| 1237 | activity_led_state = 0; | 1253 | activity_led_state = 0; |
| @@ -1239,17 +1255,18 @@ static void ahci_sw_activity_blink(unsigned long arg) | |||
| 1239 | activity_led_state = 1; | 1255 | activity_led_state = 1; |
| 1240 | 1256 | ||
| 1241 | /* clear old state */ | 1257 | /* clear old state */ |
| 1242 | led_message &= 0xfff8ffff; | 1258 | led_message &= ~EM_MSG_LED_VALUE_ACTIVITY; |
| 1243 | 1259 | ||
| 1244 | /* toggle state */ | 1260 | /* toggle state */ |
| 1245 | led_message |= (activity_led_state << 16); | 1261 | led_message |= (activity_led_state << 16); |
| 1246 | mod_timer(&emp->timer, jiffies + msecs_to_jiffies(100)); | 1262 | mod_timer(&emp->timer, jiffies + msecs_to_jiffies(100)); |
| 1247 | } else { | 1263 | } else { |
| 1248 | /* switch to idle */ | 1264 | /* switch to idle */ |
| 1249 | led_message &= 0xfff8ffff; | 1265 | led_message &= ~EM_MSG_LED_VALUE_ACTIVITY; |
| 1250 | if (emp->blink_policy == BLINK_OFF) | 1266 | if (emp->blink_policy == BLINK_OFF) |
| 1251 | led_message |= (1 << 16); | 1267 | led_message |= (1 << 16); |
| 1252 | } | 1268 | } |
| 1269 | spin_unlock_irqrestore(ap->lock, flags); | ||
| 1253 | ahci_transmit_led_message(ap, led_message, 4); | 1270 | ahci_transmit_led_message(ap, led_message, 4); |
| 1254 | } | 1271 | } |
| 1255 | 1272 | ||
| @@ -1294,7 +1311,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state, | |||
| 1294 | struct ahci_em_priv *emp; | 1311 | struct ahci_em_priv *emp; |
| 1295 | 1312 | ||
| 1296 | /* get the slot number from the message */ | 1313 | /* get the slot number from the message */ |
| 1297 | pmp = (state & 0x0000ff00) >> 8; | 1314 | pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8; |
| 1298 | if (pmp < MAX_SLOTS) | 1315 | if (pmp < MAX_SLOTS) |
| 1299 | emp = &pp->em_priv[pmp]; | 1316 | emp = &pp->em_priv[pmp]; |
| 1300 | else | 1317 | else |
| @@ -1319,7 +1336,7 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state, | |||
| 1319 | message[0] |= (4 << 8); | 1336 | message[0] |= (4 << 8); |
| 1320 | 1337 | ||
| 1321 | /* ignore 0:4 of byte zero, fill in port info yourself */ | 1338 | /* ignore 0:4 of byte zero, fill in port info yourself */ |
| 1322 | message[1] = ((state & 0xfffffff0) | ap->port_no); | 1339 | message[1] = ((state & ~EM_MSG_LED_HBA_PORT) | ap->port_no); |
| 1323 | 1340 | ||
| 1324 | /* write message to EM_LOC */ | 1341 | /* write message to EM_LOC */ |
| 1325 | writel(message[0], mmio + hpriv->em_loc); | 1342 | writel(message[0], mmio + hpriv->em_loc); |
| @@ -1362,7 +1379,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf, | |||
| 1362 | state = simple_strtoul(buf, NULL, 0); | 1379 | state = simple_strtoul(buf, NULL, 0); |
| 1363 | 1380 | ||
| 1364 | /* get the slot number from the message */ | 1381 | /* get the slot number from the message */ |
| 1365 | pmp = (state & 0x0000ff00) >> 8; | 1382 | pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8; |
| 1366 | if (pmp < MAX_SLOTS) | 1383 | if (pmp < MAX_SLOTS) |
| 1367 | emp = &pp->em_priv[pmp]; | 1384 | emp = &pp->em_priv[pmp]; |
| 1368 | else | 1385 | else |
| @@ -1373,7 +1390,7 @@ static ssize_t ahci_led_store(struct ata_port *ap, const char *buf, | |||
| 1373 | * activity led through em_message | 1390 | * activity led through em_message |
| 1374 | */ | 1391 | */ |
| 1375 | if (emp->blink_policy) | 1392 | if (emp->blink_policy) |
| 1376 | state &= 0xfff8ffff; | 1393 | state &= ~EM_MSG_LED_VALUE_ACTIVITY; |
| 1377 | 1394 | ||
| 1378 | return ahci_transmit_led_message(ap, state, size); | 1395 | return ahci_transmit_led_message(ap, state, size); |
| 1379 | } | 1396 | } |
| @@ -1392,16 +1409,16 @@ static ssize_t ahci_activity_store(struct ata_device *dev, enum sw_activity val) | |||
| 1392 | link->flags &= ~(ATA_LFLAG_SW_ACTIVITY); | 1409 | link->flags &= ~(ATA_LFLAG_SW_ACTIVITY); |
| 1393 | 1410 | ||
| 1394 | /* set the LED to OFF */ | 1411 | /* set the LED to OFF */ |
| 1395 | port_led_state &= 0xfff80000; | 1412 | port_led_state &= EM_MSG_LED_VALUE_OFF; |
| 1396 | port_led_state |= (ap->port_no | (link->pmp << 8)); | 1413 | port_led_state |= (ap->port_no | (link->pmp << 8)); |
| 1397 | ahci_transmit_led_message(ap, port_led_state, 4); | 1414 | ahci_transmit_led_message(ap, port_led_state, 4); |
| 1398 | } else { | 1415 | } else { |
| 1399 | link->flags |= ATA_LFLAG_SW_ACTIVITY; | 1416 | link->flags |= ATA_LFLAG_SW_ACTIVITY; |
| 1400 | if (val == BLINK_OFF) { | 1417 | if (val == BLINK_OFF) { |
| 1401 | /* set LED to ON for idle */ | 1418 | /* set LED to ON for idle */ |
| 1402 | port_led_state &= 0xfff80000; | 1419 | port_led_state &= EM_MSG_LED_VALUE_OFF; |
| 1403 | port_led_state |= (ap->port_no | (link->pmp << 8)); | 1420 | port_led_state |= (ap->port_no | (link->pmp << 8)); |
| 1404 | port_led_state |= 0x00010000; /* check this */ | 1421 | port_led_state |= EM_MSG_LED_VALUE_ON; /* check this */ |
| 1405 | ahci_transmit_led_message(ap, port_led_state, 4); | 1422 | ahci_transmit_led_message(ap, port_led_state, 4); |
| 1406 | } | 1423 | } |
| 1407 | } | 1424 | } |
| @@ -2612,7 +2629,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2612 | u32 em_loc = readl(mmio + HOST_EM_LOC); | 2629 | u32 em_loc = readl(mmio + HOST_EM_LOC); |
| 2613 | u32 em_ctl = readl(mmio + HOST_EM_CTL); | 2630 | u32 em_ctl = readl(mmio + HOST_EM_CTL); |
| 2614 | 2631 | ||
| 2615 | messages = (em_ctl & 0x000f0000) >> 16; | 2632 | messages = (em_ctl & EM_CTRL_MSG_TYPE) >> 16; |
| 2616 | 2633 | ||
| 2617 | /* we only support LED message type right now */ | 2634 | /* we only support LED message type right now */ |
| 2618 | if ((messages & 0x01) && (ahci_em_messages == 1)) { | 2635 | if ((messages & 0x01) && (ahci_em_messages == 1)) { |
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 75a406f5e694..5c33767e66de 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ata_generic.c - Generic PATA/SATA controller driver. | 2 | * ata_generic.c - Generic PATA/SATA controller driver. |
| 3 | * Copyright 2005 Red Hat Inc <alan@redhat.com>, all rights reserved. | 3 | * Copyright 2005 Red Hat Inc, all rights reserved. |
| 4 | * | 4 | * |
| 5 | * Elements from ide/pci/generic.c | 5 | * Elements from ide/pci/generic.c |
| 6 | * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org> | 6 | * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org> |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index e9e32ed6b1a3..52dc2d8b8f22 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | * | 14 | * |
| 15 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer | 15 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer |
| 16 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> | 16 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> |
| 17 | * Copyright (C) 2003 Red Hat Inc <alan@redhat.com> | 17 | * Copyright (C) 2003 Red Hat Inc |
| 18 | * | 18 | * |
| 19 | * | 19 | * |
| 20 | * This program is free software; you can redistribute it and/or modify | 20 | * This program is free software; you can redistribute it and/or modify |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 8cb0b360bfd8..2ff633c119e2 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4156,29 +4156,33 @@ static int cable_is_40wire(struct ata_port *ap) | |||
| 4156 | struct ata_link *link; | 4156 | struct ata_link *link; |
| 4157 | struct ata_device *dev; | 4157 | struct ata_device *dev; |
| 4158 | 4158 | ||
| 4159 | /* If the controller thinks we are 40 wire, we are */ | 4159 | /* If the controller thinks we are 40 wire, we are. */ |
| 4160 | if (ap->cbl == ATA_CBL_PATA40) | 4160 | if (ap->cbl == ATA_CBL_PATA40) |
| 4161 | return 1; | 4161 | return 1; |
| 4162 | /* If the controller thinks we are 80 wire, we are */ | 4162 | |
| 4163 | /* If the controller thinks we are 80 wire, we are. */ | ||
| 4163 | if (ap->cbl == ATA_CBL_PATA80 || ap->cbl == ATA_CBL_SATA) | 4164 | if (ap->cbl == ATA_CBL_PATA80 || ap->cbl == ATA_CBL_SATA) |
| 4164 | return 0; | 4165 | return 0; |
| 4165 | /* If the system is known to be 40 wire short cable (eg laptop), | 4166 | |
| 4166 | then we allow 80 wire modes even if the drive isn't sure */ | 4167 | /* If the system is known to be 40 wire short cable (eg |
| 4168 | * laptop), then we allow 80 wire modes even if the drive | ||
| 4169 | * isn't sure. | ||
| 4170 | */ | ||
| 4167 | if (ap->cbl == ATA_CBL_PATA40_SHORT) | 4171 | if (ap->cbl == ATA_CBL_PATA40_SHORT) |
| 4168 | return 0; | 4172 | return 0; |
| 4169 | /* If the controller doesn't know we scan | 4173 | |
| 4170 | 4174 | /* If the controller doesn't know, we scan. | |
| 4171 | - Note: We look for all 40 wire detects at this point. | 4175 | * |
| 4172 | Any 80 wire detect is taken to be 80 wire cable | 4176 | * Note: We look for all 40 wire detects at this point. Any |
| 4173 | because | 4177 | * 80 wire detect is taken to be 80 wire cable because |
| 4174 | - In many setups only the one drive (slave if present) | 4178 | * - in many setups only the one drive (slave if present) will |
| 4175 | will give a valid detect | 4179 | * give a valid detect |
| 4176 | - If you have a non detect capable drive you don't | 4180 | * - if you have a non detect capable drive you don't want it |
| 4177 | want it to colour the choice | 4181 | * to colour the choice |
| 4178 | */ | 4182 | */ |
| 4179 | ata_port_for_each_link(link, ap) { | 4183 | ata_port_for_each_link(link, ap) { |
| 4180 | ata_link_for_each_dev(dev, link) { | 4184 | ata_link_for_each_dev(dev, link) { |
| 4181 | if (!ata_is_40wire(dev)) | 4185 | if (ata_dev_enabled(dev) && !ata_is_40wire(dev)) |
| 4182 | return 0; | 4186 | return 0; |
| 4183 | } | 4187 | } |
| 4184 | } | 4188 | } |
| @@ -4553,6 +4557,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
| 4553 | /** | 4557 | /** |
| 4554 | * ata_qc_new_init - Request an available ATA command, and initialize it | 4558 | * ata_qc_new_init - Request an available ATA command, and initialize it |
| 4555 | * @dev: Device from whom we request an available command structure | 4559 | * @dev: Device from whom we request an available command structure |
| 4560 | * @tag: command tag | ||
| 4556 | * | 4561 | * |
| 4557 | * LOCKING: | 4562 | * LOCKING: |
| 4558 | * None. | 4563 | * None. |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 5d687d7cffae..8077bdf5d30d 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -603,6 +603,9 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
| 603 | ata_link_for_each_dev(dev, link) { | 603 | ata_link_for_each_dev(dev, link) { |
| 604 | int devno = dev->devno; | 604 | int devno = dev->devno; |
| 605 | 605 | ||
| 606 | if (!ata_dev_enabled(dev)) | ||
| 607 | continue; | ||
| 608 | |||
| 606 | ehc->saved_xfer_mode[devno] = dev->xfer_mode; | 609 | ehc->saved_xfer_mode[devno] = dev->xfer_mode; |
| 607 | if (ata_ncq_enabled(dev)) | 610 | if (ata_ncq_enabled(dev)) |
| 608 | ehc->saved_ncq_enabled |= 1 << devno; | 611 | ehc->saved_ncq_enabled |= 1 << devno; |
| @@ -1161,6 +1164,7 @@ void ata_eh_detach_dev(struct ata_device *dev) | |||
| 1161 | { | 1164 | { |
| 1162 | struct ata_link *link = dev->link; | 1165 | struct ata_link *link = dev->link; |
| 1163 | struct ata_port *ap = link->ap; | 1166 | struct ata_port *ap = link->ap; |
| 1167 | struct ata_eh_context *ehc = &link->eh_context; | ||
| 1164 | unsigned long flags; | 1168 | unsigned long flags; |
| 1165 | 1169 | ||
| 1166 | ata_dev_disable(dev); | 1170 | ata_dev_disable(dev); |
| @@ -1174,9 +1178,11 @@ void ata_eh_detach_dev(struct ata_device *dev) | |||
| 1174 | ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; | 1178 | ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; |
| 1175 | } | 1179 | } |
| 1176 | 1180 | ||
| 1177 | /* clear per-dev EH actions */ | 1181 | /* clear per-dev EH info */ |
| 1178 | ata_eh_clear_action(link, dev, &link->eh_info, ATA_EH_PERDEV_MASK); | 1182 | ata_eh_clear_action(link, dev, &link->eh_info, ATA_EH_PERDEV_MASK); |
| 1179 | ata_eh_clear_action(link, dev, &link->eh_context.i, ATA_EH_PERDEV_MASK); | 1183 | ata_eh_clear_action(link, dev, &link->eh_context.i, ATA_EH_PERDEV_MASK); |
| 1184 | ehc->saved_xfer_mode[dev->devno] = 0; | ||
| 1185 | ehc->saved_ncq_enabled &= ~(1 << dev->devno); | ||
| 1180 | 1186 | ||
| 1181 | spin_unlock_irqrestore(ap->lock, flags); | 1187 | spin_unlock_irqrestore(ap->lock, flags); |
| 1182 | } | 1188 | } |
| @@ -2787,6 +2793,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
| 2787 | 2793 | ||
| 2788 | /* if data transfer is verified, clear DUBIOUS_XFER on ering top */ | 2794 | /* if data transfer is verified, clear DUBIOUS_XFER on ering top */ |
| 2789 | ata_link_for_each_dev(dev, link) { | 2795 | ata_link_for_each_dev(dev, link) { |
| 2796 | if (!ata_dev_enabled(dev)) | ||
| 2797 | continue; | ||
| 2798 | |||
| 2790 | if (!(dev->flags & ATA_DFLAG_DUBIOUS_XFER)) { | 2799 | if (!(dev->flags & ATA_DFLAG_DUBIOUS_XFER)) { |
| 2791 | struct ata_ering_entry *ent; | 2800 | struct ata_ering_entry *ent; |
| 2792 | 2801 | ||
| @@ -2808,6 +2817,9 @@ int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
| 2808 | u8 saved_xfer_mode = ehc->saved_xfer_mode[dev->devno]; | 2817 | u8 saved_xfer_mode = ehc->saved_xfer_mode[dev->devno]; |
| 2809 | u8 saved_ncq = !!(ehc->saved_ncq_enabled & (1 << dev->devno)); | 2818 | u8 saved_ncq = !!(ehc->saved_ncq_enabled & (1 << dev->devno)); |
| 2810 | 2819 | ||
| 2820 | if (!ata_dev_enabled(dev)) | ||
| 2821 | continue; | ||
| 2822 | |||
| 2811 | if (dev->xfer_mode != saved_xfer_mode || | 2823 | if (dev->xfer_mode != saved_xfer_mode || |
| 2812 | ata_ncq_enabled(dev) != saved_ncq) | 2824 | ata_ncq_enabled(dev) != saved_ncq) |
| 2813 | dev->flags |= ATA_DFLAG_DUBIOUS_XFER; | 2825 | dev->flags |= ATA_DFLAG_DUBIOUS_XFER; |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 4b95c4387e9e..bbb30d882f05 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -1107,6 +1107,15 @@ static int ata_scsi_dev_config(struct scsi_device *sdev, | |||
| 1107 | 1107 | ||
| 1108 | depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); | 1108 | depth = min(sdev->host->can_queue, ata_id_queue_depth(dev->id)); |
| 1109 | depth = min(ATA_MAX_QUEUE - 1, depth); | 1109 | depth = min(ATA_MAX_QUEUE - 1, depth); |
| 1110 | |||
| 1111 | /* | ||
| 1112 | * If this device is behind a port multiplier, we have | ||
| 1113 | * to share the tag map between all devices on that PMP. | ||
| 1114 | * Set up the shared tag map here and we get automatic. | ||
| 1115 | */ | ||
| 1116 | if (dev->link->ap->pmp_link) | ||
| 1117 | scsi_init_shared_tag_map(sdev->host, ATA_MAX_QUEUE - 1); | ||
| 1118 | |||
| 1110 | scsi_set_tag_type(sdev, MSG_SIMPLE_TAG); | 1119 | scsi_set_tag_type(sdev, MSG_SIMPLE_TAG); |
| 1111 | scsi_activate_tcq(sdev, depth); | 1120 | scsi_activate_tcq(sdev, depth); |
| 1112 | } | 1121 | } |
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c index eb919c16a03e..e2e332d8ff95 100644 --- a/drivers/ata/pata_acpi.c +++ b/drivers/ata/pata_acpi.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ACPI PATA driver | 2 | * ACPI PATA driver |
| 3 | * | 3 | * |
| 4 | * (c) 2007 Red Hat <alan@redhat.com> | 4 | * (c) 2007 Red Hat |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c index 5ca70fa1f587..73c466e452ca 100644 --- a/drivers/ata/pata_ali.c +++ b/drivers/ata/pata_ali.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_ali.c - ALI 15x3 PATA for new ATA layer | 2 | * pata_ali.c - ALI 15x3 PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * based in part upon | 5 | * based in part upon |
| 7 | * linux/drivers/ide/pci/alim15x3.c Version 0.17 2003/01/02 | 6 | * linux/drivers/ide/pci/alim15x3.c Version 0.17 2003/01/02 |
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c index 57dd00f463d3..0ec9c7d9fe9d 100644 --- a/drivers/ata/pata_amd.c +++ b/drivers/ata/pata_amd.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_amd.c - AMD PATA for new ATA layer | 2 | * pata_amd.c - AMD PATA for new ATA layer |
| 3 | * (C) 2005-2006 Red Hat Inc | 3 | * (C) 2005-2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Based on pata-sil680. Errata information is taken from data sheets | 5 | * Based on pata-sil680. Errata information is taken from data sheets |
| 7 | * and the amd74xx.c driver by Vojtech Pavlik. Nvidia SATA devices are | 6 | * and the amd74xx.c driver by Vojtech Pavlik. Nvidia SATA devices are |
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index 0f513bc11193..6b3092c75ffe 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_artop.c - ARTOP ATA controller driver | 2 | * pata_artop.c - ARTOP ATA controller driver |
| 3 | * | 3 | * |
| 4 | * (C) 2006 Red Hat <alan@redhat.com> | 4 | * (C) 2006 Red Hat |
| 5 | * (C) 2007 Bartlomiej Zolnierkiewicz | 5 | * (C) 2007 Bartlomiej Zolnierkiewicz |
| 6 | * | 6 | * |
| 7 | * Based in part on drivers/ide/pci/aec62xx.c | 7 | * Based in part on drivers/ide/pci/aec62xx.c |
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index e8a0d99d7356..0e2cde8f9973 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_atiixp.c - ATI PATA for new ATA layer | 2 | * pata_atiixp.c - ATI PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Based on | 5 | * Based on |
| 7 | * | 6 | * |
diff --git a/drivers/ata/pata_cmd640.c b/drivers/ata/pata_cmd640.c index 2de30b990278..34a394264c3d 100644 --- a/drivers/ata/pata_cmd640.c +++ b/drivers/ata/pata_cmd640.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_cmd640.c - CMD640 PCI PATA for new ATA layer | 2 | * pata_cmd640.c - CMD640 PCI PATA for new ATA layer |
| 3 | * (C) 2007 Red Hat Inc | 3 | * (C) 2007 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Based upon | 5 | * Based upon |
| 7 | * linux/drivers/ide/pci/cmd640.c Version 1.02 Sep 01, 1996 | 6 | * linux/drivers/ide/pci/cmd640.c Version 1.02 Sep 01, 1996 |
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c index ddd09b7d98c9..3167d8fed2f2 100644 --- a/drivers/ata/pata_cmd64x.c +++ b/drivers/ata/pata_cmd64x.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_cmd64x.c - CMD64x PATA for new ATA layer | 2 | * pata_cmd64x.c - CMD64x PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * Based upon | 6 | * Based upon |
| 7 | * linux/drivers/ide/pci/cmd64x.c Version 1.30 Sept 10, 2002 | 7 | * linux/drivers/ide/pci/cmd64x.c Version 1.30 Sept 10, 2002 |
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c index 0c4b271a9d5a..bba453381f44 100644 --- a/drivers/ata/pata_cs5530.c +++ b/drivers/ata/pata_cs5530.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata-cs5530.c - CS5530 PATA for new ATA layer | 2 | * pata-cs5530.c - CS5530 PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * based upon cs5530.c by Mark Lord. | 5 | * based upon cs5530.c by Mark Lord. |
| 7 | * | 6 | * |
diff --git a/drivers/ata/pata_cs5535.c b/drivers/ata/pata_cs5535.c index f1b6556f0483..1b2d4a0f5f74 100644 --- a/drivers/ata/pata_cs5535.c +++ b/drivers/ata/pata_cs5535.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata-cs5535.c - CS5535 PATA for new ATA layer | 2 | * pata-cs5535.c - CS5535 PATA for new ATA layer |
| 3 | * (C) 2005-2006 Red Hat Inc | 3 | * (C) 2005-2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * based upon cs5535.c from AMD <Jens.Altmann@amd.com> as cleaned up and | 6 | * based upon cs5535.c from AMD <Jens.Altmann@amd.com> as cleaned up and |
| 7 | * made readable and Linux style by Wolfgang Zuleger <wolfgang.zuleger@gmx.de | 7 | * made readable and Linux style by Wolfgang Zuleger <wolfgang.zuleger@gmx.de |
diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c index 2ff62608ae37..d546425cd380 100644 --- a/drivers/ata/pata_cypress.c +++ b/drivers/ata/pata_cypress.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_cypress.c - Cypress PATA for new ATA layer | 2 | * pata_cypress.c - Cypress PATA for new ATA layer |
| 3 | * (C) 2006 Red Hat Inc | 3 | * (C) 2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox |
| 5 | * | 5 | * |
| 6 | * Based heavily on | 6 | * Based heavily on |
| 7 | * linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002 | 7 | * linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002 |
diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c index 9fba82976ba6..ac6392ea35b0 100644 --- a/drivers/ata/pata_efar.c +++ b/drivers/ata/pata_efar.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_efar.c - EFAR PIIX clone controller driver | 2 | * pata_efar.c - EFAR PIIX clone controller driver |
| 3 | * | 3 | * |
| 4 | * (C) 2005 Red Hat <alan@redhat.com> | 4 | * (C) 2005 Red Hat |
| 5 | * | 5 | * |
| 6 | * Some parts based on ata_piix.c by Jeff Garzik and others. | 6 | * Some parts based on ata_piix.c by Jeff Garzik and others. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c index 6a111baab523..15cdb9148aab 100644 --- a/drivers/ata/pata_isapnp.c +++ b/drivers/ata/pata_isapnp.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | /* | 2 | /* |
| 3 | * pata-isapnp.c - ISA PnP PATA controller driver. | 3 | * pata-isapnp.c - ISA PnP PATA controller driver. |
| 4 | * Copyright 2005/2006 Red Hat Inc <alan@redhat.com>, all rights reserved. | 4 | * Copyright 2005/2006 Red Hat Inc, all rights reserved. |
| 5 | * | 5 | * |
| 6 | * Based in part on ide-pnp.c by Andrey Panin <pazke@donpac.ru> | 6 | * Based in part on ide-pnp.c by Andrey Panin <pazke@donpac.ru> |
| 7 | */ | 7 | */ |
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index 0221c9a46769..860ede526282 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_it821x.c - IT821x PATA for new ATA layer | 2 | * pata_it821x.c - IT821x PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 5 | * (C) 2007 Bartlomiej Zolnierkiewicz | 5 | * (C) 2007 Bartlomiej Zolnierkiewicz |
| 6 | * | 6 | * |
| 7 | * based upon | 7 | * based upon |
| @@ -10,7 +10,7 @@ | |||
| 10 | * | 10 | * |
| 11 | * linux/drivers/ide/pci/it821x.c Version 0.09 December 2004 | 11 | * linux/drivers/ide/pci/it821x.c Version 0.09 December 2004 |
| 12 | * | 12 | * |
| 13 | * Copyright (C) 2004 Red Hat <alan@redhat.com> | 13 | * Copyright (C) 2004 Red Hat |
| 14 | * | 14 | * |
| 15 | * May be copied or modified under the terms of the GNU General Public License | 15 | * May be copied or modified under the terms of the GNU General Public License |
| 16 | * Based in part on the ITE vendor provided SCSI driver. | 16 | * Based in part on the ITE vendor provided SCSI driver. |
| @@ -557,9 +557,8 @@ static unsigned int it821x_read_id(struct ata_device *adev, | |||
| 557 | if (strstr(model_num, "Integrated Technology Express")) { | 557 | if (strstr(model_num, "Integrated Technology Express")) { |
| 558 | /* Set feature bits the firmware neglects */ | 558 | /* Set feature bits the firmware neglects */ |
| 559 | id[49] |= 0x0300; /* LBA, DMA */ | 559 | id[49] |= 0x0300; /* LBA, DMA */ |
| 560 | id[82] |= 0x0400; /* LBA48 */ | ||
| 561 | id[83] &= 0x7FFF; | 560 | id[83] &= 0x7FFF; |
| 562 | id[83] |= 0x4000; /* Word 83 is valid */ | 561 | id[83] |= 0x4400; /* Word 83 is valid and LBA48 */ |
| 563 | id[86] |= 0x0400; /* LBA48 on */ | 562 | id[86] |= 0x0400; /* LBA48 on */ |
| 564 | id[ATA_ID_MAJOR_VER] |= 0x1F; | 563 | id[ATA_ID_MAJOR_VER] |= 0x1F; |
| 565 | } | 564 | } |
diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c index 73b7596816b4..38cf1ab2d289 100644 --- a/drivers/ata/pata_jmicron.c +++ b/drivers/ata/pata_jmicron.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * driven by AHCI in the usual configuration although | 4 | * driven by AHCI in the usual configuration although |
| 5 | * this driver can handle other setups if we need it. | 5 | * this driver can handle other setups if we need it. |
| 6 | * | 6 | * |
| 7 | * (c) 2006 Red Hat <alan@redhat.com> | 7 | * (c) 2006 Red Hat |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c index bc037ffce200..930c2208640b 100644 --- a/drivers/ata/pata_legacy.c +++ b/drivers/ata/pata_legacy.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata-legacy.c - Legacy port PATA/SATA controller driver. | 2 | * pata-legacy.c - Legacy port PATA/SATA controller driver. |
| 3 | * Copyright 2005/2006 Red Hat <alan@redhat.com>, all rights reserved. | 3 | * Copyright 2005/2006 Red Hat, all rights reserved. |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c index 0d87eec84966..76e399bf8c1b 100644 --- a/drivers/ata/pata_marvell.c +++ b/drivers/ata/pata_marvell.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * isn't making full use of the device functionality but it is | 5 | * isn't making full use of the device functionality but it is |
| 6 | * easy to get working. | 6 | * easy to get working. |
| 7 | * | 7 | * |
| 8 | * (c) 2006 Red Hat <alan@redhat.com> | 8 | * (c) 2006 Red Hat |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c index 7d7e3fdab71f..7c8faa48b5f3 100644 --- a/drivers/ata/pata_mpiix.c +++ b/drivers/ata/pata_mpiix.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_mpiix.c - Intel MPIIX PATA for new ATA layer | 2 | * pata_mpiix.c - Intel MPIIX PATA for new ATA layer |
| 3 | * (C) 2005-2006 Red Hat Inc | 3 | * (C) 2005-2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * The MPIIX is different enough to the PIIX4 and friends that we give it | 6 | * The MPIIX is different enough to the PIIX4 and friends that we give it |
| 7 | * a separate driver. The old ide/pci code handles this by just not tuning | 7 | * a separate driver. The old ide/pci code handles this by just not tuning |
diff --git a/drivers/ata/pata_netcell.c b/drivers/ata/pata_netcell.c index d9719c8b9dbe..9dc05e1656a8 100644 --- a/drivers/ata/pata_netcell.c +++ b/drivers/ata/pata_netcell.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_netcell.c - Netcell PATA driver | 2 | * pata_netcell.c - Netcell PATA driver |
| 3 | * | 3 | * |
| 4 | * (c) 2006 Red Hat <alan@redhat.com> | 4 | * (c) 2006 Red Hat |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c index 565e67cd13fa..4e466eae8b46 100644 --- a/drivers/ata/pata_ninja32.c +++ b/drivers/ata/pata_ninja32.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_ninja32.c - Ninja32 PATA for new ATA layer | 2 | * pata_ninja32.c - Ninja32 PATA for new ATA layer |
| 3 | * (C) 2007 Red Hat Inc | 3 | * (C) 2007 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Note: The controller like many controllers has shared timings for | 5 | * Note: The controller like many controllers has shared timings for |
| 7 | * PIO and DMA. We thus flip to the DMA timings in dma_start and flip back | 6 | * PIO and DMA. We thus flip to the DMA timings in dma_start and flip back |
| @@ -45,7 +44,7 @@ | |||
| 45 | #include <linux/libata.h> | 44 | #include <linux/libata.h> |
| 46 | 45 | ||
| 47 | #define DRV_NAME "pata_ninja32" | 46 | #define DRV_NAME "pata_ninja32" |
| 48 | #define DRV_VERSION "0.0.1" | 47 | #define DRV_VERSION "0.1.1" |
| 49 | 48 | ||
| 50 | 49 | ||
| 51 | /** | 50 | /** |
| @@ -89,6 +88,17 @@ static struct ata_port_operations ninja32_port_ops = { | |||
| 89 | .set_piomode = ninja32_set_piomode, | 88 | .set_piomode = ninja32_set_piomode, |
| 90 | }; | 89 | }; |
| 91 | 90 | ||
| 91 | static void ninja32_program(void __iomem *base) | ||
| 92 | { | ||
| 93 | iowrite8(0x05, base + 0x01); /* Enable interrupt lines */ | ||
| 94 | iowrite8(0xBE, base + 0x02); /* Burst, ?? setup */ | ||
| 95 | iowrite8(0x01, base + 0x03); /* Unknown */ | ||
| 96 | iowrite8(0x20, base + 0x04); /* WAIT0 */ | ||
| 97 | iowrite8(0x8f, base + 0x05); /* Unknown */ | ||
| 98 | iowrite8(0xa4, base + 0x1c); /* Unknown */ | ||
| 99 | iowrite8(0x83, base + 0x1d); /* BMDMA control: WAIT0 */ | ||
| 100 | } | ||
| 101 | |||
| 92 | static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 102 | static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
| 93 | { | 103 | { |
| 94 | struct ata_host *host; | 104 | struct ata_host *host; |
| @@ -134,18 +144,28 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 134 | ap->ioaddr.bmdma_addr = base; | 144 | ap->ioaddr.bmdma_addr = base; |
| 135 | ata_sff_std_ports(&ap->ioaddr); | 145 | ata_sff_std_ports(&ap->ioaddr); |
| 136 | 146 | ||
| 137 | iowrite8(0x05, base + 0x01); /* Enable interrupt lines */ | 147 | ninja32_program(base); |
| 138 | iowrite8(0xBE, base + 0x02); /* Burst, ?? setup */ | ||
| 139 | iowrite8(0x01, base + 0x03); /* Unknown */ | ||
| 140 | iowrite8(0x20, base + 0x04); /* WAIT0 */ | ||
| 141 | iowrite8(0x8f, base + 0x05); /* Unknown */ | ||
| 142 | iowrite8(0xa4, base + 0x1c); /* Unknown */ | ||
| 143 | iowrite8(0x83, base + 0x1d); /* BMDMA control: WAIT0 */ | ||
| 144 | /* FIXME: Should we disable them at remove ? */ | 148 | /* FIXME: Should we disable them at remove ? */ |
| 145 | return ata_host_activate(host, dev->irq, ata_sff_interrupt, | 149 | return ata_host_activate(host, dev->irq, ata_sff_interrupt, |
| 146 | IRQF_SHARED, &ninja32_sht); | 150 | IRQF_SHARED, &ninja32_sht); |
| 147 | } | 151 | } |
| 148 | 152 | ||
| 153 | #ifdef CONFIG_PM | ||
| 154 | |||
| 155 | static int ninja32_reinit_one(struct pci_dev *pdev) | ||
| 156 | { | ||
| 157 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | ||
| 158 | int rc; | ||
| 159 | |||
| 160 | rc = ata_pci_device_do_resume(pdev); | ||
| 161 | if (rc) | ||
| 162 | return rc; | ||
| 163 | ninja32_program(host->iomap[0]); | ||
| 164 | ata_host_resume(host); | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | #endif | ||
| 168 | |||
| 149 | static const struct pci_device_id ninja32[] = { | 169 | static const struct pci_device_id ninja32[] = { |
| 150 | { 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 170 | { 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, |
| 151 | { 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 171 | { 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, |
| @@ -156,7 +176,11 @@ static struct pci_driver ninja32_pci_driver = { | |||
| 156 | .name = DRV_NAME, | 176 | .name = DRV_NAME, |
| 157 | .id_table = ninja32, | 177 | .id_table = ninja32, |
| 158 | .probe = ninja32_init_one, | 178 | .probe = ninja32_init_one, |
| 159 | .remove = ata_pci_remove_one | 179 | .remove = ata_pci_remove_one, |
| 180 | #ifdef CONFIG_PM | ||
| 181 | .suspend = ata_pci_device_suspend, | ||
| 182 | .resume = ninja32_reinit_one, | ||
| 183 | #endif | ||
| 160 | }; | 184 | }; |
| 161 | 185 | ||
| 162 | static int __init ninja32_init(void) | 186 | static int __init ninja32_init(void) |
diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c index be756b7ef07e..40d411c460de 100644 --- a/drivers/ata/pata_ns87410.c +++ b/drivers/ata/pata_ns87410.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_ns87410.c - National Semiconductor 87410 PATA for new ATA layer | 2 | * pata_ns87410.c - National Semiconductor 87410 PATA for new ATA layer |
| 3 | * (C) 2006 Red Hat Inc | 3 | * (C) 2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/ata/pata_ns87415.c b/drivers/ata/pata_ns87415.c index e0aa7eaaee0a..89bf5f865d6a 100644 --- a/drivers/ata/pata_ns87415.c +++ b/drivers/ata/pata_ns87415.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_ns87415.c - NS87415 (non PARISC) PATA | 2 | * pata_ns87415.c - NS87415 (non PARISC) PATA |
| 3 | * | 3 | * |
| 4 | * (C) 2005 Red Hat <alan@redhat.com> | 4 | * (C) 2005 Red Hat <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * This is a fairly generic MWDMA controller. It has some limitations | 6 | * This is a fairly generic MWDMA controller. It has some limitations |
| 7 | * as it requires timing reloads on PIO/DMA transitions but it is otherwise | 7 | * as it requires timing reloads on PIO/DMA transitions but it is otherwise |
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c index df64f2443001..c0dbc46a348e 100644 --- a/drivers/ata/pata_oldpiix.c +++ b/drivers/ata/pata_oldpiix.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_oldpiix.c - Intel PATA/SATA controllers | 2 | * pata_oldpiix.c - Intel PATA/SATA controllers |
| 3 | * | 3 | * |
| 4 | * (C) 2005 Red Hat <alan@redhat.com> | 4 | * (C) 2005 Red Hat |
| 5 | * | 5 | * |
| 6 | * Some parts based on ata_piix.c by Jeff Garzik and others. | 6 | * Some parts based on ata_piix.c by Jeff Garzik and others. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c index fb2cf661b0e8..e4fa4d565e96 100644 --- a/drivers/ata/pata_opti.c +++ b/drivers/ata/pata_opti.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_opti.c - ATI PATA for new ATA layer | 2 | * pata_opti.c - ATI PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Based on | 5 | * Based on |
| 7 | * linux/drivers/ide/pci/opti621.c Version 0.7 Sept 10, 2002 | 6 | * linux/drivers/ide/pci/opti621.c Version 0.7 Sept 10, 2002 |
diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c index 4cd744456313..93bb6e91973f 100644 --- a/drivers/ata/pata_optidma.c +++ b/drivers/ata/pata_optidma.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_optidma.c - Opti DMA PATA for new ATA layer | 2 | * pata_optidma.c - Opti DMA PATA for new ATA layer |
| 3 | * (C) 2006 Red Hat Inc | 3 | * (C) 2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * The Opti DMA controllers are related to the older PIO PCI controllers | 5 | * The Opti DMA controllers are related to the older PIO PCI controllers |
| 7 | * and indeed the VLB ones. The main differences are that the timing | 6 | * and indeed the VLB ones. The main differences are that the timing |
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c index 02b596b9cf6a..271cb64d429e 100644 --- a/drivers/ata/pata_pcmcia.c +++ b/drivers/ata/pata_pcmcia.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_pcmcia.c - PCMCIA PATA controller driver. | 2 | * pata_pcmcia.c - PCMCIA PATA controller driver. |
| 3 | * Copyright 2005-2006 Red Hat Inc <alan@redhat.com>, all rights reserved. | 3 | * Copyright 2005-2006 Red Hat Inc, all rights reserved. |
| 4 | * PCMCIA ident update Copyright 2006 Marcin Juszkiewicz | 4 | * PCMCIA ident update Copyright 2006 Marcin Juszkiewicz |
| 5 | * <openembedded@hrw.one.pl> | 5 | * <openembedded@hrw.one.pl> |
| 6 | * | 6 | * |
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c index d2673060bc8d..799a6a098712 100644 --- a/drivers/ata/pata_pdc202xx_old.c +++ b/drivers/ata/pata_pdc202xx_old.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_pdc202xx_old.c - Promise PDC202xx PATA for new ATA layer | 2 | * pata_pdc202xx_old.c - Promise PDC202xx PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 5 | * (C) 2007 Bartlomiej Zolnierkiewicz | 5 | * (C) 2007 Bartlomiej Zolnierkiewicz |
| 6 | * | 6 | * |
| 7 | * Based in part on linux/drivers/ide/pci/pdc202xx_old.c | 7 | * Based in part on linux/drivers/ide/pci/pdc202xx_old.c |
diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c index 8f65ad61b8af..77e4e3b17f54 100644 --- a/drivers/ata/pata_platform.c +++ b/drivers/ata/pata_platform.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * Based on pata_pcmcia: | 6 | * Based on pata_pcmcia: |
| 7 | * | 7 | * |
| 8 | * Copyright 2005-2006 Red Hat Inc <alan@redhat.com>, all rights reserved. | 8 | * Copyright 2005-2006 Red Hat Inc, all rights reserved. |
| 9 | * | 9 | * |
| 10 | * This file is subject to the terms and conditions of the GNU General Public | 10 | * This file is subject to the terms and conditions of the GNU General Public |
| 11 | * License. See the file "COPYING" in the main directory of this archive | 11 | * License. See the file "COPYING" in the main directory of this archive |
diff --git a/drivers/ata/pata_qdi.c b/drivers/ata/pata_qdi.c index 63b7a1c165a5..3080f371222c 100644 --- a/drivers/ata/pata_qdi.c +++ b/drivers/ata/pata_qdi.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_qdi.c - QDI VLB ATA controllers | 2 | * pata_qdi.c - QDI VLB ATA controllers |
| 3 | * (C) 2006 Red Hat <alan@redhat.com> | 3 | * (C) 2006 Red Hat |
| 4 | * | 4 | * |
| 5 | * This driver mostly exists as a proof of concept for non PCI devices under | 5 | * This driver mostly exists as a proof of concept for non PCI devices under |
| 6 | * libata. While the QDI6580 was 'neat' in 1993 it is no longer terribly | 6 | * libata. While the QDI6580 was 'neat' in 1993 it is no longer terribly |
diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c index 1c0d9fa7ee54..0b0aa452de14 100644 --- a/drivers/ata/pata_radisys.c +++ b/drivers/ata/pata_radisys.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_radisys.c - Intel PATA/SATA controllers | 2 | * pata_radisys.c - Intel PATA/SATA controllers |
| 3 | * | 3 | * |
| 4 | * (C) 2006 Red Hat <alan@redhat.com> | 4 | * (C) 2006 Red Hat <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * Some parts based on ata_piix.c by Jeff Garzik and others. | 6 | * Some parts based on ata_piix.c by Jeff Garzik and others. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c index 0278fd2b8fb1..9a4bdca54616 100644 --- a/drivers/ata/pata_sc1200.c +++ b/drivers/ata/pata_sc1200.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * New ATA layer SC1200 driver Alan Cox <alan@redhat.com> | 2 | * New ATA layer SC1200 driver Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 3 | * | 3 | * |
| 4 | * TODO: Mode selection filtering | 4 | * TODO: Mode selection filtering |
| 5 | * TODO: Can't enable second channel until ATA core has serialize | 5 | * TODO: Can't enable second channel until ATA core has serialize |
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index 16673d168573..cf3707e516a2 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * Copyright 2003-2005 Jeff Garzik | 8 | * Copyright 2003-2005 Jeff Garzik |
| 9 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer | 9 | * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer |
| 10 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> | 10 | * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> |
| 11 | * Copyright (C) 2003 Red Hat Inc <alan@redhat.com> | 11 | * Copyright (C) 2003 Red Hat Inc |
| 12 | * | 12 | * |
| 13 | * and drivers/ata/ahci.c: | 13 | * and drivers/ata/ahci.c: |
| 14 | * Copyright 2004-2005 Red Hat, Inc. | 14 | * Copyright 2004-2005 Red Hat, Inc. |
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c index ffd26d0dc50d..72e41c9f969b 100644 --- a/drivers/ata/pata_serverworks.c +++ b/drivers/ata/pata_serverworks.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_serverworks.c - Serverworks PATA for new ATA layer | 2 | * pata_serverworks.c - Serverworks PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * based upon | 5 | * based upon |
| 7 | * | 6 | * |
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c index a598bb36aafc..83580a59db58 100644 --- a/drivers/ata/pata_sil680.c +++ b/drivers/ata/pata_sil680.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_sil680.c - SIL680 PATA for new ATA layer | 2 | * pata_sil680.c - SIL680 PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * based upon | 5 | * based upon |
| 7 | * | 6 | * |
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c index 26345d7b531c..d34236611752 100644 --- a/drivers/ata/pata_sis.c +++ b/drivers/ata/pata_sis.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_sis.c - SiS ATA driver | 2 | * pata_sis.c - SiS ATA driver |
| 3 | * | 3 | * |
| 4 | * (C) 2005 Red Hat <alan@redhat.com> | 4 | * (C) 2005 Red Hat |
| 5 | * (C) 2007 Bartlomiej Zolnierkiewicz | 5 | * (C) 2007 Bartlomiej Zolnierkiewicz |
| 6 | * | 6 | * |
| 7 | * Based upon linux/drivers/ide/pci/sis5513.c | 7 | * Based upon linux/drivers/ide/pci/sis5513.c |
diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c index 69877bd81815..1b0e7b6d8ef5 100644 --- a/drivers/ata/pata_sl82c105.c +++ b/drivers/ata/pata_sl82c105.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_sl82c105.c - SL82C105 PATA for new ATA layer | 2 | * pata_sl82c105.c - SL82C105 PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Based in part on linux/drivers/ide/pci/sl82c105.c | 5 | * Based in part on linux/drivers/ide/pci/sl82c105.c |
| 7 | * SL82C105/Winbond 553 IDE driver | 6 | * SL82C105/Winbond 553 IDE driver |
diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c index b181261f2743..ef9597517cdd 100644 --- a/drivers/ata/pata_triflex.c +++ b/drivers/ata/pata_triflex.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_triflex.c - Compaq PATA for new ATA layer | 2 | * pata_triflex.c - Compaq PATA for new ATA layer |
| 3 | * (C) 2005 Red Hat Inc | 3 | * (C) 2005 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | 4 | * Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * based upon | 6 | * based upon |
| 7 | * | 7 | * |
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index 8fdb2ce73210..681169c9c640 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_via.c - VIA PATA for new ATA layer | 2 | * pata_via.c - VIA PATA for new ATA layer |
| 3 | * (C) 2005-2006 Red Hat Inc | 3 | * (C) 2005-2006 Red Hat Inc |
| 4 | * Alan Cox <alan@redhat.com> | ||
| 5 | * | 4 | * |
| 6 | * Documentation | 5 | * Documentation |
| 7 | * Most chipset documentation available under NDA only | 6 | * Most chipset documentation available under NDA only |
diff --git a/drivers/ata/pata_winbond.c b/drivers/ata/pata_winbond.c index a7606b044a61..319e164a3d74 100644 --- a/drivers/ata/pata_winbond.c +++ b/drivers/ata/pata_winbond.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pata_winbond.c - Winbond VLB ATA controllers | 2 | * pata_winbond.c - Winbond VLB ATA controllers |
| 3 | * (C) 2006 Red Hat <alan@redhat.com> | 3 | * (C) 2006 Red Hat |
| 4 | * | 4 | * |
| 5 | * Support for the Winbond 83759A when operating in advanced mode. | 5 | * Support for the Winbond 83759A when operating in advanced mode. |
| 6 | * Multichip mode is not currently supported. | 6 | * Multichip mode is not currently supported. |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 4621807a1a6a..ccee930f1e12 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
| @@ -1329,6 +1329,11 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1329 | } | 1329 | } |
| 1330 | } | 1330 | } |
| 1331 | 1331 | ||
| 1332 | /* Set max read request size to 4096. This slightly increases | ||
| 1333 | * write throughput for pci-e variants. | ||
| 1334 | */ | ||
| 1335 | pcie_set_readrq(pdev, 4096); | ||
| 1336 | |||
| 1332 | sil24_init_controller(host); | 1337 | sil24_init_controller(host); |
| 1333 | 1338 | ||
| 1334 | pci_set_master(pdev); | 1339 | pci_set_master(pdev); |
diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c index 58630cc1eff2..cda6c7cc944b 100644 --- a/drivers/bluetooth/btsdio.c +++ b/drivers/bluetooth/btsdio.c | |||
| @@ -152,7 +152,7 @@ static int btsdio_rx_packet(struct btsdio_data *data) | |||
| 152 | 152 | ||
| 153 | err = sdio_readsb(data->func, skb->data, REG_RDAT, len - 4); | 153 | err = sdio_readsb(data->func, skb->data, REG_RDAT, len - 4); |
| 154 | if (err < 0) { | 154 | if (err < 0) { |
| 155 | kfree(skb); | 155 | kfree_skb(skb); |
| 156 | return err; | 156 | return err; |
| 157 | } | 157 | } |
| 158 | 158 | ||
diff --git a/drivers/char/hw_random/amd-rng.c b/drivers/char/hw_random/amd-rng.c index c422e870dc52..cd0ba51f7c80 100644 --- a/drivers/char/hw_random/amd-rng.c +++ b/drivers/char/hw_random/amd-rng.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * derived from | 11 | * derived from |
| 12 | * | 12 | * |
| 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
| 14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
| 15 | * | 15 | * |
| 16 | * derived from | 16 | * derived from |
| 17 | * | 17 | * |
diff --git a/drivers/char/hw_random/geode-rng.c b/drivers/char/hw_random/geode-rng.c index fed4ef5569f5..64d513f68368 100644 --- a/drivers/char/hw_random/geode-rng.c +++ b/drivers/char/hw_random/geode-rng.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * derived from | 11 | * derived from |
| 12 | * | 12 | * |
| 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
| 14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
| 15 | * | 15 | * |
| 16 | * derived from | 16 | * derived from |
| 17 | * | 17 | * |
diff --git a/drivers/char/hw_random/intel-rng.c b/drivers/char/hw_random/intel-rng.c index 8a2fce0756ec..5dcbe603eca2 100644 --- a/drivers/char/hw_random/intel-rng.c +++ b/drivers/char/hw_random/intel-rng.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * derived from | 11 | * derived from |
| 12 | * | 12 | * |
| 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
| 14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
| 15 | * | 15 | * |
| 16 | * derived from | 16 | * derived from |
| 17 | * | 17 | * |
diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c index 128202e18fc9..4e9573c1d39e 100644 --- a/drivers/char/hw_random/via-rng.c +++ b/drivers/char/hw_random/via-rng.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * derived from | 11 | * derived from |
| 12 | * | 12 | * |
| 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
| 14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
| 15 | * | 15 | * |
| 16 | * derived from | 16 | * derived from |
| 17 | * | 17 | * |
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index 251416f2148f..8e16bfbdcb3d 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
| @@ -476,6 +476,7 @@ static int ar_context_add_page(struct ar_context *ctx) | |||
| 476 | if (ab == NULL) | 476 | if (ab == NULL) |
| 477 | return -ENOMEM; | 477 | return -ENOMEM; |
| 478 | 478 | ||
| 479 | ab->next = NULL; | ||
| 479 | memset(&ab->descriptor, 0, sizeof(ab->descriptor)); | 480 | memset(&ab->descriptor, 0, sizeof(ab->descriptor)); |
| 480 | ab->descriptor.control = cpu_to_le16(DESCRIPTOR_INPUT_MORE | | 481 | ab->descriptor.control = cpu_to_le16(DESCRIPTOR_INPUT_MORE | |
| 481 | DESCRIPTOR_STATUS | | 482 | DESCRIPTOR_STATUS | |
| @@ -496,6 +497,21 @@ static int ar_context_add_page(struct ar_context *ctx) | |||
| 496 | return 0; | 497 | return 0; |
| 497 | } | 498 | } |
| 498 | 499 | ||
| 500 | static void ar_context_release(struct ar_context *ctx) | ||
| 501 | { | ||
| 502 | struct ar_buffer *ab, *ab_next; | ||
| 503 | size_t offset; | ||
| 504 | dma_addr_t ab_bus; | ||
| 505 | |||
| 506 | for (ab = ctx->current_buffer; ab; ab = ab_next) { | ||
| 507 | ab_next = ab->next; | ||
| 508 | offset = offsetof(struct ar_buffer, data); | ||
| 509 | ab_bus = le32_to_cpu(ab->descriptor.data_address) - offset; | ||
| 510 | dma_free_coherent(ctx->ohci->card.device, PAGE_SIZE, | ||
| 511 | ab, ab_bus); | ||
| 512 | } | ||
| 513 | } | ||
| 514 | |||
| 499 | #if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32) | 515 | #if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32) |
| 500 | #define cond_le32_to_cpu(v) \ | 516 | #define cond_le32_to_cpu(v) \ |
| 501 | (ohci->old_uninorth ? (__force __u32)(v) : le32_to_cpu(v)) | 517 | (ohci->old_uninorth ? (__force __u32)(v) : le32_to_cpu(v)) |
| @@ -2349,8 +2365,8 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2349 | 2365 | ||
| 2350 | ohci = kzalloc(sizeof(*ohci), GFP_KERNEL); | 2366 | ohci = kzalloc(sizeof(*ohci), GFP_KERNEL); |
| 2351 | if (ohci == NULL) { | 2367 | if (ohci == NULL) { |
| 2352 | fw_error("Could not malloc fw_ohci data.\n"); | 2368 | err = -ENOMEM; |
| 2353 | return -ENOMEM; | 2369 | goto fail; |
| 2354 | } | 2370 | } |
| 2355 | 2371 | ||
| 2356 | fw_card_initialize(&ohci->card, &ohci_driver, &dev->dev); | 2372 | fw_card_initialize(&ohci->card, &ohci_driver, &dev->dev); |
| @@ -2359,7 +2375,7 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2359 | 2375 | ||
| 2360 | err = pci_enable_device(dev); | 2376 | err = pci_enable_device(dev); |
| 2361 | if (err) { | 2377 | if (err) { |
| 2362 | fw_error("Failed to enable OHCI hardware.\n"); | 2378 | fw_error("Failed to enable OHCI hardware\n"); |
| 2363 | goto fail_free; | 2379 | goto fail_free; |
| 2364 | } | 2380 | } |
| 2365 | 2381 | ||
| @@ -2427,9 +2443,8 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2427 | ohci->ir_context_list = kzalloc(size, GFP_KERNEL); | 2443 | ohci->ir_context_list = kzalloc(size, GFP_KERNEL); |
| 2428 | 2444 | ||
| 2429 | if (ohci->it_context_list == NULL || ohci->ir_context_list == NULL) { | 2445 | if (ohci->it_context_list == NULL || ohci->ir_context_list == NULL) { |
| 2430 | fw_error("Out of memory for it/ir contexts.\n"); | ||
| 2431 | err = -ENOMEM; | 2446 | err = -ENOMEM; |
| 2432 | goto fail_registers; | 2447 | goto fail_contexts; |
| 2433 | } | 2448 | } |
| 2434 | 2449 | ||
| 2435 | /* self-id dma buffer allocation */ | 2450 | /* self-id dma buffer allocation */ |
| @@ -2438,9 +2453,8 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2438 | &ohci->self_id_bus, | 2453 | &ohci->self_id_bus, |
| 2439 | GFP_KERNEL); | 2454 | GFP_KERNEL); |
| 2440 | if (ohci->self_id_cpu == NULL) { | 2455 | if (ohci->self_id_cpu == NULL) { |
| 2441 | fw_error("Out of memory for self ID buffer.\n"); | ||
| 2442 | err = -ENOMEM; | 2456 | err = -ENOMEM; |
| 2443 | goto fail_registers; | 2457 | goto fail_contexts; |
| 2444 | } | 2458 | } |
| 2445 | 2459 | ||
| 2446 | bus_options = reg_read(ohci, OHCI1394_BusOptions); | 2460 | bus_options = reg_read(ohci, OHCI1394_BusOptions); |
| @@ -2460,9 +2474,13 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2460 | fail_self_id: | 2474 | fail_self_id: |
| 2461 | dma_free_coherent(ohci->card.device, SELF_ID_BUF_SIZE, | 2475 | dma_free_coherent(ohci->card.device, SELF_ID_BUF_SIZE, |
| 2462 | ohci->self_id_cpu, ohci->self_id_bus); | 2476 | ohci->self_id_cpu, ohci->self_id_bus); |
| 2463 | fail_registers: | 2477 | fail_contexts: |
| 2464 | kfree(ohci->it_context_list); | ||
| 2465 | kfree(ohci->ir_context_list); | 2478 | kfree(ohci->ir_context_list); |
| 2479 | kfree(ohci->it_context_list); | ||
| 2480 | context_release(&ohci->at_response_ctx); | ||
| 2481 | context_release(&ohci->at_request_ctx); | ||
| 2482 | ar_context_release(&ohci->ar_response_ctx); | ||
| 2483 | ar_context_release(&ohci->ar_request_ctx); | ||
| 2466 | pci_iounmap(dev, ohci->registers); | 2484 | pci_iounmap(dev, ohci->registers); |
| 2467 | fail_iomem: | 2485 | fail_iomem: |
| 2468 | pci_release_region(dev, 0); | 2486 | pci_release_region(dev, 0); |
| @@ -2471,6 +2489,9 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
| 2471 | fail_free: | 2489 | fail_free: |
| 2472 | kfree(&ohci->card); | 2490 | kfree(&ohci->card); |
| 2473 | ohci_pmac_off(dev); | 2491 | ohci_pmac_off(dev); |
| 2492 | fail: | ||
| 2493 | if (err == -ENOMEM) | ||
| 2494 | fw_error("Out of memory\n"); | ||
| 2474 | 2495 | ||
| 2475 | return err; | 2496 | return err; |
| 2476 | } | 2497 | } |
| @@ -2491,8 +2512,19 @@ static void pci_remove(struct pci_dev *dev) | |||
| 2491 | 2512 | ||
| 2492 | software_reset(ohci); | 2513 | software_reset(ohci); |
| 2493 | free_irq(dev->irq, ohci); | 2514 | free_irq(dev->irq, ohci); |
| 2515 | |||
| 2516 | if (ohci->next_config_rom && ohci->next_config_rom != ohci->config_rom) | ||
| 2517 | dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, | ||
| 2518 | ohci->next_config_rom, ohci->next_config_rom_bus); | ||
| 2519 | if (ohci->config_rom) | ||
| 2520 | dma_free_coherent(ohci->card.device, CONFIG_ROM_SIZE, | ||
| 2521 | ohci->config_rom, ohci->config_rom_bus); | ||
| 2494 | dma_free_coherent(ohci->card.device, SELF_ID_BUF_SIZE, | 2522 | dma_free_coherent(ohci->card.device, SELF_ID_BUF_SIZE, |
| 2495 | ohci->self_id_cpu, ohci->self_id_bus); | 2523 | ohci->self_id_cpu, ohci->self_id_bus); |
| 2524 | ar_context_release(&ohci->ar_request_ctx); | ||
| 2525 | ar_context_release(&ohci->ar_response_ctx); | ||
| 2526 | context_release(&ohci->at_request_ctx); | ||
| 2527 | context_release(&ohci->at_response_ctx); | ||
| 2496 | kfree(ohci->it_context_list); | 2528 | kfree(ohci->it_context_list); |
| 2497 | kfree(ohci->ir_context_list); | 2529 | kfree(ohci->ir_context_list); |
| 2498 | pci_iounmap(dev, ohci->registers); | 2530 | pci_iounmap(dev, ohci->registers); |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index ef0b9b419c27..d334cac5e1fc 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
| @@ -173,6 +173,9 @@ struct sbp2_target { | |||
| 173 | int blocked; /* ditto */ | 173 | int blocked; /* ditto */ |
| 174 | }; | 174 | }; |
| 175 | 175 | ||
| 176 | /* Impossible login_id, to detect logout attempt before successful login */ | ||
| 177 | #define INVALID_LOGIN_ID 0x10000 | ||
| 178 | |||
| 176 | /* | 179 | /* |
| 177 | * Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be | 180 | * Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be |
| 178 | * provided in the config rom. Most devices do provide a value, which | 181 | * provided in the config rom. Most devices do provide a value, which |
| @@ -788,9 +791,20 @@ static void sbp2_release_target(struct kref *kref) | |||
| 788 | scsi_remove_device(sdev); | 791 | scsi_remove_device(sdev); |
| 789 | scsi_device_put(sdev); | 792 | scsi_device_put(sdev); |
| 790 | } | 793 | } |
| 791 | sbp2_send_management_orb(lu, tgt->node_id, lu->generation, | 794 | if (lu->login_id != INVALID_LOGIN_ID) { |
| 792 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); | 795 | int generation, node_id; |
| 793 | 796 | /* | |
| 797 | * tgt->node_id may be obsolete here if we failed | ||
| 798 | * during initial login or after a bus reset where | ||
| 799 | * the topology changed. | ||
| 800 | */ | ||
| 801 | generation = device->generation; | ||
| 802 | smp_rmb(); /* node_id vs. generation */ | ||
| 803 | node_id = device->node_id; | ||
| 804 | sbp2_send_management_orb(lu, node_id, generation, | ||
| 805 | SBP2_LOGOUT_REQUEST, | ||
| 806 | lu->login_id, NULL); | ||
| 807 | } | ||
| 794 | fw_core_remove_address_handler(&lu->address_handler); | 808 | fw_core_remove_address_handler(&lu->address_handler); |
| 795 | list_del(&lu->link); | 809 | list_del(&lu->link); |
| 796 | kfree(lu); | 810 | kfree(lu); |
| @@ -805,19 +819,20 @@ static void sbp2_release_target(struct kref *kref) | |||
| 805 | 819 | ||
| 806 | static struct workqueue_struct *sbp2_wq; | 820 | static struct workqueue_struct *sbp2_wq; |
| 807 | 821 | ||
| 822 | static void sbp2_target_put(struct sbp2_target *tgt) | ||
| 823 | { | ||
| 824 | kref_put(&tgt->kref, sbp2_release_target); | ||
| 825 | } | ||
| 826 | |||
| 808 | /* | 827 | /* |
| 809 | * Always get the target's kref when scheduling work on one its units. | 828 | * Always get the target's kref when scheduling work on one its units. |
| 810 | * Each workqueue job is responsible to call sbp2_target_put() upon return. | 829 | * Each workqueue job is responsible to call sbp2_target_put() upon return. |
| 811 | */ | 830 | */ |
| 812 | static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay) | 831 | static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay) |
| 813 | { | 832 | { |
| 814 | if (queue_delayed_work(sbp2_wq, &lu->work, delay)) | 833 | kref_get(&lu->tgt->kref); |
| 815 | kref_get(&lu->tgt->kref); | 834 | if (!queue_delayed_work(sbp2_wq, &lu->work, delay)) |
| 816 | } | 835 | sbp2_target_put(lu->tgt); |
| 817 | |||
| 818 | static void sbp2_target_put(struct sbp2_target *tgt) | ||
| 819 | { | ||
| 820 | kref_put(&tgt->kref, sbp2_release_target); | ||
| 821 | } | 836 | } |
| 822 | 837 | ||
| 823 | /* | 838 | /* |
| @@ -978,6 +993,7 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) | |||
| 978 | 993 | ||
| 979 | lu->tgt = tgt; | 994 | lu->tgt = tgt; |
| 980 | lu->lun = lun_entry & 0xffff; | 995 | lu->lun = lun_entry & 0xffff; |
| 996 | lu->login_id = INVALID_LOGIN_ID; | ||
| 981 | lu->retries = 0; | 997 | lu->retries = 0; |
| 982 | lu->has_sdev = false; | 998 | lu->has_sdev = false; |
| 983 | lu->blocked = false; | 999 | lu->blocked = false; |
| @@ -1147,7 +1163,7 @@ static int sbp2_probe(struct device *dev) | |||
| 1147 | 1163 | ||
| 1148 | /* Do the login in a workqueue so we can easily reschedule retries. */ | 1164 | /* Do the login in a workqueue so we can easily reschedule retries. */ |
| 1149 | list_for_each_entry(lu, &tgt->lu_list, link) | 1165 | list_for_each_entry(lu, &tgt->lu_list, link) |
| 1150 | sbp2_queue_work(lu, 0); | 1166 | sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); |
| 1151 | return 0; | 1167 | return 0; |
| 1152 | 1168 | ||
| 1153 | fail_tgt_put: | 1169 | fail_tgt_put: |
diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c index c1b81077c4a8..5e204713002d 100644 --- a/drivers/firewire/fw-topology.c +++ b/drivers/firewire/fw-topology.c | |||
| @@ -413,7 +413,7 @@ static void | |||
| 413 | update_tree(struct fw_card *card, struct fw_node *root) | 413 | update_tree(struct fw_card *card, struct fw_node *root) |
| 414 | { | 414 | { |
| 415 | struct list_head list0, list1; | 415 | struct list_head list0, list1; |
| 416 | struct fw_node *node0, *node1; | 416 | struct fw_node *node0, *node1, *next1; |
| 417 | int i, event; | 417 | int i, event; |
| 418 | 418 | ||
| 419 | INIT_LIST_HEAD(&list0); | 419 | INIT_LIST_HEAD(&list0); |
| @@ -485,7 +485,9 @@ update_tree(struct fw_card *card, struct fw_node *root) | |||
| 485 | } | 485 | } |
| 486 | 486 | ||
| 487 | node0 = fw_node(node0->link.next); | 487 | node0 = fw_node(node0->link.next); |
| 488 | node1 = fw_node(node1->link.next); | 488 | next1 = fw_node(node1->link.next); |
| 489 | fw_node_put(node1); | ||
| 490 | node1 = next1; | ||
| 489 | } | 491 | } |
| 490 | } | 492 | } |
| 491 | 493 | ||
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h index 027f58ce81ad..aed7dbb17cda 100644 --- a/drivers/firewire/fw-transaction.h +++ b/drivers/firewire/fw-transaction.h | |||
| @@ -248,7 +248,7 @@ struct fw_card { | |||
| 248 | struct fw_node *local_node; | 248 | struct fw_node *local_node; |
| 249 | struct fw_node *root_node; | 249 | struct fw_node *root_node; |
| 250 | struct fw_node *irm_node; | 250 | struct fw_node *irm_node; |
| 251 | int color; | 251 | u8 color; /* must be u8 to match the definition in struct fw_node */ |
| 252 | int gap_count; | 252 | int gap_count; |
| 253 | bool beta_repeaters_present; | 253 | bool beta_repeaters_present; |
| 254 | 254 | ||
diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c index ce238f59b3c8..be3a15f5b25d 100644 --- a/drivers/input/misc/sgi_btns.c +++ b/drivers/input/misc/sgi_btns.c | |||
| @@ -174,5 +174,6 @@ static void __exit sgi_buttons_exit(void) | |||
| 174 | platform_driver_unregister(&sgi_buttons_driver); | 174 | platform_driver_unregister(&sgi_buttons_driver); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | MODULE_LICENSE("GPL"); | ||
| 177 | module_init(sgi_buttons_init); | 178 | module_init(sgi_buttons_init); |
| 178 | module_exit(sgi_buttons_exit); | 179 | module_exit(sgi_buttons_exit); |
diff --git a/drivers/leds/leds-da903x.c b/drivers/leds/leds-da903x.c index f1fddb18d70d..1f3cc512eff8 100644 --- a/drivers/leds/leds-da903x.c +++ b/drivers/leds/leds-da903x.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
| 19 | #include <linux/leds.h> | 19 | #include <linux/leds.h> |
| 20 | #include <linux/workqueue.h> | ||
| 20 | #include <linux/mfd/da903x.h> | 21 | #include <linux/mfd/da903x.h> |
| 21 | 22 | ||
| 22 | #define DA9030_LED1_CONTROL 0x20 | 23 | #define DA9030_LED1_CONTROL 0x20 |
| @@ -57,7 +58,7 @@ static void da903x_led_work(struct work_struct *work) | |||
| 57 | offset = DA9030_LED_OFFSET(led->id); | 58 | offset = DA9030_LED_OFFSET(led->id); |
| 58 | val = led->flags & ~0x87; | 59 | val = led->flags & ~0x87; |
| 59 | val |= (led->new_brightness) ? 0x80 : 0; /* EN bit */ | 60 | val |= (led->new_brightness) ? 0x80 : 0; /* EN bit */ |
| 60 | val |= (led->new_brightness >> 5) & 0x7; /* PWM<2:0> */ | 61 | val |= (0x7 - (led->new_brightness >> 5)) & 0x7; /* PWM<2:0> */ |
| 61 | da903x_write(led->master, DA9030_LED1_CONTROL + offset, val); | 62 | da903x_write(led->master, DA9030_LED1_CONTROL + offset, val); |
| 62 | break; | 63 | break; |
| 63 | case DA9030_ID_VIBRA: | 64 | case DA9030_ID_VIBRA: |
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c index 5749f22b296f..079e6aa874dc 100644 --- a/drivers/net/wireless/libertas/rx.c +++ b/drivers/net/wireless/libertas/rx.c | |||
| @@ -328,7 +328,7 @@ static int process_rxed_802_11_packet(struct lbs_private *priv, | |||
| 328 | lbs_deb_rx("rx err: frame received with bad length\n"); | 328 | lbs_deb_rx("rx err: frame received with bad length\n"); |
| 329 | priv->stats.rx_length_errors++; | 329 | priv->stats.rx_length_errors++; |
| 330 | ret = -EINVAL; | 330 | ret = -EINVAL; |
| 331 | kfree(skb); | 331 | kfree_skb(skb); |
| 332 | goto done; | 332 | goto done; |
| 333 | } | 333 | } |
| 334 | 334 | ||
diff --git a/drivers/s390/char/tape_block.c b/drivers/s390/char/tape_block.c index 023803dbb0c7..ae18baf59f06 100644 --- a/drivers/s390/char/tape_block.c +++ b/drivers/s390/char/tape_block.c | |||
| @@ -76,7 +76,7 @@ tapeblock_trigger_requeue(struct tape_device *device) | |||
| 76 | static void | 76 | static void |
| 77 | tapeblock_end_request(struct request *req, int error) | 77 | tapeblock_end_request(struct request *req, int error) |
| 78 | { | 78 | { |
| 79 | if (__blk_end_request(req, error, blk_rq_bytes(req))) | 79 | if (blk_end_request(req, error, blk_rq_bytes(req))) |
| 80 | BUG(); | 80 | BUG(); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| @@ -166,7 +166,7 @@ tapeblock_requeue(struct work_struct *work) { | |||
| 166 | nr_queued++; | 166 | nr_queued++; |
| 167 | spin_unlock(get_ccwdev_lock(device->cdev)); | 167 | spin_unlock(get_ccwdev_lock(device->cdev)); |
| 168 | 168 | ||
| 169 | spin_lock(&device->blk_data.request_queue_lock); | 169 | spin_lock_irq(&device->blk_data.request_queue_lock); |
| 170 | while ( | 170 | while ( |
| 171 | !blk_queue_plugged(queue) && | 171 | !blk_queue_plugged(queue) && |
| 172 | elv_next_request(queue) && | 172 | elv_next_request(queue) && |
| @@ -176,7 +176,9 @@ tapeblock_requeue(struct work_struct *work) { | |||
| 176 | if (rq_data_dir(req) == WRITE) { | 176 | if (rq_data_dir(req) == WRITE) { |
| 177 | DBF_EVENT(1, "TBLOCK: Rejecting write request\n"); | 177 | DBF_EVENT(1, "TBLOCK: Rejecting write request\n"); |
| 178 | blkdev_dequeue_request(req); | 178 | blkdev_dequeue_request(req); |
| 179 | spin_unlock_irq(&device->blk_data.request_queue_lock); | ||
| 179 | tapeblock_end_request(req, -EIO); | 180 | tapeblock_end_request(req, -EIO); |
| 181 | spin_lock_irq(&device->blk_data.request_queue_lock); | ||
| 180 | continue; | 182 | continue; |
| 181 | } | 183 | } |
| 182 | blkdev_dequeue_request(req); | 184 | blkdev_dequeue_request(req); |
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index d7073dbf825c..f9bb51fa7f5b 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
| @@ -1200,7 +1200,7 @@ tape_open(struct tape_device *device) | |||
| 1200 | { | 1200 | { |
| 1201 | int rc; | 1201 | int rc; |
| 1202 | 1202 | ||
| 1203 | spin_lock(get_ccwdev_lock(device->cdev)); | 1203 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
| 1204 | if (device->tape_state == TS_NOT_OPER) { | 1204 | if (device->tape_state == TS_NOT_OPER) { |
| 1205 | DBF_EVENT(6, "TAPE:nodev\n"); | 1205 | DBF_EVENT(6, "TAPE:nodev\n"); |
| 1206 | rc = -ENODEV; | 1206 | rc = -ENODEV; |
| @@ -1218,7 +1218,7 @@ tape_open(struct tape_device *device) | |||
| 1218 | tape_state_set(device, TS_IN_USE); | 1218 | tape_state_set(device, TS_IN_USE); |
| 1219 | rc = 0; | 1219 | rc = 0; |
| 1220 | } | 1220 | } |
| 1221 | spin_unlock(get_ccwdev_lock(device->cdev)); | 1221 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
| 1222 | return rc; | 1222 | return rc; |
| 1223 | } | 1223 | } |
| 1224 | 1224 | ||
| @@ -1228,11 +1228,11 @@ tape_open(struct tape_device *device) | |||
| 1228 | int | 1228 | int |
| 1229 | tape_release(struct tape_device *device) | 1229 | tape_release(struct tape_device *device) |
| 1230 | { | 1230 | { |
| 1231 | spin_lock(get_ccwdev_lock(device->cdev)); | 1231 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
| 1232 | if (device->tape_state == TS_IN_USE) | 1232 | if (device->tape_state == TS_IN_USE) |
| 1233 | tape_state_set(device, TS_UNUSED); | 1233 | tape_state_set(device, TS_UNUSED); |
| 1234 | module_put(device->discipline->owner); | 1234 | module_put(device->discipline->owner); |
| 1235 | spin_unlock(get_ccwdev_lock(device->cdev)); | 1235 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
| 1236 | return 0; | 1236 | return 0; |
| 1237 | } | 1237 | } |
| 1238 | 1238 | ||
diff --git a/drivers/s390/cio/qdio_debug.c b/drivers/s390/cio/qdio_debug.c index b5390821434f..f05590355be8 100644 --- a/drivers/s390/cio/qdio_debug.c +++ b/drivers/s390/cio/qdio_debug.c | |||
| @@ -20,6 +20,7 @@ static struct dentry *debugfs_root; | |||
| 20 | #define MAX_DEBUGFS_QUEUES 32 | 20 | #define MAX_DEBUGFS_QUEUES 32 |
| 21 | static struct dentry *debugfs_queues[MAX_DEBUGFS_QUEUES] = { NULL }; | 21 | static struct dentry *debugfs_queues[MAX_DEBUGFS_QUEUES] = { NULL }; |
| 22 | static DEFINE_MUTEX(debugfs_mutex); | 22 | static DEFINE_MUTEX(debugfs_mutex); |
| 23 | #define QDIO_DEBUGFS_NAME_LEN 40 | ||
| 23 | 24 | ||
| 24 | void qdio_allocate_do_dbf(struct qdio_initialize *init_data) | 25 | void qdio_allocate_do_dbf(struct qdio_initialize *init_data) |
| 25 | { | 26 | { |
| @@ -152,17 +153,6 @@ static int qstat_seq_open(struct inode *inode, struct file *filp) | |||
| 152 | filp->f_path.dentry->d_inode->i_private); | 153 | filp->f_path.dentry->d_inode->i_private); |
| 153 | } | 154 | } |
| 154 | 155 | ||
| 155 | static void get_queue_name(struct qdio_q *q, struct ccw_device *cdev, char *name) | ||
| 156 | { | ||
| 157 | memset(name, 0, sizeof(name)); | ||
| 158 | sprintf(name, "%s", dev_name(&cdev->dev)); | ||
| 159 | if (q->is_input_q) | ||
| 160 | sprintf(name + strlen(name), "_input"); | ||
| 161 | else | ||
| 162 | sprintf(name + strlen(name), "_output"); | ||
| 163 | sprintf(name + strlen(name), "_%d", q->nr); | ||
| 164 | } | ||
| 165 | |||
| 166 | static void remove_debugfs_entry(struct qdio_q *q) | 156 | static void remove_debugfs_entry(struct qdio_q *q) |
| 167 | { | 157 | { |
| 168 | int i; | 158 | int i; |
| @@ -189,14 +179,17 @@ static struct file_operations debugfs_fops = { | |||
| 189 | static void setup_debugfs_entry(struct qdio_q *q, struct ccw_device *cdev) | 179 | static void setup_debugfs_entry(struct qdio_q *q, struct ccw_device *cdev) |
| 190 | { | 180 | { |
| 191 | int i = 0; | 181 | int i = 0; |
| 192 | char name[40]; | 182 | char name[QDIO_DEBUGFS_NAME_LEN]; |
| 193 | 183 | ||
| 194 | while (debugfs_queues[i] != NULL) { | 184 | while (debugfs_queues[i] != NULL) { |
| 195 | i++; | 185 | i++; |
| 196 | if (i >= MAX_DEBUGFS_QUEUES) | 186 | if (i >= MAX_DEBUGFS_QUEUES) |
| 197 | return; | 187 | return; |
| 198 | } | 188 | } |
| 199 | get_queue_name(q, cdev, name); | 189 | snprintf(name, QDIO_DEBUGFS_NAME_LEN, "%s_%s_%d", |
| 190 | dev_name(&cdev->dev), | ||
| 191 | q->is_input_q ? "input" : "output", | ||
| 192 | q->nr); | ||
| 200 | debugfs_queues[i] = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUSR, | 193 | debugfs_queues[i] = debugfs_create_file(name, S_IFREG | S_IRUGO | S_IWUSR, |
| 201 | debugfs_root, q, &debugfs_fops); | 194 | debugfs_root, q, &debugfs_fops); |
| 202 | } | 195 | } |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index a50682d2a0fa..7c8659151993 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
| @@ -1083,7 +1083,6 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
| 1083 | case -EIO: | 1083 | case -EIO: |
| 1084 | sprintf(dbf_text, "ierr%4x", irq_ptr->schid.sch_no); | 1084 | sprintf(dbf_text, "ierr%4x", irq_ptr->schid.sch_no); |
| 1085 | QDIO_DBF_TEXT2(1, setup, dbf_text); | 1085 | QDIO_DBF_TEXT2(1, setup, dbf_text); |
| 1086 | qdio_int_error(cdev); | ||
| 1087 | return; | 1086 | return; |
| 1088 | case -ETIMEDOUT: | 1087 | case -ETIMEDOUT: |
| 1089 | sprintf(dbf_text, "qtoh%4x", irq_ptr->schid.sch_no); | 1088 | sprintf(dbf_text, "qtoh%4x", irq_ptr->schid.sch_no); |
diff --git a/drivers/video/backlight/corgi_lcd.c b/drivers/video/backlight/corgi_lcd.c index 2afd47eefe74..f8a4bb20f41a 100644 --- a/drivers/video/backlight/corgi_lcd.c +++ b/drivers/video/backlight/corgi_lcd.c | |||
| @@ -439,7 +439,7 @@ static int corgi_bl_update_status(struct backlight_device *bd) | |||
| 439 | return corgi_bl_set_intensity(lcd, intensity); | 439 | return corgi_bl_set_intensity(lcd, intensity); |
| 440 | } | 440 | } |
| 441 | 441 | ||
| 442 | void corgibl_limit_intensity(int limit) | 442 | void corgi_lcd_limit_intensity(int limit) |
| 443 | { | 443 | { |
| 444 | if (limit) | 444 | if (limit) |
| 445 | corgibl_flags |= CORGIBL_BATTLOW; | 445 | corgibl_flags |= CORGIBL_BATTLOW; |
| @@ -448,7 +448,7 @@ void corgibl_limit_intensity(int limit) | |||
| 448 | 448 | ||
| 449 | backlight_update_status(the_corgi_lcd->bl_dev); | 449 | backlight_update_status(the_corgi_lcd->bl_dev); |
| 450 | } | 450 | } |
| 451 | EXPORT_SYMBOL(corgibl_limit_intensity); | 451 | EXPORT_SYMBOL(corgi_lcd_limit_intensity); |
| 452 | 452 | ||
| 453 | static struct backlight_ops corgi_bl_ops = { | 453 | static struct backlight_ops corgi_bl_ops = { |
| 454 | .get_brightness = corgi_bl_get_intensity, | 454 | .get_brightness = corgi_bl_get_intensity, |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 9ce1ab6c268d..1e3b934a4cf7 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -774,7 +774,7 @@ void xen_poll_irq(int irq) | |||
| 774 | 774 | ||
| 775 | poll.nr_ports = 1; | 775 | poll.nr_ports = 1; |
| 776 | poll.timeout = 0; | 776 | poll.timeout = 0; |
| 777 | poll.ports = &evtchn; | 777 | set_xen_guest_handle(poll.ports, &evtchn); |
| 778 | 778 | ||
| 779 | if (HYPERVISOR_sched_op(SCHEDOP_poll, &poll) != 0) | 779 | if (HYPERVISOR_sched_op(SCHEDOP_poll, &poll) != 0) |
| 780 | BUG(); | 780 | BUG(); |
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index d0e87cbe157c..9b91617b9582 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c | |||
| @@ -39,8 +39,6 @@ static int xen_suspend(void *data) | |||
| 39 | 39 | ||
| 40 | BUG_ON(!irqs_disabled()); | 40 | BUG_ON(!irqs_disabled()); |
| 41 | 41 | ||
| 42 | load_cr3(swapper_pg_dir); | ||
| 43 | |||
| 44 | err = device_power_down(PMSG_SUSPEND); | 42 | err = device_power_down(PMSG_SUSPEND); |
| 45 | if (err) { | 43 | if (err) { |
| 46 | printk(KERN_ERR "xen_suspend: device_power_down failed: %d\n", | 44 | printk(KERN_ERR "xen_suspend: device_power_down failed: %d\n", |
diff --git a/drivers/xen/xencomm.c b/drivers/xen/xencomm.c index 797cb4e31f07..a240b2c20b99 100644 --- a/drivers/xen/xencomm.c +++ b/drivers/xen/xencomm.c | |||
| @@ -23,13 +23,7 @@ | |||
| 23 | #include <asm/page.h> | 23 | #include <asm/page.h> |
| 24 | #include <xen/xencomm.h> | 24 | #include <xen/xencomm.h> |
| 25 | #include <xen/interface/xen.h> | 25 | #include <xen/interface/xen.h> |
| 26 | #ifdef __ia64__ | 26 | #include <asm/xen/xencomm.h> /* for xencomm_is_phys_contiguous() */ |
| 27 | #include <asm/xen/xencomm.h> /* for is_kern_addr() */ | ||
| 28 | #endif | ||
| 29 | |||
| 30 | #ifdef HAVE_XEN_PLATFORM_COMPAT_H | ||
| 31 | #include <xen/platform-compat.h> | ||
| 32 | #endif | ||
| 33 | 27 | ||
| 34 | static int xencomm_init(struct xencomm_desc *desc, | 28 | static int xencomm_init(struct xencomm_desc *desc, |
| 35 | void *buffer, unsigned long bytes) | 29 | void *buffer, unsigned long bytes) |
| @@ -157,20 +151,11 @@ static int xencomm_create(void *buffer, unsigned long bytes, | |||
| 157 | return 0; | 151 | return 0; |
| 158 | } | 152 | } |
| 159 | 153 | ||
| 160 | /* check if memory address is within VMALLOC region */ | ||
| 161 | static int is_phys_contiguous(unsigned long addr) | ||
| 162 | { | ||
| 163 | if (!is_kernel_addr(addr)) | ||
| 164 | return 0; | ||
| 165 | |||
| 166 | return (addr < VMALLOC_START) || (addr >= VMALLOC_END); | ||
| 167 | } | ||
| 168 | |||
| 169 | static struct xencomm_handle *xencomm_create_inline(void *ptr) | 154 | static struct xencomm_handle *xencomm_create_inline(void *ptr) |
| 170 | { | 155 | { |
| 171 | unsigned long paddr; | 156 | unsigned long paddr; |
| 172 | 157 | ||
| 173 | BUG_ON(!is_phys_contiguous((unsigned long)ptr)); | 158 | BUG_ON(!xencomm_is_phys_contiguous((unsigned long)ptr)); |
| 174 | 159 | ||
| 175 | paddr = (unsigned long)xencomm_pa(ptr); | 160 | paddr = (unsigned long)xencomm_pa(ptr); |
| 176 | BUG_ON(paddr & XENCOMM_INLINE_FLAG); | 161 | BUG_ON(paddr & XENCOMM_INLINE_FLAG); |
| @@ -202,7 +187,7 @@ struct xencomm_handle *xencomm_map(void *ptr, unsigned long bytes) | |||
| 202 | int rc; | 187 | int rc; |
| 203 | struct xencomm_desc *desc; | 188 | struct xencomm_desc *desc; |
| 204 | 189 | ||
| 205 | if (is_phys_contiguous((unsigned long)ptr)) | 190 | if (xencomm_is_phys_contiguous((unsigned long)ptr)) |
| 206 | return xencomm_create_inline(ptr); | 191 | return xencomm_create_inline(ptr); |
| 207 | 192 | ||
| 208 | rc = xencomm_create(ptr, bytes, &desc, GFP_KERNEL); | 193 | rc = xencomm_create(ptr, bytes, &desc, GFP_KERNEL); |
| @@ -219,7 +204,7 @@ struct xencomm_handle *__xencomm_map_no_alloc(void *ptr, unsigned long bytes, | |||
| 219 | int rc; | 204 | int rc; |
| 220 | struct xencomm_desc *desc = NULL; | 205 | struct xencomm_desc *desc = NULL; |
| 221 | 206 | ||
| 222 | if (is_phys_contiguous((unsigned long)ptr)) | 207 | if (xencomm_is_phys_contiguous((unsigned long)ptr)) |
| 223 | return xencomm_create_inline(ptr); | 208 | return xencomm_create_inline(ptr); |
| 224 | 209 | ||
| 225 | rc = xencomm_create_mini(ptr, bytes, xc_desc, | 210 | rc = xencomm_create_mini(ptr, bytes, xc_desc, |
diff --git a/fs/coda/psdev.c b/fs/coda/psdev.c index cfd29da714d1..0376ac66c44a 100644 --- a/fs/coda/psdev.c +++ b/fs/coda/psdev.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * An implementation of a loadable kernel mode driver providing | 2 | * An implementation of a loadable kernel mode driver providing |
| 3 | * multiple kernel/user space bidirectional communications links. | 3 | * multiple kernel/user space bidirectional communications links. |
| 4 | * | 4 | * |
| 5 | * Author: Alan Cox <alan@redhat.com> | 5 | * Author: Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index b9195c02a863..dc52793ff8f8 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * nfs inode and superblock handling functions | 6 | * nfs inode and superblock handling functions |
| 7 | * | 7 | * |
| 8 | * Modularised by Alan Cox <Alan.Cox@linux.org>, while hacking some | 8 | * Modularised by Alan Cox <alan@lxorguk.ukuu.org.uk>, while hacking some |
| 9 | * experimental NFS changes. Modularisation taken straight from SYS5 fs. | 9 | * experimental NFS changes. Modularisation taken straight from SYS5 fs. |
| 10 | * | 10 | * |
| 11 | * Change to nfs_read_super() to permit NFS mounts to multi-homed hosts. | 11 | * Change to nfs_read_super() to permit NFS mounts to multi-homed hosts. |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index a3b0061dfd45..f48db679a1c6 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * nfs superblock handling functions | 6 | * nfs superblock handling functions |
| 7 | * | 7 | * |
| 8 | * Modularised by Alan Cox <Alan.Cox@linux.org>, while hacking some | 8 | * Modularised by Alan Cox <alan@lxorguk.ukuu.org.uk>, while hacking some |
| 9 | * experimental NFS changes. Modularisation taken straight from SYS5 fs. | 9 | * experimental NFS changes. Modularisation taken straight from SYS5 fs. |
| 10 | * | 10 | * |
| 11 | * Change to nfs_read_super() to permit NFS mounts to multi-homed hosts. | 11 | * Change to nfs_read_super() to permit NFS mounts to multi-homed hosts. |
diff --git a/fs/proc/array.c b/fs/proc/array.c index bb9f4b05703d..6af7fba7abb1 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | * | 40 | * |
| 41 | * | 41 | * |
| 42 | * Alan Cox : security fixes. | 42 | * Alan Cox : security fixes. |
| 43 | * <Alan.Cox@linux.org> | 43 | * <alan@lxorguk.ukuu.org.uk> |
| 44 | * | 44 | * |
| 45 | * Al Viro : safe handling of mm_struct | 45 | * Al Viro : safe handling of mm_struct |
| 46 | * | 46 | * |
diff --git a/include/asm-generic/kdebug.h b/include/asm-generic/kdebug.h index 2b799c90b2d4..11e57b6a85fc 100644 --- a/include/asm-generic/kdebug.h +++ b/include/asm-generic/kdebug.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | enum die_val { | 4 | enum die_val { |
| 5 | DIE_UNUSED, | 5 | DIE_UNUSED, |
| 6 | DIE_OOPS=1 | ||
| 6 | }; | 7 | }; |
| 7 | 8 | ||
| 8 | #endif /* _ASM_GENERIC_KDEBUG_H */ | 9 | #endif /* _ASM_GENERIC_KDEBUG_H */ |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index a3d46151be19..703eb53cfa2b 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | #include <linux/types.h> | 8 | #include <linux/types.h> |
| 9 | #include <linux/kallsyms.h> | 9 | #include <linux/kallsyms.h> |
| 10 | 10 | ||
| 11 | #ifdef CONFIG_FTRACE | 11 | #ifdef CONFIG_FUNCTION_TRACER |
| 12 | 12 | ||
| 13 | extern int ftrace_enabled; | 13 | extern int ftrace_enabled; |
| 14 | extern int | 14 | extern int |
| @@ -36,16 +36,14 @@ void clear_ftrace_function(void); | |||
| 36 | 36 | ||
| 37 | extern void ftrace_stub(unsigned long a0, unsigned long a1); | 37 | extern void ftrace_stub(unsigned long a0, unsigned long a1); |
| 38 | 38 | ||
| 39 | #else /* !CONFIG_FTRACE */ | 39 | #else /* !CONFIG_FUNCTION_TRACER */ |
| 40 | # define register_ftrace_function(ops) do { } while (0) | 40 | # define register_ftrace_function(ops) do { } while (0) |
| 41 | # define unregister_ftrace_function(ops) do { } while (0) | 41 | # define unregister_ftrace_function(ops) do { } while (0) |
| 42 | # define clear_ftrace_function(ops) do { } while (0) | 42 | # define clear_ftrace_function(ops) do { } while (0) |
| 43 | static inline void ftrace_kill_atomic(void) { } | 43 | static inline void ftrace_kill(void) { } |
| 44 | #endif /* CONFIG_FTRACE */ | 44 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 45 | 45 | ||
| 46 | #ifdef CONFIG_DYNAMIC_FTRACE | 46 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 47 | # define FTRACE_HASHBITS 10 | ||
| 48 | # define FTRACE_HASHSIZE (1<<FTRACE_HASHBITS) | ||
| 49 | 47 | ||
| 50 | enum { | 48 | enum { |
| 51 | FTRACE_FL_FREE = (1 << 0), | 49 | FTRACE_FL_FREE = (1 << 0), |
| @@ -58,9 +56,9 @@ enum { | |||
| 58 | }; | 56 | }; |
| 59 | 57 | ||
| 60 | struct dyn_ftrace { | 58 | struct dyn_ftrace { |
| 61 | struct hlist_node node; | 59 | struct list_head list; |
| 62 | unsigned long ip; /* address of mcount call-site */ | 60 | unsigned long ip; /* address of mcount call-site */ |
| 63 | unsigned long flags; | 61 | unsigned long flags; |
| 64 | }; | 62 | }; |
| 65 | 63 | ||
| 66 | int ftrace_force_update(void); | 64 | int ftrace_force_update(void); |
| @@ -71,14 +69,33 @@ extern int ftrace_ip_converted(unsigned long ip); | |||
| 71 | extern unsigned char *ftrace_nop_replace(void); | 69 | extern unsigned char *ftrace_nop_replace(void); |
| 72 | extern unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr); | 70 | extern unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr); |
| 73 | extern int ftrace_dyn_arch_init(void *data); | 71 | extern int ftrace_dyn_arch_init(void *data); |
| 74 | extern int ftrace_mcount_set(unsigned long *data); | ||
| 75 | extern int ftrace_modify_code(unsigned long ip, unsigned char *old_code, | ||
| 76 | unsigned char *new_code); | ||
| 77 | extern int ftrace_update_ftrace_func(ftrace_func_t func); | 72 | extern int ftrace_update_ftrace_func(ftrace_func_t func); |
| 78 | extern void ftrace_caller(void); | 73 | extern void ftrace_caller(void); |
| 79 | extern void ftrace_call(void); | 74 | extern void ftrace_call(void); |
| 80 | extern void mcount_call(void); | 75 | extern void mcount_call(void); |
| 81 | 76 | ||
| 77 | /** | ||
| 78 | * ftrace_modify_code - modify code segment | ||
| 79 | * @ip: the address of the code segment | ||
| 80 | * @old_code: the contents of what is expected to be there | ||
| 81 | * @new_code: the code to patch in | ||
| 82 | * | ||
| 83 | * This is a very sensitive operation and great care needs | ||
| 84 | * to be taken by the arch. The operation should carefully | ||
| 85 | * read the location, check to see if what is read is indeed | ||
| 86 | * what we expect it to be, and then on success of the compare, | ||
| 87 | * it should write to the location. | ||
| 88 | * | ||
| 89 | * Return must be: | ||
| 90 | * 0 on success | ||
| 91 | * -EFAULT on error reading the location | ||
| 92 | * -EINVAL on a failed compare of the contents | ||
| 93 | * -EPERM on error writing to the location | ||
| 94 | * Any other value will be considered a failure. | ||
| 95 | */ | ||
| 96 | extern int ftrace_modify_code(unsigned long ip, unsigned char *old_code, | ||
| 97 | unsigned char *new_code); | ||
| 98 | |||
| 82 | extern int skip_trace(unsigned long ip); | 99 | extern int skip_trace(unsigned long ip); |
| 83 | 100 | ||
| 84 | extern void ftrace_release(void *start, unsigned long size); | 101 | extern void ftrace_release(void *start, unsigned long size); |
| @@ -97,11 +114,10 @@ static inline void ftrace_release(void *start, unsigned long size) { } | |||
| 97 | 114 | ||
| 98 | /* totally disable ftrace - can not re-enable after this */ | 115 | /* totally disable ftrace - can not re-enable after this */ |
| 99 | void ftrace_kill(void); | 116 | void ftrace_kill(void); |
| 100 | void ftrace_kill_atomic(void); | ||
| 101 | 117 | ||
| 102 | static inline void tracer_disable(void) | 118 | static inline void tracer_disable(void) |
| 103 | { | 119 | { |
| 104 | #ifdef CONFIG_FTRACE | 120 | #ifdef CONFIG_FUNCTION_TRACER |
| 105 | ftrace_enabled = 0; | 121 | ftrace_enabled = 0; |
| 106 | #endif | 122 | #endif |
| 107 | } | 123 | } |
| @@ -113,7 +129,7 @@ static inline void tracer_disable(void) | |||
| 113 | */ | 129 | */ |
| 114 | static inline int __ftrace_enabled_save(void) | 130 | static inline int __ftrace_enabled_save(void) |
| 115 | { | 131 | { |
| 116 | #ifdef CONFIG_FTRACE | 132 | #ifdef CONFIG_FUNCTION_TRACER |
| 117 | int saved_ftrace_enabled = ftrace_enabled; | 133 | int saved_ftrace_enabled = ftrace_enabled; |
| 118 | ftrace_enabled = 0; | 134 | ftrace_enabled = 0; |
| 119 | return saved_ftrace_enabled; | 135 | return saved_ftrace_enabled; |
| @@ -124,7 +140,7 @@ static inline int __ftrace_enabled_save(void) | |||
| 124 | 140 | ||
| 125 | static inline void __ftrace_enabled_restore(int enabled) | 141 | static inline void __ftrace_enabled_restore(int enabled) |
| 126 | { | 142 | { |
| 127 | #ifdef CONFIG_FTRACE | 143 | #ifdef CONFIG_FUNCTION_TRACER |
| 128 | ftrace_enabled = enabled; | 144 | ftrace_enabled = enabled; |
| 129 | #endif | 145 | #endif |
| 130 | } | 146 | } |
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 797fcd781242..f18b86fa8655 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
| @@ -489,6 +489,9 @@ struct kvm_assigned_pci_dev { | |||
| 489 | __u32 busnr; | 489 | __u32 busnr; |
| 490 | __u32 devfn; | 490 | __u32 devfn; |
| 491 | __u32 flags; | 491 | __u32 flags; |
| 492 | union { | ||
| 493 | __u32 reserved[12]; | ||
| 494 | }; | ||
| 492 | }; | 495 | }; |
| 493 | 496 | ||
| 494 | struct kvm_assigned_irq { | 497 | struct kvm_assigned_irq { |
| @@ -496,6 +499,9 @@ struct kvm_assigned_irq { | |||
| 496 | __u32 host_irq; | 499 | __u32 host_irq; |
| 497 | __u32 guest_irq; | 500 | __u32 guest_irq; |
| 498 | __u32 flags; | 501 | __u32 flags; |
| 502 | union { | ||
| 503 | __u32 reserved[12]; | ||
| 504 | }; | ||
| 499 | }; | 505 | }; |
| 500 | 506 | ||
| 501 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) | 507 | #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 3833c48fae3a..bb92be2153bc 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -37,6 +37,8 @@ | |||
| 37 | #define KVM_REQ_UNHALT 6 | 37 | #define KVM_REQ_UNHALT 6 |
| 38 | #define KVM_REQ_MMU_SYNC 7 | 38 | #define KVM_REQ_MMU_SYNC 7 |
| 39 | 39 | ||
| 40 | #define KVM_USERSPACE_IRQ_SOURCE_ID 0 | ||
| 41 | |||
| 40 | struct kvm_vcpu; | 42 | struct kvm_vcpu; |
| 41 | extern struct kmem_cache *kvm_vcpu_cache; | 43 | extern struct kmem_cache *kvm_vcpu_cache; |
| 42 | 44 | ||
| @@ -306,15 +308,18 @@ struct kvm_assigned_dev_kernel { | |||
| 306 | int host_irq; | 308 | int host_irq; |
| 307 | int guest_irq; | 309 | int guest_irq; |
| 308 | int irq_requested; | 310 | int irq_requested; |
| 311 | int irq_source_id; | ||
| 309 | struct pci_dev *dev; | 312 | struct pci_dev *dev; |
| 310 | struct kvm *kvm; | 313 | struct kvm *kvm; |
| 311 | }; | 314 | }; |
| 312 | void kvm_set_irq(struct kvm *kvm, int irq, int level); | 315 | void kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level); |
| 313 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi); | 316 | void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi); |
| 314 | void kvm_register_irq_ack_notifier(struct kvm *kvm, | 317 | void kvm_register_irq_ack_notifier(struct kvm *kvm, |
| 315 | struct kvm_irq_ack_notifier *kian); | 318 | struct kvm_irq_ack_notifier *kian); |
| 316 | void kvm_unregister_irq_ack_notifier(struct kvm *kvm, | 319 | void kvm_unregister_irq_ack_notifier(struct kvm *kvm, |
| 317 | struct kvm_irq_ack_notifier *kian); | 320 | struct kvm_irq_ack_notifier *kian); |
| 321 | int kvm_request_irq_source_id(struct kvm *kvm); | ||
| 322 | void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id); | ||
| 318 | 323 | ||
| 319 | #ifdef CONFIG_DMAR | 324 | #ifdef CONFIG_DMAR |
| 320 | int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn, | 325 | int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn, |
diff --git a/include/linux/phonet.h b/include/linux/phonet.h index c9609f9aedac..4157faa857b6 100644 --- a/include/linux/phonet.h +++ b/include/linux/phonet.h | |||
| @@ -72,6 +72,7 @@ struct phonetmsg { | |||
| 72 | } pn_msg_u; | 72 | } pn_msg_u; |
| 73 | }; | 73 | }; |
| 74 | #define PN_COMMON_MESSAGE 0xF0 | 74 | #define PN_COMMON_MESSAGE 0xF0 |
| 75 | #define PN_COMMGR 0x10 | ||
| 75 | #define PN_PREFIX 0xE0 /* resource for extended messages */ | 76 | #define PN_PREFIX 0xE0 /* resource for extended messages */ |
| 76 | #define pn_submsg_id pn_msg_u.base.pn_submsg_id | 77 | #define pn_submsg_id pn_msg_u.base.pn_submsg_id |
| 77 | #define pn_e_submsg_id pn_msg_u.ext.pn_e_submsg_id | 78 | #define pn_e_submsg_id pn_msg_u.ext.pn_e_submsg_id |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 8478f334d732..b483f39a7112 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -936,7 +936,6 @@ struct sched_class { | |||
| 936 | void (*enqueue_task) (struct rq *rq, struct task_struct *p, int wakeup); | 936 | void (*enqueue_task) (struct rq *rq, struct task_struct *p, int wakeup); |
| 937 | void (*dequeue_task) (struct rq *rq, struct task_struct *p, int sleep); | 937 | void (*dequeue_task) (struct rq *rq, struct task_struct *p, int sleep); |
| 938 | void (*yield_task) (struct rq *rq); | 938 | void (*yield_task) (struct rq *rq); |
| 939 | int (*select_task_rq)(struct task_struct *p, int sync); | ||
| 940 | 939 | ||
| 941 | void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int sync); | 940 | void (*check_preempt_curr) (struct rq *rq, struct task_struct *p, int sync); |
| 942 | 941 | ||
| @@ -944,6 +943,8 @@ struct sched_class { | |||
| 944 | void (*put_prev_task) (struct rq *rq, struct task_struct *p); | 943 | void (*put_prev_task) (struct rq *rq, struct task_struct *p); |
| 945 | 944 | ||
| 946 | #ifdef CONFIG_SMP | 945 | #ifdef CONFIG_SMP |
| 946 | int (*select_task_rq)(struct task_struct *p, int sync); | ||
| 947 | |||
| 947 | unsigned long (*load_balance) (struct rq *this_rq, int this_cpu, | 948 | unsigned long (*load_balance) (struct rq *this_rq, int this_cpu, |
| 948 | struct rq *busiest, unsigned long max_load_move, | 949 | struct rq *busiest, unsigned long max_load_move, |
| 949 | struct sched_domain *sd, enum cpu_idle_type idle, | 950 | struct sched_domain *sd, enum cpu_idle_type idle, |
| @@ -955,16 +956,17 @@ struct sched_class { | |||
| 955 | void (*pre_schedule) (struct rq *this_rq, struct task_struct *task); | 956 | void (*pre_schedule) (struct rq *this_rq, struct task_struct *task); |
| 956 | void (*post_schedule) (struct rq *this_rq); | 957 | void (*post_schedule) (struct rq *this_rq); |
| 957 | void (*task_wake_up) (struct rq *this_rq, struct task_struct *task); | 958 | void (*task_wake_up) (struct rq *this_rq, struct task_struct *task); |
| 958 | #endif | ||
| 959 | 959 | ||
| 960 | void (*set_curr_task) (struct rq *rq); | ||
| 961 | void (*task_tick) (struct rq *rq, struct task_struct *p, int queued); | ||
| 962 | void (*task_new) (struct rq *rq, struct task_struct *p); | ||
| 963 | void (*set_cpus_allowed)(struct task_struct *p, | 960 | void (*set_cpus_allowed)(struct task_struct *p, |
| 964 | const cpumask_t *newmask); | 961 | const cpumask_t *newmask); |
| 965 | 962 | ||
| 966 | void (*rq_online)(struct rq *rq); | 963 | void (*rq_online)(struct rq *rq); |
| 967 | void (*rq_offline)(struct rq *rq); | 964 | void (*rq_offline)(struct rq *rq); |
| 965 | #endif | ||
| 966 | |||
| 967 | void (*set_curr_task) (struct rq *rq); | ||
| 968 | void (*task_tick) (struct rq *rq, struct task_struct *p, int queued); | ||
| 969 | void (*task_new) (struct rq *rq, struct task_struct *p); | ||
| 968 | 970 | ||
| 969 | void (*switched_from) (struct rq *this_rq, struct task_struct *task, | 971 | void (*switched_from) (struct rq *this_rq, struct task_struct *task, |
| 970 | int running); | 972 | int running); |
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h index d4e72508e145..c6a245184460 100644 --- a/include/net/phonet/phonet.h +++ b/include/net/phonet/phonet.h | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | * The lower layers may not require more space, ever. Make sure it's | 27 | * The lower layers may not require more space, ever. Make sure it's |
| 28 | * enough. | 28 | * enough. |
| 29 | */ | 29 | */ |
| 30 | #define MAX_PHONET_HEADER 8 | 30 | #define MAX_PHONET_HEADER (8 + MAX_HEADER) |
| 31 | 31 | ||
| 32 | /* | 32 | /* |
| 33 | * Every Phonet* socket has this structure first in its | 33 | * Every Phonet* socket has this structure first in its |
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h index cf4c219c0b5c..17231385cb37 100644 --- a/include/scsi/scsi_tcq.h +++ b/include/scsi/scsi_tcq.h | |||
| @@ -140,8 +140,18 @@ static inline struct scsi_cmnd *scsi_find_tag(struct scsi_device *sdev, int tag) | |||
| 140 | */ | 140 | */ |
| 141 | static inline int scsi_init_shared_tag_map(struct Scsi_Host *shost, int depth) | 141 | static inline int scsi_init_shared_tag_map(struct Scsi_Host *shost, int depth) |
| 142 | { | 142 | { |
| 143 | shost->bqt = blk_init_tags(depth); | 143 | /* |
| 144 | return shost->bqt ? 0 : -ENOMEM; | 144 | * If the shared tag map isn't already initialized, do it now. |
| 145 | * This saves callers from having to check ->bqt when setting up | ||
| 146 | * devices on the shared host (for libata) | ||
| 147 | */ | ||
| 148 | if (!shost->bqt) { | ||
| 149 | shost->bqt = blk_init_tags(depth); | ||
| 150 | if (!shost->bqt) | ||
| 151 | return -ENOMEM; | ||
| 152 | } | ||
| 153 | |||
| 154 | return 0; | ||
| 145 | } | 155 | } |
| 146 | 156 | ||
| 147 | /** | 157 | /** |
diff --git a/kernel/Makefile b/kernel/Makefile index 305f11dbef21..9a3ec66a9d84 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
| @@ -13,7 +13,7 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o \ | |||
| 13 | 13 | ||
| 14 | CFLAGS_REMOVE_sched.o = -mno-spe | 14 | CFLAGS_REMOVE_sched.o = -mno-spe |
| 15 | 15 | ||
| 16 | ifdef CONFIG_FTRACE | 16 | ifdef CONFIG_FUNCTION_TRACER |
| 17 | # Do not trace debug files and internal ftrace files | 17 | # Do not trace debug files and internal ftrace files |
| 18 | CFLAGS_REMOVE_lockdep.o = -pg | 18 | CFLAGS_REMOVE_lockdep.o = -pg |
| 19 | CFLAGS_REMOVE_lockdep_proc.o = -pg | 19 | CFLAGS_REMOVE_lockdep_proc.o = -pg |
| @@ -88,7 +88,7 @@ obj-$(CONFIG_MARKERS) += marker.o | |||
| 88 | obj-$(CONFIG_TRACEPOINTS) += tracepoint.o | 88 | obj-$(CONFIG_TRACEPOINTS) += tracepoint.o |
| 89 | obj-$(CONFIG_LATENCYTOP) += latencytop.o | 89 | obj-$(CONFIG_LATENCYTOP) += latencytop.o |
| 90 | obj-$(CONFIG_HAVE_GENERIC_DMA_COHERENT) += dma-coherent.o | 90 | obj-$(CONFIG_HAVE_GENERIC_DMA_COHERENT) += dma-coherent.o |
| 91 | obj-$(CONFIG_FTRACE) += trace/ | 91 | obj-$(CONFIG_FUNCTION_TRACER) += trace/ |
| 92 | obj-$(CONFIG_TRACING) += trace/ | 92 | obj-$(CONFIG_TRACING) += trace/ |
| 93 | obj-$(CONFIG_SMP) += sched_cpupri.o | 93 | obj-$(CONFIG_SMP) += sched_cpupri.o |
| 94 | 94 | ||
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index fac014a81b24..4d161c70ba55 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
| @@ -220,7 +220,7 @@ void unregister_handler_proc(unsigned int irq, struct irqaction *action) | |||
| 220 | } | 220 | } |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | void register_default_affinity_proc(void) | 223 | static void register_default_affinity_proc(void) |
| 224 | { | 224 | { |
| 225 | #ifdef CONFIG_SMP | 225 | #ifdef CONFIG_SMP |
| 226 | proc_create("irq/default_smp_affinity", 0600, NULL, | 226 | proc_create("irq/default_smp_affinity", 0600, NULL, |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index dbda475b13bd..06e157119d2b 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -2169,12 +2169,11 @@ void early_boot_irqs_on(void) | |||
| 2169 | /* | 2169 | /* |
| 2170 | * Hardirqs will be enabled: | 2170 | * Hardirqs will be enabled: |
| 2171 | */ | 2171 | */ |
| 2172 | void trace_hardirqs_on_caller(unsigned long a0) | 2172 | void trace_hardirqs_on_caller(unsigned long ip) |
| 2173 | { | 2173 | { |
| 2174 | struct task_struct *curr = current; | 2174 | struct task_struct *curr = current; |
| 2175 | unsigned long ip; | ||
| 2176 | 2175 | ||
| 2177 | time_hardirqs_on(CALLER_ADDR0, a0); | 2176 | time_hardirqs_on(CALLER_ADDR0, ip); |
| 2178 | 2177 | ||
| 2179 | if (unlikely(!debug_locks || current->lockdep_recursion)) | 2178 | if (unlikely(!debug_locks || current->lockdep_recursion)) |
| 2180 | return; | 2179 | return; |
| @@ -2188,7 +2187,6 @@ void trace_hardirqs_on_caller(unsigned long a0) | |||
| 2188 | } | 2187 | } |
| 2189 | /* we'll do an OFF -> ON transition: */ | 2188 | /* we'll do an OFF -> ON transition: */ |
| 2190 | curr->hardirqs_enabled = 1; | 2189 | curr->hardirqs_enabled = 1; |
| 2191 | ip = (unsigned long) __builtin_return_address(0); | ||
| 2192 | 2190 | ||
| 2193 | if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) | 2191 | if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) |
| 2194 | return; | 2192 | return; |
| @@ -2224,11 +2222,11 @@ EXPORT_SYMBOL(trace_hardirqs_on); | |||
| 2224 | /* | 2222 | /* |
| 2225 | * Hardirqs were disabled: | 2223 | * Hardirqs were disabled: |
| 2226 | */ | 2224 | */ |
| 2227 | void trace_hardirqs_off_caller(unsigned long a0) | 2225 | void trace_hardirqs_off_caller(unsigned long ip) |
| 2228 | { | 2226 | { |
| 2229 | struct task_struct *curr = current; | 2227 | struct task_struct *curr = current; |
| 2230 | 2228 | ||
| 2231 | time_hardirqs_off(CALLER_ADDR0, a0); | 2229 | time_hardirqs_off(CALLER_ADDR0, ip); |
| 2232 | 2230 | ||
| 2233 | if (unlikely(!debug_locks || current->lockdep_recursion)) | 2231 | if (unlikely(!debug_locks || current->lockdep_recursion)) |
| 2234 | return; | 2232 | return; |
| @@ -2241,7 +2239,7 @@ void trace_hardirqs_off_caller(unsigned long a0) | |||
| 2241 | * We have done an ON -> OFF transition: | 2239 | * We have done an ON -> OFF transition: |
| 2242 | */ | 2240 | */ |
| 2243 | curr->hardirqs_enabled = 0; | 2241 | curr->hardirqs_enabled = 0; |
| 2244 | curr->hardirq_disable_ip = _RET_IP_; | 2242 | curr->hardirq_disable_ip = ip; |
| 2245 | curr->hardirq_disable_event = ++curr->irq_events; | 2243 | curr->hardirq_disable_event = ++curr->irq_events; |
| 2246 | debug_atomic_inc(&hardirqs_off_events); | 2244 | debug_atomic_inc(&hardirqs_off_events); |
| 2247 | } else | 2245 | } else |
| @@ -3417,9 +3415,10 @@ retry: | |||
| 3417 | } | 3415 | } |
| 3418 | printk(" ignoring it.\n"); | 3416 | printk(" ignoring it.\n"); |
| 3419 | unlock = 0; | 3417 | unlock = 0; |
| 3418 | } else { | ||
| 3419 | if (count != 10) | ||
| 3420 | printk(KERN_CONT " locked it.\n"); | ||
| 3420 | } | 3421 | } |
| 3421 | if (count != 10) | ||
| 3422 | printk(" locked it.\n"); | ||
| 3423 | 3422 | ||
| 3424 | do_each_thread(g, p) { | 3423 | do_each_thread(g, p) { |
| 3425 | /* | 3424 | /* |
diff --git a/kernel/printk.c b/kernel/printk.c index 6341af77eb65..f492f1583d77 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -233,45 +233,6 @@ static inline void boot_delay_msec(void) | |||
| 233 | #endif | 233 | #endif |
| 234 | 234 | ||
| 235 | /* | 235 | /* |
| 236 | * Return the number of unread characters in the log buffer. | ||
| 237 | */ | ||
| 238 | static int log_buf_get_len(void) | ||
| 239 | { | ||
| 240 | return logged_chars; | ||
| 241 | } | ||
| 242 | |||
| 243 | /* | ||
| 244 | * Copy a range of characters from the log buffer. | ||
| 245 | */ | ||
| 246 | int log_buf_copy(char *dest, int idx, int len) | ||
| 247 | { | ||
| 248 | int ret, max; | ||
| 249 | bool took_lock = false; | ||
| 250 | |||
| 251 | if (!oops_in_progress) { | ||
| 252 | spin_lock_irq(&logbuf_lock); | ||
| 253 | took_lock = true; | ||
| 254 | } | ||
| 255 | |||
| 256 | max = log_buf_get_len(); | ||
| 257 | if (idx < 0 || idx >= max) { | ||
| 258 | ret = -1; | ||
| 259 | } else { | ||
| 260 | if (len > max) | ||
| 261 | len = max; | ||
| 262 | ret = len; | ||
| 263 | idx += (log_end - max); | ||
| 264 | while (len-- > 0) | ||
| 265 | dest[len] = LOG_BUF(idx + len); | ||
| 266 | } | ||
| 267 | |||
| 268 | if (took_lock) | ||
| 269 | spin_unlock_irq(&logbuf_lock); | ||
| 270 | |||
| 271 | return ret; | ||
| 272 | } | ||
| 273 | |||
| 274 | /* | ||
| 275 | * Commands to do_syslog: | 236 | * Commands to do_syslog: |
| 276 | * | 237 | * |
| 277 | * 0 -- Close the log. Currently a NOP. | 238 | * 0 -- Close the log. Currently a NOP. |
diff --git a/kernel/resource.c b/kernel/resource.c index 4089d12af6e0..7fec0e427234 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
| @@ -571,7 +571,7 @@ static void __init __reserve_region_with_split(struct resource *root, | |||
| 571 | 571 | ||
| 572 | } | 572 | } |
| 573 | 573 | ||
| 574 | void reserve_region_with_split(struct resource *root, | 574 | void __init reserve_region_with_split(struct resource *root, |
| 575 | resource_size_t start, resource_size_t end, | 575 | resource_size_t start, resource_size_t end, |
| 576 | const char *name) | 576 | const char *name) |
| 577 | { | 577 | { |
diff --git a/kernel/sched.c b/kernel/sched.c index 6625c3c4b10d..e8819bc6f462 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -386,7 +386,6 @@ struct cfs_rq { | |||
| 386 | 386 | ||
| 387 | u64 exec_clock; | 387 | u64 exec_clock; |
| 388 | u64 min_vruntime; | 388 | u64 min_vruntime; |
| 389 | u64 pair_start; | ||
| 390 | 389 | ||
| 391 | struct rb_root tasks_timeline; | 390 | struct rb_root tasks_timeline; |
| 392 | struct rb_node *rb_leftmost; | 391 | struct rb_node *rb_leftmost; |
| @@ -3344,7 +3343,7 @@ small_imbalance: | |||
| 3344 | } else | 3343 | } else |
| 3345 | this_load_per_task = cpu_avg_load_per_task(this_cpu); | 3344 | this_load_per_task = cpu_avg_load_per_task(this_cpu); |
| 3346 | 3345 | ||
| 3347 | if (max_load - this_load + 2*busiest_load_per_task >= | 3346 | if (max_load - this_load + busiest_load_per_task >= |
| 3348 | busiest_load_per_task * imbn) { | 3347 | busiest_load_per_task * imbn) { |
| 3349 | *imbalance = busiest_load_per_task; | 3348 | *imbalance = busiest_load_per_task; |
| 3350 | return busiest; | 3349 | return busiest; |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 9573c33688b8..ce514afd78ff 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -143,6 +143,49 @@ static inline struct sched_entity *parent_entity(struct sched_entity *se) | |||
| 143 | return se->parent; | 143 | return se->parent; |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | /* return depth at which a sched entity is present in the hierarchy */ | ||
| 147 | static inline int depth_se(struct sched_entity *se) | ||
| 148 | { | ||
| 149 | int depth = 0; | ||
| 150 | |||
| 151 | for_each_sched_entity(se) | ||
| 152 | depth++; | ||
| 153 | |||
| 154 | return depth; | ||
| 155 | } | ||
| 156 | |||
| 157 | static void | ||
| 158 | find_matching_se(struct sched_entity **se, struct sched_entity **pse) | ||
| 159 | { | ||
| 160 | int se_depth, pse_depth; | ||
| 161 | |||
| 162 | /* | ||
| 163 | * preemption test can be made between sibling entities who are in the | ||
| 164 | * same cfs_rq i.e who have a common parent. Walk up the hierarchy of | ||
| 165 | * both tasks until we find their ancestors who are siblings of common | ||
| 166 | * parent. | ||
| 167 | */ | ||
| 168 | |||
| 169 | /* First walk up until both entities are at same depth */ | ||
| 170 | se_depth = depth_se(*se); | ||
| 171 | pse_depth = depth_se(*pse); | ||
| 172 | |||
| 173 | while (se_depth > pse_depth) { | ||
| 174 | se_depth--; | ||
| 175 | *se = parent_entity(*se); | ||
| 176 | } | ||
| 177 | |||
| 178 | while (pse_depth > se_depth) { | ||
| 179 | pse_depth--; | ||
| 180 | *pse = parent_entity(*pse); | ||
| 181 | } | ||
| 182 | |||
| 183 | while (!is_same_group(*se, *pse)) { | ||
| 184 | *se = parent_entity(*se); | ||
| 185 | *pse = parent_entity(*pse); | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 146 | #else /* CONFIG_FAIR_GROUP_SCHED */ | 189 | #else /* CONFIG_FAIR_GROUP_SCHED */ |
| 147 | 190 | ||
| 148 | static inline struct rq *rq_of(struct cfs_rq *cfs_rq) | 191 | static inline struct rq *rq_of(struct cfs_rq *cfs_rq) |
| @@ -193,6 +236,11 @@ static inline struct sched_entity *parent_entity(struct sched_entity *se) | |||
| 193 | return NULL; | 236 | return NULL; |
| 194 | } | 237 | } |
| 195 | 238 | ||
| 239 | static inline void | ||
| 240 | find_matching_se(struct sched_entity **se, struct sched_entity **pse) | ||
| 241 | { | ||
| 242 | } | ||
| 243 | |||
| 196 | #endif /* CONFIG_FAIR_GROUP_SCHED */ | 244 | #endif /* CONFIG_FAIR_GROUP_SCHED */ |
| 197 | 245 | ||
| 198 | 246 | ||
| @@ -223,6 +271,27 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 223 | return se->vruntime - cfs_rq->min_vruntime; | 271 | return se->vruntime - cfs_rq->min_vruntime; |
| 224 | } | 272 | } |
| 225 | 273 | ||
| 274 | static void update_min_vruntime(struct cfs_rq *cfs_rq) | ||
| 275 | { | ||
| 276 | u64 vruntime = cfs_rq->min_vruntime; | ||
| 277 | |||
| 278 | if (cfs_rq->curr) | ||
| 279 | vruntime = cfs_rq->curr->vruntime; | ||
| 280 | |||
| 281 | if (cfs_rq->rb_leftmost) { | ||
| 282 | struct sched_entity *se = rb_entry(cfs_rq->rb_leftmost, | ||
| 283 | struct sched_entity, | ||
| 284 | run_node); | ||
| 285 | |||
| 286 | if (vruntime == cfs_rq->min_vruntime) | ||
| 287 | vruntime = se->vruntime; | ||
| 288 | else | ||
| 289 | vruntime = min_vruntime(vruntime, se->vruntime); | ||
| 290 | } | ||
| 291 | |||
| 292 | cfs_rq->min_vruntime = max_vruntime(cfs_rq->min_vruntime, vruntime); | ||
| 293 | } | ||
| 294 | |||
| 226 | /* | 295 | /* |
| 227 | * Enqueue an entity into the rb-tree: | 296 | * Enqueue an entity into the rb-tree: |
| 228 | */ | 297 | */ |
| @@ -256,15 +325,8 @@ static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 256 | * Maintain a cache of leftmost tree entries (it is frequently | 325 | * Maintain a cache of leftmost tree entries (it is frequently |
| 257 | * used): | 326 | * used): |
| 258 | */ | 327 | */ |
| 259 | if (leftmost) { | 328 | if (leftmost) |
| 260 | cfs_rq->rb_leftmost = &se->run_node; | 329 | cfs_rq->rb_leftmost = &se->run_node; |
| 261 | /* | ||
| 262 | * maintain cfs_rq->min_vruntime to be a monotonic increasing | ||
| 263 | * value tracking the leftmost vruntime in the tree. | ||
| 264 | */ | ||
| 265 | cfs_rq->min_vruntime = | ||
| 266 | max_vruntime(cfs_rq->min_vruntime, se->vruntime); | ||
| 267 | } | ||
| 268 | 330 | ||
| 269 | rb_link_node(&se->run_node, parent, link); | 331 | rb_link_node(&se->run_node, parent, link); |
| 270 | rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline); | 332 | rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline); |
| @@ -274,18 +336,9 @@ static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 274 | { | 336 | { |
| 275 | if (cfs_rq->rb_leftmost == &se->run_node) { | 337 | if (cfs_rq->rb_leftmost == &se->run_node) { |
| 276 | struct rb_node *next_node; | 338 | struct rb_node *next_node; |
| 277 | struct sched_entity *next; | ||
| 278 | 339 | ||
| 279 | next_node = rb_next(&se->run_node); | 340 | next_node = rb_next(&se->run_node); |
| 280 | cfs_rq->rb_leftmost = next_node; | 341 | cfs_rq->rb_leftmost = next_node; |
| 281 | |||
| 282 | if (next_node) { | ||
| 283 | next = rb_entry(next_node, | ||
| 284 | struct sched_entity, run_node); | ||
| 285 | cfs_rq->min_vruntime = | ||
| 286 | max_vruntime(cfs_rq->min_vruntime, | ||
| 287 | next->vruntime); | ||
| 288 | } | ||
| 289 | } | 342 | } |
| 290 | 343 | ||
| 291 | if (cfs_rq->next == se) | 344 | if (cfs_rq->next == se) |
| @@ -424,6 +477,7 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr, | |||
| 424 | schedstat_add(cfs_rq, exec_clock, delta_exec); | 477 | schedstat_add(cfs_rq, exec_clock, delta_exec); |
| 425 | delta_exec_weighted = calc_delta_fair(delta_exec, curr); | 478 | delta_exec_weighted = calc_delta_fair(delta_exec, curr); |
| 426 | curr->vruntime += delta_exec_weighted; | 479 | curr->vruntime += delta_exec_weighted; |
| 480 | update_min_vruntime(cfs_rq); | ||
| 427 | } | 481 | } |
| 428 | 482 | ||
| 429 | static void update_curr(struct cfs_rq *cfs_rq) | 483 | static void update_curr(struct cfs_rq *cfs_rq) |
| @@ -613,13 +667,7 @@ static void check_spread(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 613 | static void | 667 | static void |
| 614 | place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) | 668 | place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) |
| 615 | { | 669 | { |
| 616 | u64 vruntime; | 670 | u64 vruntime = cfs_rq->min_vruntime; |
| 617 | |||
| 618 | if (first_fair(cfs_rq)) { | ||
| 619 | vruntime = min_vruntime(cfs_rq->min_vruntime, | ||
| 620 | __pick_next_entity(cfs_rq)->vruntime); | ||
| 621 | } else | ||
| 622 | vruntime = cfs_rq->min_vruntime; | ||
| 623 | 671 | ||
| 624 | /* | 672 | /* |
| 625 | * The 'current' period is already promised to the current tasks, | 673 | * The 'current' period is already promised to the current tasks, |
| @@ -696,6 +744,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep) | |||
| 696 | if (se != cfs_rq->curr) | 744 | if (se != cfs_rq->curr) |
| 697 | __dequeue_entity(cfs_rq, se); | 745 | __dequeue_entity(cfs_rq, se); |
| 698 | account_entity_dequeue(cfs_rq, se); | 746 | account_entity_dequeue(cfs_rq, se); |
| 747 | update_min_vruntime(cfs_rq); | ||
| 699 | } | 748 | } |
| 700 | 749 | ||
| 701 | /* | 750 | /* |
| @@ -742,16 +791,14 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
| 742 | se->prev_sum_exec_runtime = se->sum_exec_runtime; | 791 | se->prev_sum_exec_runtime = se->sum_exec_runtime; |
| 743 | } | 792 | } |
| 744 | 793 | ||
| 794 | static int | ||
| 795 | wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se); | ||
| 796 | |||
| 745 | static struct sched_entity * | 797 | static struct sched_entity * |
| 746 | pick_next(struct cfs_rq *cfs_rq, struct sched_entity *se) | 798 | pick_next(struct cfs_rq *cfs_rq, struct sched_entity *se) |
| 747 | { | 799 | { |
| 748 | struct rq *rq = rq_of(cfs_rq); | 800 | if (!cfs_rq->next || wakeup_preempt_entity(cfs_rq->next, se) == 1) |
| 749 | u64 pair_slice = rq->clock - cfs_rq->pair_start; | ||
| 750 | |||
| 751 | if (!cfs_rq->next || pair_slice > sysctl_sched_min_granularity) { | ||
| 752 | cfs_rq->pair_start = rq->clock; | ||
| 753 | return se; | 801 | return se; |
| 754 | } | ||
| 755 | 802 | ||
| 756 | return cfs_rq->next; | 803 | return cfs_rq->next; |
| 757 | } | 804 | } |
| @@ -1122,10 +1169,9 @@ wake_affine(struct sched_domain *this_sd, struct rq *this_rq, | |||
| 1122 | if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS)) | 1169 | if (!(this_sd->flags & SD_WAKE_AFFINE) || !sched_feat(AFFINE_WAKEUPS)) |
| 1123 | return 0; | 1170 | return 0; |
| 1124 | 1171 | ||
| 1125 | if (!sync && sched_feat(SYNC_WAKEUPS) && | 1172 | if (sync && (curr->se.avg_overlap > sysctl_sched_migration_cost || |
| 1126 | curr->se.avg_overlap < sysctl_sched_migration_cost && | 1173 | p->se.avg_overlap > sysctl_sched_migration_cost)) |
| 1127 | p->se.avg_overlap < sysctl_sched_migration_cost) | 1174 | sync = 0; |
| 1128 | sync = 1; | ||
| 1129 | 1175 | ||
| 1130 | /* | 1176 | /* |
| 1131 | * If sync wakeup then subtract the (maximum possible) | 1177 | * If sync wakeup then subtract the (maximum possible) |
| @@ -1244,13 +1290,42 @@ static unsigned long wakeup_gran(struct sched_entity *se) | |||
| 1244 | * More easily preempt - nice tasks, while not making it harder for | 1290 | * More easily preempt - nice tasks, while not making it harder for |
| 1245 | * + nice tasks. | 1291 | * + nice tasks. |
| 1246 | */ | 1292 | */ |
| 1247 | if (sched_feat(ASYM_GRAN)) | 1293 | if (!sched_feat(ASYM_GRAN) || se->load.weight > NICE_0_LOAD) |
| 1248 | gran = calc_delta_mine(gran, NICE_0_LOAD, &se->load); | 1294 | gran = calc_delta_fair(sysctl_sched_wakeup_granularity, se); |
| 1249 | 1295 | ||
| 1250 | return gran; | 1296 | return gran; |
| 1251 | } | 1297 | } |
| 1252 | 1298 | ||
| 1253 | /* | 1299 | /* |
| 1300 | * Should 'se' preempt 'curr'. | ||
| 1301 | * | ||
| 1302 | * |s1 | ||
| 1303 | * |s2 | ||
| 1304 | * |s3 | ||
| 1305 | * g | ||
| 1306 | * |<--->|c | ||
| 1307 | * | ||
| 1308 | * w(c, s1) = -1 | ||
| 1309 | * w(c, s2) = 0 | ||
| 1310 | * w(c, s3) = 1 | ||
| 1311 | * | ||
| 1312 | */ | ||
| 1313 | static int | ||
| 1314 | wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se) | ||
| 1315 | { | ||
| 1316 | s64 gran, vdiff = curr->vruntime - se->vruntime; | ||
| 1317 | |||
| 1318 | if (vdiff <= 0) | ||
| 1319 | return -1; | ||
| 1320 | |||
| 1321 | gran = wakeup_gran(curr); | ||
| 1322 | if (vdiff > gran) | ||
| 1323 | return 1; | ||
| 1324 | |||
| 1325 | return 0; | ||
| 1326 | } | ||
| 1327 | |||
| 1328 | /* | ||
| 1254 | * Preempt the current task with a newly woken task if needed: | 1329 | * Preempt the current task with a newly woken task if needed: |
| 1255 | */ | 1330 | */ |
| 1256 | static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync) | 1331 | static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync) |
| @@ -1258,7 +1333,6 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync) | |||
| 1258 | struct task_struct *curr = rq->curr; | 1333 | struct task_struct *curr = rq->curr; |
| 1259 | struct cfs_rq *cfs_rq = task_cfs_rq(curr); | 1334 | struct cfs_rq *cfs_rq = task_cfs_rq(curr); |
| 1260 | struct sched_entity *se = &curr->se, *pse = &p->se; | 1335 | struct sched_entity *se = &curr->se, *pse = &p->se; |
| 1261 | s64 delta_exec; | ||
| 1262 | 1336 | ||
| 1263 | if (unlikely(rt_prio(p->prio))) { | 1337 | if (unlikely(rt_prio(p->prio))) { |
| 1264 | update_rq_clock(rq); | 1338 | update_rq_clock(rq); |
| @@ -1296,9 +1370,19 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int sync) | |||
| 1296 | return; | 1370 | return; |
| 1297 | } | 1371 | } |
| 1298 | 1372 | ||
| 1299 | delta_exec = se->sum_exec_runtime - se->prev_sum_exec_runtime; | 1373 | find_matching_se(&se, &pse); |
| 1300 | if (delta_exec > wakeup_gran(pse)) | 1374 | |
| 1301 | resched_task(curr); | 1375 | while (se) { |
| 1376 | BUG_ON(!pse); | ||
| 1377 | |||
| 1378 | if (wakeup_preempt_entity(se, pse) == 1) { | ||
| 1379 | resched_task(curr); | ||
| 1380 | break; | ||
| 1381 | } | ||
| 1382 | |||
| 1383 | se = parent_entity(se); | ||
| 1384 | pse = parent_entity(pse); | ||
| 1385 | } | ||
| 1302 | } | 1386 | } |
| 1303 | 1387 | ||
| 1304 | static struct task_struct *pick_next_task_fair(struct rq *rq) | 1388 | static struct task_struct *pick_next_task_fair(struct rq *rq) |
| @@ -1594,9 +1678,6 @@ static const struct sched_class fair_sched_class = { | |||
| 1594 | .enqueue_task = enqueue_task_fair, | 1678 | .enqueue_task = enqueue_task_fair, |
| 1595 | .dequeue_task = dequeue_task_fair, | 1679 | .dequeue_task = dequeue_task_fair, |
| 1596 | .yield_task = yield_task_fair, | 1680 | .yield_task = yield_task_fair, |
| 1597 | #ifdef CONFIG_SMP | ||
| 1598 | .select_task_rq = select_task_rq_fair, | ||
| 1599 | #endif /* CONFIG_SMP */ | ||
| 1600 | 1681 | ||
| 1601 | .check_preempt_curr = check_preempt_wakeup, | 1682 | .check_preempt_curr = check_preempt_wakeup, |
| 1602 | 1683 | ||
| @@ -1604,6 +1685,8 @@ static const struct sched_class fair_sched_class = { | |||
| 1604 | .put_prev_task = put_prev_task_fair, | 1685 | .put_prev_task = put_prev_task_fair, |
| 1605 | 1686 | ||
| 1606 | #ifdef CONFIG_SMP | 1687 | #ifdef CONFIG_SMP |
| 1688 | .select_task_rq = select_task_rq_fair, | ||
| 1689 | |||
| 1607 | .load_balance = load_balance_fair, | 1690 | .load_balance = load_balance_fair, |
| 1608 | .move_one_task = move_one_task_fair, | 1691 | .move_one_task = move_one_task_fair, |
| 1609 | #endif | 1692 | #endif |
diff --git a/kernel/sched_idletask.c b/kernel/sched_idletask.c index dec4ccabe2f5..8a21a2e28c13 100644 --- a/kernel/sched_idletask.c +++ b/kernel/sched_idletask.c | |||
| @@ -105,9 +105,6 @@ static const struct sched_class idle_sched_class = { | |||
| 105 | 105 | ||
| 106 | /* dequeue is not valid, we print a debug message there: */ | 106 | /* dequeue is not valid, we print a debug message there: */ |
| 107 | .dequeue_task = dequeue_task_idle, | 107 | .dequeue_task = dequeue_task_idle, |
| 108 | #ifdef CONFIG_SMP | ||
| 109 | .select_task_rq = select_task_rq_idle, | ||
| 110 | #endif /* CONFIG_SMP */ | ||
| 111 | 108 | ||
| 112 | .check_preempt_curr = check_preempt_curr_idle, | 109 | .check_preempt_curr = check_preempt_curr_idle, |
| 113 | 110 | ||
| @@ -115,6 +112,8 @@ static const struct sched_class idle_sched_class = { | |||
| 115 | .put_prev_task = put_prev_task_idle, | 112 | .put_prev_task = put_prev_task_idle, |
| 116 | 113 | ||
| 117 | #ifdef CONFIG_SMP | 114 | #ifdef CONFIG_SMP |
| 115 | .select_task_rq = select_task_rq_idle, | ||
| 116 | |||
| 118 | .load_balance = load_balance_idle, | 117 | .load_balance = load_balance_idle, |
| 119 | .move_one_task = move_one_task_idle, | 118 | .move_one_task = move_one_task_idle, |
| 120 | #endif | 119 | #endif |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index b446dc87494f..d9ba9d5f99d6 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -1504,9 +1504,6 @@ static const struct sched_class rt_sched_class = { | |||
| 1504 | .enqueue_task = enqueue_task_rt, | 1504 | .enqueue_task = enqueue_task_rt, |
| 1505 | .dequeue_task = dequeue_task_rt, | 1505 | .dequeue_task = dequeue_task_rt, |
| 1506 | .yield_task = yield_task_rt, | 1506 | .yield_task = yield_task_rt, |
| 1507 | #ifdef CONFIG_SMP | ||
| 1508 | .select_task_rq = select_task_rq_rt, | ||
| 1509 | #endif /* CONFIG_SMP */ | ||
| 1510 | 1507 | ||
| 1511 | .check_preempt_curr = check_preempt_curr_rt, | 1508 | .check_preempt_curr = check_preempt_curr_rt, |
| 1512 | 1509 | ||
| @@ -1514,6 +1511,8 @@ static const struct sched_class rt_sched_class = { | |||
| 1514 | .put_prev_task = put_prev_task_rt, | 1511 | .put_prev_task = put_prev_task_rt, |
| 1515 | 1512 | ||
| 1516 | #ifdef CONFIG_SMP | 1513 | #ifdef CONFIG_SMP |
| 1514 | .select_task_rq = select_task_rq_rt, | ||
| 1515 | |||
| 1517 | .load_balance = load_balance_rt, | 1516 | .load_balance = load_balance_rt, |
| 1518 | .move_one_task = move_one_task_rt, | 1517 | .move_one_task = move_one_task_rt, |
| 1519 | .set_cpus_allowed = set_cpus_allowed_rt, | 1518 | .set_cpus_allowed = set_cpus_allowed_rt, |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index a13bd4dfaeb1..9d048fa2d902 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -474,7 +474,7 @@ static struct ctl_table kern_table[] = { | |||
| 474 | .mode = 0644, | 474 | .mode = 0644, |
| 475 | .proc_handler = &proc_dointvec, | 475 | .proc_handler = &proc_dointvec, |
| 476 | }, | 476 | }, |
| 477 | #ifdef CONFIG_FTRACE | 477 | #ifdef CONFIG_FUNCTION_TRACER |
| 478 | { | 478 | { |
| 479 | .ctl_name = CTL_UNNUMBERED, | 479 | .ctl_name = CTL_UNNUMBERED, |
| 480 | .procname = "ftrace_enabled", | 480 | .procname = "ftrace_enabled", |
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index 1cb3e1f616af..e0cea282e0c5 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig | |||
| @@ -1,11 +1,12 @@ | |||
| 1 | # | 1 | # |
| 2 | # Architectures that offer an FTRACE implementation should select HAVE_FTRACE: | 2 | # Architectures that offer an FUNCTION_TRACER implementation should |
| 3 | # select HAVE_FUNCTION_TRACER: | ||
| 3 | # | 4 | # |
| 4 | 5 | ||
| 5 | config NOP_TRACER | 6 | config NOP_TRACER |
| 6 | bool | 7 | bool |
| 7 | 8 | ||
| 8 | config HAVE_FTRACE | 9 | config HAVE_FUNCTION_TRACER |
| 9 | bool | 10 | bool |
| 10 | select NOP_TRACER | 11 | select NOP_TRACER |
| 11 | 12 | ||
| @@ -28,9 +29,11 @@ config TRACING | |||
| 28 | select STACKTRACE | 29 | select STACKTRACE |
| 29 | select TRACEPOINTS | 30 | select TRACEPOINTS |
| 30 | 31 | ||
| 31 | config FTRACE | 32 | menu "Tracers" |
| 33 | |||
| 34 | config FUNCTION_TRACER | ||
| 32 | bool "Kernel Function Tracer" | 35 | bool "Kernel Function Tracer" |
| 33 | depends on HAVE_FTRACE | 36 | depends on HAVE_FUNCTION_TRACER |
| 34 | depends on DEBUG_KERNEL | 37 | depends on DEBUG_KERNEL |
| 35 | select FRAME_POINTER | 38 | select FRAME_POINTER |
| 36 | select TRACING | 39 | select TRACING |
| @@ -49,7 +52,6 @@ config IRQSOFF_TRACER | |||
| 49 | default n | 52 | default n |
| 50 | depends on TRACE_IRQFLAGS_SUPPORT | 53 | depends on TRACE_IRQFLAGS_SUPPORT |
| 51 | depends on GENERIC_TIME | 54 | depends on GENERIC_TIME |
| 52 | depends on HAVE_FTRACE | ||
| 53 | depends on DEBUG_KERNEL | 55 | depends on DEBUG_KERNEL |
| 54 | select TRACE_IRQFLAGS | 56 | select TRACE_IRQFLAGS |
| 55 | select TRACING | 57 | select TRACING |
| @@ -73,7 +75,6 @@ config PREEMPT_TRACER | |||
| 73 | default n | 75 | default n |
| 74 | depends on GENERIC_TIME | 76 | depends on GENERIC_TIME |
| 75 | depends on PREEMPT | 77 | depends on PREEMPT |
| 76 | depends on HAVE_FTRACE | ||
| 77 | depends on DEBUG_KERNEL | 78 | depends on DEBUG_KERNEL |
| 78 | select TRACING | 79 | select TRACING |
| 79 | select TRACER_MAX_TRACE | 80 | select TRACER_MAX_TRACE |
| @@ -101,7 +102,6 @@ config SYSPROF_TRACER | |||
| 101 | 102 | ||
| 102 | config SCHED_TRACER | 103 | config SCHED_TRACER |
| 103 | bool "Scheduling Latency Tracer" | 104 | bool "Scheduling Latency Tracer" |
| 104 | depends on HAVE_FTRACE | ||
| 105 | depends on DEBUG_KERNEL | 105 | depends on DEBUG_KERNEL |
| 106 | select TRACING | 106 | select TRACING |
| 107 | select CONTEXT_SWITCH_TRACER | 107 | select CONTEXT_SWITCH_TRACER |
| @@ -112,7 +112,6 @@ config SCHED_TRACER | |||
| 112 | 112 | ||
| 113 | config CONTEXT_SWITCH_TRACER | 113 | config CONTEXT_SWITCH_TRACER |
| 114 | bool "Trace process context switches" | 114 | bool "Trace process context switches" |
| 115 | depends on HAVE_FTRACE | ||
| 116 | depends on DEBUG_KERNEL | 115 | depends on DEBUG_KERNEL |
| 117 | select TRACING | 116 | select TRACING |
| 118 | select MARKERS | 117 | select MARKERS |
| @@ -122,9 +121,9 @@ config CONTEXT_SWITCH_TRACER | |||
| 122 | 121 | ||
| 123 | config BOOT_TRACER | 122 | config BOOT_TRACER |
| 124 | bool "Trace boot initcalls" | 123 | bool "Trace boot initcalls" |
| 125 | depends on HAVE_FTRACE | ||
| 126 | depends on DEBUG_KERNEL | 124 | depends on DEBUG_KERNEL |
| 127 | select TRACING | 125 | select TRACING |
| 126 | select CONTEXT_SWITCH_TRACER | ||
| 128 | help | 127 | help |
| 129 | This tracer helps developers to optimize boot times: it records | 128 | This tracer helps developers to optimize boot times: it records |
| 130 | the timings of the initcalls and traces key events and the identity | 129 | the timings of the initcalls and traces key events and the identity |
| @@ -141,9 +140,9 @@ config BOOT_TRACER | |||
| 141 | 140 | ||
| 142 | config STACK_TRACER | 141 | config STACK_TRACER |
| 143 | bool "Trace max stack" | 142 | bool "Trace max stack" |
| 144 | depends on HAVE_FTRACE | 143 | depends on HAVE_FUNCTION_TRACER |
| 145 | depends on DEBUG_KERNEL | 144 | depends on DEBUG_KERNEL |
| 146 | select FTRACE | 145 | select FUNCTION_TRACER |
| 147 | select STACKTRACE | 146 | select STACKTRACE |
| 148 | help | 147 | help |
| 149 | This special tracer records the maximum stack footprint of the | 148 | This special tracer records the maximum stack footprint of the |
| @@ -160,7 +159,7 @@ config STACK_TRACER | |||
| 160 | 159 | ||
| 161 | config DYNAMIC_FTRACE | 160 | config DYNAMIC_FTRACE |
| 162 | bool "enable/disable ftrace tracepoints dynamically" | 161 | bool "enable/disable ftrace tracepoints dynamically" |
| 163 | depends on FTRACE | 162 | depends on FUNCTION_TRACER |
| 164 | depends on HAVE_DYNAMIC_FTRACE | 163 | depends on HAVE_DYNAMIC_FTRACE |
| 165 | depends on DEBUG_KERNEL | 164 | depends on DEBUG_KERNEL |
| 166 | default y | 165 | default y |
| @@ -170,7 +169,7 @@ config DYNAMIC_FTRACE | |||
| 170 | with a No-Op instruction) as they are called. A table is | 169 | with a No-Op instruction) as they are called. A table is |
| 171 | created to dynamically enable them again. | 170 | created to dynamically enable them again. |
| 172 | 171 | ||
| 173 | This way a CONFIG_FTRACE kernel is slightly larger, but otherwise | 172 | This way a CONFIG_FUNCTION_TRACER kernel is slightly larger, but otherwise |
| 174 | has native performance as long as no tracing is active. | 173 | has native performance as long as no tracing is active. |
| 175 | 174 | ||
| 176 | The changes to the code are done by a kernel thread that | 175 | The changes to the code are done by a kernel thread that |
| @@ -195,3 +194,5 @@ config FTRACE_STARTUP_TEST | |||
| 195 | a series of tests are made to verify that the tracer is | 194 | a series of tests are made to verify that the tracer is |
| 196 | functioning properly. It will do tests on all the configured | 195 | functioning properly. It will do tests on all the configured |
| 197 | tracers of ftrace. | 196 | tracers of ftrace. |
| 197 | |||
| 198 | endmenu | ||
diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile index a85dfba88ba0..c8228b1a49e9 100644 --- a/kernel/trace/Makefile +++ b/kernel/trace/Makefile | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | # Do not instrument the tracer itself: | 2 | # Do not instrument the tracer itself: |
| 3 | 3 | ||
| 4 | ifdef CONFIG_FTRACE | 4 | ifdef CONFIG_FUNCTION_TRACER |
| 5 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 5 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| 6 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) | 6 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) |
| 7 | 7 | ||
| @@ -10,13 +10,13 @@ CFLAGS_trace_selftest_dynamic.o = -pg | |||
| 10 | obj-y += trace_selftest_dynamic.o | 10 | obj-y += trace_selftest_dynamic.o |
| 11 | endif | 11 | endif |
| 12 | 12 | ||
| 13 | obj-$(CONFIG_FTRACE) += libftrace.o | 13 | obj-$(CONFIG_FUNCTION_TRACER) += libftrace.o |
| 14 | obj-$(CONFIG_RING_BUFFER) += ring_buffer.o | 14 | obj-$(CONFIG_RING_BUFFER) += ring_buffer.o |
| 15 | 15 | ||
| 16 | obj-$(CONFIG_TRACING) += trace.o | 16 | obj-$(CONFIG_TRACING) += trace.o |
| 17 | obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o | 17 | obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o |
| 18 | obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o | 18 | obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o |
| 19 | obj-$(CONFIG_FTRACE) += trace_functions.o | 19 | obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o |
| 20 | obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o | 20 | obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o |
| 21 | obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o | 21 | obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o |
| 22 | obj-$(CONFIG_SCHED_TRACER) += trace_sched_wakeup.o | 22 | obj-$(CONFIG_SCHED_TRACER) += trace_sched_wakeup.o |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 4dda4f60a2a9..7618c528756b 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -25,13 +25,24 @@ | |||
| 25 | #include <linux/ftrace.h> | 25 | #include <linux/ftrace.h> |
| 26 | #include <linux/sysctl.h> | 26 | #include <linux/sysctl.h> |
| 27 | #include <linux/ctype.h> | 27 | #include <linux/ctype.h> |
| 28 | #include <linux/hash.h> | ||
| 29 | #include <linux/list.h> | 28 | #include <linux/list.h> |
| 30 | 29 | ||
| 31 | #include <asm/ftrace.h> | 30 | #include <asm/ftrace.h> |
| 32 | 31 | ||
| 33 | #include "trace.h" | 32 | #include "trace.h" |
| 34 | 33 | ||
| 34 | #define FTRACE_WARN_ON(cond) \ | ||
| 35 | do { \ | ||
| 36 | if (WARN_ON(cond)) \ | ||
| 37 | ftrace_kill(); \ | ||
| 38 | } while (0) | ||
| 39 | |||
| 40 | #define FTRACE_WARN_ON_ONCE(cond) \ | ||
| 41 | do { \ | ||
| 42 | if (WARN_ON_ONCE(cond)) \ | ||
| 43 | ftrace_kill(); \ | ||
| 44 | } while (0) | ||
| 45 | |||
| 35 | /* ftrace_enabled is a method to turn ftrace on or off */ | 46 | /* ftrace_enabled is a method to turn ftrace on or off */ |
| 36 | int ftrace_enabled __read_mostly; | 47 | int ftrace_enabled __read_mostly; |
| 37 | static int last_ftrace_enabled; | 48 | static int last_ftrace_enabled; |
| @@ -153,21 +164,8 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops) | |||
| 153 | } | 164 | } |
| 154 | 165 | ||
| 155 | #ifdef CONFIG_DYNAMIC_FTRACE | 166 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 156 | |||
| 157 | #ifndef CONFIG_FTRACE_MCOUNT_RECORD | 167 | #ifndef CONFIG_FTRACE_MCOUNT_RECORD |
| 158 | /* | 168 | # error Dynamic ftrace depends on MCOUNT_RECORD |
| 159 | * The hash lock is only needed when the recording of the mcount | ||
| 160 | * callers are dynamic. That is, by the caller themselves and | ||
| 161 | * not recorded via the compilation. | ||
| 162 | */ | ||
| 163 | static DEFINE_SPINLOCK(ftrace_hash_lock); | ||
| 164 | #define ftrace_hash_lock(flags) spin_lock_irqsave(&ftrace_hash_lock, flags) | ||
| 165 | #define ftrace_hash_unlock(flags) \ | ||
| 166 | spin_unlock_irqrestore(&ftrace_hash_lock, flags) | ||
| 167 | #else | ||
| 168 | /* This is protected via the ftrace_lock with MCOUNT_RECORD. */ | ||
| 169 | #define ftrace_hash_lock(flags) do { (void)(flags); } while (0) | ||
| 170 | #define ftrace_hash_unlock(flags) do { } while(0) | ||
| 171 | #endif | 169 | #endif |
| 172 | 170 | ||
| 173 | /* | 171 | /* |
| @@ -178,8 +176,6 @@ static DEFINE_SPINLOCK(ftrace_hash_lock); | |||
| 178 | */ | 176 | */ |
| 179 | static unsigned long mcount_addr = MCOUNT_ADDR; | 177 | static unsigned long mcount_addr = MCOUNT_ADDR; |
| 180 | 178 | ||
| 181 | static struct task_struct *ftraced_task; | ||
| 182 | |||
| 183 | enum { | 179 | enum { |
| 184 | FTRACE_ENABLE_CALLS = (1 << 0), | 180 | FTRACE_ENABLE_CALLS = (1 << 0), |
| 185 | FTRACE_DISABLE_CALLS = (1 << 1), | 181 | FTRACE_DISABLE_CALLS = (1 << 1), |
| @@ -190,13 +186,9 @@ enum { | |||
| 190 | 186 | ||
| 191 | static int ftrace_filtered; | 187 | static int ftrace_filtered; |
| 192 | static int tracing_on; | 188 | static int tracing_on; |
| 193 | static int frozen_record_count; | ||
| 194 | 189 | ||
| 195 | static struct hlist_head ftrace_hash[FTRACE_HASHSIZE]; | 190 | static LIST_HEAD(ftrace_new_addrs); |
| 196 | 191 | ||
| 197 | static DEFINE_PER_CPU(int, ftrace_shutdown_disable_cpu); | ||
| 198 | |||
| 199 | static DEFINE_MUTEX(ftraced_lock); | ||
| 200 | static DEFINE_MUTEX(ftrace_regex_lock); | 192 | static DEFINE_MUTEX(ftrace_regex_lock); |
| 201 | 193 | ||
| 202 | struct ftrace_page { | 194 | struct ftrace_page { |
| @@ -214,16 +206,13 @@ struct ftrace_page { | |||
| 214 | static struct ftrace_page *ftrace_pages_start; | 206 | static struct ftrace_page *ftrace_pages_start; |
| 215 | static struct ftrace_page *ftrace_pages; | 207 | static struct ftrace_page *ftrace_pages; |
| 216 | 208 | ||
| 217 | static int ftraced_trigger; | ||
| 218 | static int ftraced_suspend; | ||
| 219 | static int ftraced_stop; | ||
| 220 | |||
| 221 | static int ftrace_record_suspend; | ||
| 222 | |||
| 223 | static struct dyn_ftrace *ftrace_free_records; | 209 | static struct dyn_ftrace *ftrace_free_records; |
| 224 | 210 | ||
| 225 | 211 | ||
| 226 | #ifdef CONFIG_KPROBES | 212 | #ifdef CONFIG_KPROBES |
| 213 | |||
| 214 | static int frozen_record_count; | ||
| 215 | |||
| 227 | static inline void freeze_record(struct dyn_ftrace *rec) | 216 | static inline void freeze_record(struct dyn_ftrace *rec) |
| 228 | { | 217 | { |
| 229 | if (!(rec->flags & FTRACE_FL_FROZEN)) { | 218 | if (!(rec->flags & FTRACE_FL_FROZEN)) { |
| @@ -250,72 +239,6 @@ static inline int record_frozen(struct dyn_ftrace *rec) | |||
| 250 | # define record_frozen(rec) ({ 0; }) | 239 | # define record_frozen(rec) ({ 0; }) |
| 251 | #endif /* CONFIG_KPROBES */ | 240 | #endif /* CONFIG_KPROBES */ |
| 252 | 241 | ||
| 253 | int skip_trace(unsigned long ip) | ||
| 254 | { | ||
| 255 | unsigned long fl; | ||
| 256 | struct dyn_ftrace *rec; | ||
| 257 | struct hlist_node *t; | ||
| 258 | struct hlist_head *head; | ||
| 259 | |||
| 260 | if (frozen_record_count == 0) | ||
| 261 | return 0; | ||
| 262 | |||
| 263 | head = &ftrace_hash[hash_long(ip, FTRACE_HASHBITS)]; | ||
| 264 | hlist_for_each_entry_rcu(rec, t, head, node) { | ||
| 265 | if (rec->ip == ip) { | ||
| 266 | if (record_frozen(rec)) { | ||
| 267 | if (rec->flags & FTRACE_FL_FAILED) | ||
| 268 | return 1; | ||
| 269 | |||
| 270 | if (!(rec->flags & FTRACE_FL_CONVERTED)) | ||
| 271 | return 1; | ||
| 272 | |||
| 273 | if (!tracing_on || !ftrace_enabled) | ||
| 274 | return 1; | ||
| 275 | |||
| 276 | if (ftrace_filtered) { | ||
| 277 | fl = rec->flags & (FTRACE_FL_FILTER | | ||
| 278 | FTRACE_FL_NOTRACE); | ||
| 279 | if (!fl || (fl & FTRACE_FL_NOTRACE)) | ||
| 280 | return 1; | ||
| 281 | } | ||
| 282 | } | ||
| 283 | break; | ||
| 284 | } | ||
| 285 | } | ||
| 286 | |||
| 287 | return 0; | ||
| 288 | } | ||
| 289 | |||
| 290 | static inline int | ||
| 291 | ftrace_ip_in_hash(unsigned long ip, unsigned long key) | ||
| 292 | { | ||
| 293 | struct dyn_ftrace *p; | ||
| 294 | struct hlist_node *t; | ||
| 295 | int found = 0; | ||
| 296 | |||
| 297 | hlist_for_each_entry_rcu(p, t, &ftrace_hash[key], node) { | ||
| 298 | if (p->ip == ip) { | ||
| 299 | found = 1; | ||
| 300 | break; | ||
| 301 | } | ||
| 302 | } | ||
| 303 | |||
| 304 | return found; | ||
| 305 | } | ||
| 306 | |||
| 307 | static inline void | ||
| 308 | ftrace_add_hash(struct dyn_ftrace *node, unsigned long key) | ||
| 309 | { | ||
| 310 | hlist_add_head_rcu(&node->node, &ftrace_hash[key]); | ||
| 311 | } | ||
| 312 | |||
| 313 | /* called from kstop_machine */ | ||
| 314 | static inline void ftrace_del_hash(struct dyn_ftrace *node) | ||
| 315 | { | ||
| 316 | hlist_del(&node->node); | ||
| 317 | } | ||
| 318 | |||
| 319 | static void ftrace_free_rec(struct dyn_ftrace *rec) | 242 | static void ftrace_free_rec(struct dyn_ftrace *rec) |
| 320 | { | 243 | { |
| 321 | rec->ip = (unsigned long)ftrace_free_records; | 244 | rec->ip = (unsigned long)ftrace_free_records; |
| @@ -346,7 +269,6 @@ void ftrace_release(void *start, unsigned long size) | |||
| 346 | } | 269 | } |
| 347 | } | 270 | } |
| 348 | spin_unlock(&ftrace_lock); | 271 | spin_unlock(&ftrace_lock); |
| 349 | |||
| 350 | } | 272 | } |
| 351 | 273 | ||
| 352 | static struct dyn_ftrace *ftrace_alloc_dyn_node(unsigned long ip) | 274 | static struct dyn_ftrace *ftrace_alloc_dyn_node(unsigned long ip) |
| @@ -358,10 +280,8 @@ static struct dyn_ftrace *ftrace_alloc_dyn_node(unsigned long ip) | |||
| 358 | rec = ftrace_free_records; | 280 | rec = ftrace_free_records; |
| 359 | 281 | ||
| 360 | if (unlikely(!(rec->flags & FTRACE_FL_FREE))) { | 282 | if (unlikely(!(rec->flags & FTRACE_FL_FREE))) { |
| 361 | WARN_ON_ONCE(1); | 283 | FTRACE_WARN_ON_ONCE(1); |
| 362 | ftrace_free_records = NULL; | 284 | ftrace_free_records = NULL; |
| 363 | ftrace_disabled = 1; | ||
| 364 | ftrace_enabled = 0; | ||
| 365 | return NULL; | 285 | return NULL; |
| 366 | } | 286 | } |
| 367 | 287 | ||
| @@ -371,76 +291,36 @@ static struct dyn_ftrace *ftrace_alloc_dyn_node(unsigned long ip) | |||
| 371 | } | 291 | } |
| 372 | 292 | ||
| 373 | if (ftrace_pages->index == ENTRIES_PER_PAGE) { | 293 | if (ftrace_pages->index == ENTRIES_PER_PAGE) { |
| 374 | if (!ftrace_pages->next) | 294 | if (!ftrace_pages->next) { |
| 375 | return NULL; | 295 | /* allocate another page */ |
| 296 | ftrace_pages->next = | ||
| 297 | (void *)get_zeroed_page(GFP_KERNEL); | ||
| 298 | if (!ftrace_pages->next) | ||
| 299 | return NULL; | ||
| 300 | } | ||
| 376 | ftrace_pages = ftrace_pages->next; | 301 | ftrace_pages = ftrace_pages->next; |
| 377 | } | 302 | } |
| 378 | 303 | ||
| 379 | return &ftrace_pages->records[ftrace_pages->index++]; | 304 | return &ftrace_pages->records[ftrace_pages->index++]; |
| 380 | } | 305 | } |
| 381 | 306 | ||
| 382 | static void | 307 | static struct dyn_ftrace * |
| 383 | ftrace_record_ip(unsigned long ip) | 308 | ftrace_record_ip(unsigned long ip) |
| 384 | { | 309 | { |
| 385 | struct dyn_ftrace *node; | 310 | struct dyn_ftrace *rec; |
| 386 | unsigned long flags; | ||
| 387 | unsigned long key; | ||
| 388 | int resched; | ||
| 389 | int cpu; | ||
| 390 | 311 | ||
| 391 | if (!ftrace_enabled || ftrace_disabled) | 312 | if (!ftrace_enabled || ftrace_disabled) |
| 392 | return; | 313 | return NULL; |
| 393 | |||
| 394 | resched = need_resched(); | ||
| 395 | preempt_disable_notrace(); | ||
| 396 | |||
| 397 | /* | ||
| 398 | * We simply need to protect against recursion. | ||
| 399 | * Use the the raw version of smp_processor_id and not | ||
| 400 | * __get_cpu_var which can call debug hooks that can | ||
| 401 | * cause a recursive crash here. | ||
| 402 | */ | ||
| 403 | cpu = raw_smp_processor_id(); | ||
| 404 | per_cpu(ftrace_shutdown_disable_cpu, cpu)++; | ||
| 405 | if (per_cpu(ftrace_shutdown_disable_cpu, cpu) != 1) | ||
| 406 | goto out; | ||
| 407 | 314 | ||
| 408 | if (unlikely(ftrace_record_suspend)) | 315 | rec = ftrace_alloc_dyn_node(ip); |
| 409 | goto out; | 316 | if (!rec) |
| 410 | 317 | return NULL; | |
| 411 | key = hash_long(ip, FTRACE_HASHBITS); | ||
| 412 | |||
| 413 | WARN_ON_ONCE(key >= FTRACE_HASHSIZE); | ||
| 414 | |||
| 415 | if (ftrace_ip_in_hash(ip, key)) | ||
| 416 | goto out; | ||
| 417 | |||
| 418 | ftrace_hash_lock(flags); | ||
| 419 | |||
| 420 | /* This ip may have hit the hash before the lock */ | ||
| 421 | if (ftrace_ip_in_hash(ip, key)) | ||
| 422 | goto out_unlock; | ||
| 423 | |||
| 424 | node = ftrace_alloc_dyn_node(ip); | ||
| 425 | if (!node) | ||
| 426 | goto out_unlock; | ||
| 427 | |||
| 428 | node->ip = ip; | ||
| 429 | 318 | ||
| 430 | ftrace_add_hash(node, key); | 319 | rec->ip = ip; |
| 431 | 320 | ||
| 432 | ftraced_trigger = 1; | 321 | list_add(&rec->list, &ftrace_new_addrs); |
| 433 | 322 | ||
| 434 | out_unlock: | 323 | return rec; |
| 435 | ftrace_hash_unlock(flags); | ||
| 436 | out: | ||
| 437 | per_cpu(ftrace_shutdown_disable_cpu, cpu)--; | ||
| 438 | |||
| 439 | /* prevent recursion with scheduler */ | ||
| 440 | if (resched) | ||
| 441 | preempt_enable_no_resched_notrace(); | ||
| 442 | else | ||
| 443 | preempt_enable_notrace(); | ||
| 444 | } | 324 | } |
| 445 | 325 | ||
| 446 | #define FTRACE_ADDR ((long)(ftrace_caller)) | 326 | #define FTRACE_ADDR ((long)(ftrace_caller)) |
| @@ -559,7 +439,6 @@ static void ftrace_replace_code(int enable) | |||
| 559 | rec->flags |= FTRACE_FL_FAILED; | 439 | rec->flags |= FTRACE_FL_FAILED; |
| 560 | if ((system_state == SYSTEM_BOOTING) || | 440 | if ((system_state == SYSTEM_BOOTING) || |
| 561 | !core_kernel_text(rec->ip)) { | 441 | !core_kernel_text(rec->ip)) { |
| 562 | ftrace_del_hash(rec); | ||
| 563 | ftrace_free_rec(rec); | 442 | ftrace_free_rec(rec); |
| 564 | } | 443 | } |
| 565 | } | 444 | } |
| @@ -567,15 +446,6 @@ static void ftrace_replace_code(int enable) | |||
| 567 | } | 446 | } |
| 568 | } | 447 | } |
| 569 | 448 | ||
| 570 | static void ftrace_shutdown_replenish(void) | ||
| 571 | { | ||
| 572 | if (ftrace_pages->next) | ||
| 573 | return; | ||
| 574 | |||
| 575 | /* allocate another page */ | ||
| 576 | ftrace_pages->next = (void *)get_zeroed_page(GFP_KERNEL); | ||
| 577 | } | ||
| 578 | |||
| 579 | static void print_ip_ins(const char *fmt, unsigned char *p) | 449 | static void print_ip_ins(const char *fmt, unsigned char *p) |
| 580 | { | 450 | { |
| 581 | int i; | 451 | int i; |
| @@ -591,23 +461,23 @@ ftrace_code_disable(struct dyn_ftrace *rec) | |||
| 591 | { | 461 | { |
| 592 | unsigned long ip; | 462 | unsigned long ip; |
| 593 | unsigned char *nop, *call; | 463 | unsigned char *nop, *call; |
| 594 | int failed; | 464 | int ret; |
| 595 | 465 | ||
| 596 | ip = rec->ip; | 466 | ip = rec->ip; |
| 597 | 467 | ||
| 598 | nop = ftrace_nop_replace(); | 468 | nop = ftrace_nop_replace(); |
| 599 | call = ftrace_call_replace(ip, mcount_addr); | 469 | call = ftrace_call_replace(ip, mcount_addr); |
| 600 | 470 | ||
| 601 | failed = ftrace_modify_code(ip, call, nop); | 471 | ret = ftrace_modify_code(ip, call, nop); |
| 602 | if (failed) { | 472 | if (ret) { |
| 603 | switch (failed) { | 473 | switch (ret) { |
| 604 | case 1: | 474 | case -EFAULT: |
| 605 | WARN_ON_ONCE(1); | 475 | FTRACE_WARN_ON_ONCE(1); |
| 606 | pr_info("ftrace faulted on modifying "); | 476 | pr_info("ftrace faulted on modifying "); |
| 607 | print_ip_sym(ip); | 477 | print_ip_sym(ip); |
| 608 | break; | 478 | break; |
| 609 | case 2: | 479 | case -EINVAL: |
| 610 | WARN_ON_ONCE(1); | 480 | FTRACE_WARN_ON_ONCE(1); |
| 611 | pr_info("ftrace failed to modify "); | 481 | pr_info("ftrace failed to modify "); |
| 612 | print_ip_sym(ip); | 482 | print_ip_sym(ip); |
| 613 | print_ip_ins(" expected: ", call); | 483 | print_ip_ins(" expected: ", call); |
| @@ -615,6 +485,15 @@ ftrace_code_disable(struct dyn_ftrace *rec) | |||
| 615 | print_ip_ins(" replace: ", nop); | 485 | print_ip_ins(" replace: ", nop); |
| 616 | printk(KERN_CONT "\n"); | 486 | printk(KERN_CONT "\n"); |
| 617 | break; | 487 | break; |
| 488 | case -EPERM: | ||
| 489 | FTRACE_WARN_ON_ONCE(1); | ||
| 490 | pr_info("ftrace faulted on writing "); | ||
| 491 | print_ip_sym(ip); | ||
| 492 | break; | ||
| 493 | default: | ||
| 494 | FTRACE_WARN_ON_ONCE(1); | ||
| 495 | pr_info("ftrace faulted on unknown error "); | ||
| 496 | print_ip_sym(ip); | ||
| 618 | } | 497 | } |
| 619 | 498 | ||
| 620 | rec->flags |= FTRACE_FL_FAILED; | 499 | rec->flags |= FTRACE_FL_FAILED; |
| @@ -623,19 +502,11 @@ ftrace_code_disable(struct dyn_ftrace *rec) | |||
| 623 | return 1; | 502 | return 1; |
| 624 | } | 503 | } |
| 625 | 504 | ||
| 626 | static int __ftrace_update_code(void *ignore); | ||
| 627 | |||
| 628 | static int __ftrace_modify_code(void *data) | 505 | static int __ftrace_modify_code(void *data) |
| 629 | { | 506 | { |
| 630 | unsigned long addr; | ||
| 631 | int *command = data; | 507 | int *command = data; |
| 632 | 508 | ||
| 633 | if (*command & FTRACE_ENABLE_CALLS) { | 509 | if (*command & FTRACE_ENABLE_CALLS) { |
| 634 | /* | ||
| 635 | * Update any recorded ips now that we have the | ||
| 636 | * machine stopped | ||
| 637 | */ | ||
| 638 | __ftrace_update_code(NULL); | ||
| 639 | ftrace_replace_code(1); | 510 | ftrace_replace_code(1); |
| 640 | tracing_on = 1; | 511 | tracing_on = 1; |
| 641 | } else if (*command & FTRACE_DISABLE_CALLS) { | 512 | } else if (*command & FTRACE_DISABLE_CALLS) { |
| @@ -646,14 +517,6 @@ static int __ftrace_modify_code(void *data) | |||
| 646 | if (*command & FTRACE_UPDATE_TRACE_FUNC) | 517 | if (*command & FTRACE_UPDATE_TRACE_FUNC) |
| 647 | ftrace_update_ftrace_func(ftrace_trace_function); | 518 | ftrace_update_ftrace_func(ftrace_trace_function); |
| 648 | 519 | ||
| 649 | if (*command & FTRACE_ENABLE_MCOUNT) { | ||
| 650 | addr = (unsigned long)ftrace_record_ip; | ||
| 651 | ftrace_mcount_set(&addr); | ||
| 652 | } else if (*command & FTRACE_DISABLE_MCOUNT) { | ||
| 653 | addr = (unsigned long)ftrace_stub; | ||
| 654 | ftrace_mcount_set(&addr); | ||
| 655 | } | ||
| 656 | |||
| 657 | return 0; | 520 | return 0; |
| 658 | } | 521 | } |
| 659 | 522 | ||
| @@ -662,26 +525,9 @@ static void ftrace_run_update_code(int command) | |||
| 662 | stop_machine(__ftrace_modify_code, &command, NULL); | 525 | stop_machine(__ftrace_modify_code, &command, NULL); |
| 663 | } | 526 | } |
| 664 | 527 | ||
| 665 | void ftrace_disable_daemon(void) | ||
| 666 | { | ||
| 667 | /* Stop the daemon from calling kstop_machine */ | ||
| 668 | mutex_lock(&ftraced_lock); | ||
| 669 | ftraced_stop = 1; | ||
| 670 | mutex_unlock(&ftraced_lock); | ||
| 671 | |||
| 672 | ftrace_force_update(); | ||
| 673 | } | ||
| 674 | |||
| 675 | void ftrace_enable_daemon(void) | ||
| 676 | { | ||
| 677 | mutex_lock(&ftraced_lock); | ||
| 678 | ftraced_stop = 0; | ||
| 679 | mutex_unlock(&ftraced_lock); | ||
| 680 | |||
| 681 | ftrace_force_update(); | ||
| 682 | } | ||
| 683 | |||
| 684 | static ftrace_func_t saved_ftrace_func; | 528 | static ftrace_func_t saved_ftrace_func; |
| 529 | static int ftrace_start; | ||
| 530 | static DEFINE_MUTEX(ftrace_start_lock); | ||
| 685 | 531 | ||
| 686 | static void ftrace_startup(void) | 532 | static void ftrace_startup(void) |
| 687 | { | 533 | { |
| @@ -690,9 +536,9 @@ static void ftrace_startup(void) | |||
| 690 | if (unlikely(ftrace_disabled)) | 536 | if (unlikely(ftrace_disabled)) |
| 691 | return; | 537 | return; |
| 692 | 538 | ||
| 693 | mutex_lock(&ftraced_lock); | 539 | mutex_lock(&ftrace_start_lock); |
| 694 | ftraced_suspend++; | 540 | ftrace_start++; |
| 695 | if (ftraced_suspend == 1) | 541 | if (ftrace_start == 1) |
| 696 | command |= FTRACE_ENABLE_CALLS; | 542 | command |= FTRACE_ENABLE_CALLS; |
| 697 | 543 | ||
| 698 | if (saved_ftrace_func != ftrace_trace_function) { | 544 | if (saved_ftrace_func != ftrace_trace_function) { |
| @@ -705,7 +551,7 @@ static void ftrace_startup(void) | |||
| 705 | 551 | ||
| 706 | ftrace_run_update_code(command); | 552 | ftrace_run_update_code(command); |
| 707 | out: | 553 | out: |
| 708 | mutex_unlock(&ftraced_lock); | 554 | mutex_unlock(&ftrace_start_lock); |
| 709 | } | 555 | } |
| 710 | 556 | ||
| 711 | static void ftrace_shutdown(void) | 557 | static void ftrace_shutdown(void) |
| @@ -715,9 +561,9 @@ static void ftrace_shutdown(void) | |||
| 715 | if (unlikely(ftrace_disabled)) | 561 | if (unlikely(ftrace_disabled)) |
| 716 | return; | 562 | return; |
| 717 | 563 | ||
| 718 | mutex_lock(&ftraced_lock); | 564 | mutex_lock(&ftrace_start_lock); |
| 719 | ftraced_suspend--; | 565 | ftrace_start--; |
| 720 | if (!ftraced_suspend) | 566 | if (!ftrace_start) |
| 721 | command |= FTRACE_DISABLE_CALLS; | 567 | command |= FTRACE_DISABLE_CALLS; |
| 722 | 568 | ||
| 723 | if (saved_ftrace_func != ftrace_trace_function) { | 569 | if (saved_ftrace_func != ftrace_trace_function) { |
| @@ -730,7 +576,7 @@ static void ftrace_shutdown(void) | |||
| 730 | 576 | ||
| 731 | ftrace_run_update_code(command); | 577 | ftrace_run_update_code(command); |
| 732 | out: | 578 | out: |
| 733 | mutex_unlock(&ftraced_lock); | 579 | mutex_unlock(&ftrace_start_lock); |
| 734 | } | 580 | } |
| 735 | 581 | ||
| 736 | static void ftrace_startup_sysctl(void) | 582 | static void ftrace_startup_sysctl(void) |
| @@ -740,15 +586,15 @@ static void ftrace_startup_sysctl(void) | |||
| 740 | if (unlikely(ftrace_disabled)) | 586 | if (unlikely(ftrace_disabled)) |
| 741 | return; | 587 | return; |
| 742 | 588 | ||
| 743 | mutex_lock(&ftraced_lock); | 589 | mutex_lock(&ftrace_start_lock); |
| 744 | /* Force update next time */ | 590 | /* Force update next time */ |
| 745 | saved_ftrace_func = NULL; | 591 | saved_ftrace_func = NULL; |
| 746 | /* ftraced_suspend is true if we want ftrace running */ | 592 | /* ftrace_start is true if we want ftrace running */ |
| 747 | if (ftraced_suspend) | 593 | if (ftrace_start) |
| 748 | command |= FTRACE_ENABLE_CALLS; | 594 | command |= FTRACE_ENABLE_CALLS; |
| 749 | 595 | ||
| 750 | ftrace_run_update_code(command); | 596 | ftrace_run_update_code(command); |
| 751 | mutex_unlock(&ftraced_lock); | 597 | mutex_unlock(&ftrace_start_lock); |
| 752 | } | 598 | } |
| 753 | 599 | ||
| 754 | static void ftrace_shutdown_sysctl(void) | 600 | static void ftrace_shutdown_sysctl(void) |
| @@ -758,112 +604,50 @@ static void ftrace_shutdown_sysctl(void) | |||
| 758 | if (unlikely(ftrace_disabled)) | 604 | if (unlikely(ftrace_disabled)) |
| 759 | return; | 605 | return; |
| 760 | 606 | ||
| 761 | mutex_lock(&ftraced_lock); | 607 | mutex_lock(&ftrace_start_lock); |
| 762 | /* ftraced_suspend is true if ftrace is running */ | 608 | /* ftrace_start is true if ftrace is running */ |
| 763 | if (ftraced_suspend) | 609 | if (ftrace_start) |
| 764 | command |= FTRACE_DISABLE_CALLS; | 610 | command |= FTRACE_DISABLE_CALLS; |
| 765 | 611 | ||
| 766 | ftrace_run_update_code(command); | 612 | ftrace_run_update_code(command); |
| 767 | mutex_unlock(&ftraced_lock); | 613 | mutex_unlock(&ftrace_start_lock); |
| 768 | } | 614 | } |
| 769 | 615 | ||
| 770 | static cycle_t ftrace_update_time; | 616 | static cycle_t ftrace_update_time; |
| 771 | static unsigned long ftrace_update_cnt; | 617 | static unsigned long ftrace_update_cnt; |
| 772 | unsigned long ftrace_update_tot_cnt; | 618 | unsigned long ftrace_update_tot_cnt; |
| 773 | 619 | ||
| 774 | static int __ftrace_update_code(void *ignore) | 620 | static int ftrace_update_code(void) |
| 775 | { | 621 | { |
| 776 | int i, save_ftrace_enabled; | 622 | struct dyn_ftrace *p, *t; |
| 777 | cycle_t start, stop; | 623 | cycle_t start, stop; |
| 778 | struct dyn_ftrace *p; | ||
| 779 | struct hlist_node *t, *n; | ||
| 780 | struct hlist_head *head, temp_list; | ||
| 781 | |||
| 782 | /* Don't be recording funcs now */ | ||
| 783 | ftrace_record_suspend++; | ||
| 784 | save_ftrace_enabled = ftrace_enabled; | ||
| 785 | ftrace_enabled = 0; | ||
| 786 | 624 | ||
| 787 | start = ftrace_now(raw_smp_processor_id()); | 625 | start = ftrace_now(raw_smp_processor_id()); |
| 788 | ftrace_update_cnt = 0; | 626 | ftrace_update_cnt = 0; |
| 789 | 627 | ||
| 790 | /* No locks needed, the machine is stopped! */ | 628 | list_for_each_entry_safe(p, t, &ftrace_new_addrs, list) { |
| 791 | for (i = 0; i < FTRACE_HASHSIZE; i++) { | ||
| 792 | INIT_HLIST_HEAD(&temp_list); | ||
| 793 | head = &ftrace_hash[i]; | ||
| 794 | |||
| 795 | /* all CPUS are stopped, we are safe to modify code */ | ||
| 796 | hlist_for_each_entry_safe(p, t, n, head, node) { | ||
| 797 | /* Skip over failed records which have not been | ||
| 798 | * freed. */ | ||
| 799 | if (p->flags & FTRACE_FL_FAILED) | ||
| 800 | continue; | ||
| 801 | |||
| 802 | /* Unconverted records are always at the head of the | ||
| 803 | * hash bucket. Once we encounter a converted record, | ||
| 804 | * simply skip over to the next bucket. Saves ftraced | ||
| 805 | * some processor cycles (ftrace does its bid for | ||
| 806 | * global warming :-p ). */ | ||
| 807 | if (p->flags & (FTRACE_FL_CONVERTED)) | ||
| 808 | break; | ||
| 809 | 629 | ||
| 810 | /* Ignore updates to this record's mcount site. | 630 | /* If something went wrong, bail without enabling anything */ |
| 811 | * Reintroduce this record at the head of this | 631 | if (unlikely(ftrace_disabled)) |
| 812 | * bucket to attempt to "convert" it again if | 632 | return -1; |
| 813 | * the kprobe on it is unregistered before the | ||
| 814 | * next run. */ | ||
| 815 | if (get_kprobe((void *)p->ip)) { | ||
| 816 | ftrace_del_hash(p); | ||
| 817 | INIT_HLIST_NODE(&p->node); | ||
| 818 | hlist_add_head(&p->node, &temp_list); | ||
| 819 | freeze_record(p); | ||
| 820 | continue; | ||
| 821 | } else { | ||
| 822 | unfreeze_record(p); | ||
| 823 | } | ||
| 824 | 633 | ||
| 825 | /* convert record (i.e, patch mcount-call with NOP) */ | 634 | list_del_init(&p->list); |
| 826 | if (ftrace_code_disable(p)) { | ||
| 827 | p->flags |= FTRACE_FL_CONVERTED; | ||
| 828 | ftrace_update_cnt++; | ||
| 829 | } else { | ||
| 830 | if ((system_state == SYSTEM_BOOTING) || | ||
| 831 | !core_kernel_text(p->ip)) { | ||
| 832 | ftrace_del_hash(p); | ||
| 833 | ftrace_free_rec(p); | ||
| 834 | } | ||
| 835 | } | ||
| 836 | } | ||
| 837 | 635 | ||
| 838 | hlist_for_each_entry_safe(p, t, n, &temp_list, node) { | 636 | /* convert record (i.e, patch mcount-call with NOP) */ |
| 839 | hlist_del(&p->node); | 637 | if (ftrace_code_disable(p)) { |
| 840 | INIT_HLIST_NODE(&p->node); | 638 | p->flags |= FTRACE_FL_CONVERTED; |
| 841 | hlist_add_head(&p->node, head); | 639 | ftrace_update_cnt++; |
| 842 | } | 640 | } else |
| 641 | ftrace_free_rec(p); | ||
| 843 | } | 642 | } |
| 844 | 643 | ||
| 845 | stop = ftrace_now(raw_smp_processor_id()); | 644 | stop = ftrace_now(raw_smp_processor_id()); |
| 846 | ftrace_update_time = stop - start; | 645 | ftrace_update_time = stop - start; |
| 847 | ftrace_update_tot_cnt += ftrace_update_cnt; | 646 | ftrace_update_tot_cnt += ftrace_update_cnt; |
| 848 | ftraced_trigger = 0; | ||
| 849 | |||
| 850 | ftrace_enabled = save_ftrace_enabled; | ||
| 851 | ftrace_record_suspend--; | ||
| 852 | 647 | ||
| 853 | return 0; | 648 | return 0; |
| 854 | } | 649 | } |
| 855 | 650 | ||
| 856 | static int ftrace_update_code(void) | ||
| 857 | { | ||
| 858 | if (unlikely(ftrace_disabled) || | ||
| 859 | !ftrace_enabled || !ftraced_trigger) | ||
| 860 | return 0; | ||
| 861 | |||
| 862 | stop_machine(__ftrace_update_code, NULL, NULL); | ||
| 863 | |||
| 864 | return 1; | ||
| 865 | } | ||
| 866 | |||
| 867 | static int __init ftrace_dyn_table_alloc(unsigned long num_to_init) | 651 | static int __init ftrace_dyn_table_alloc(unsigned long num_to_init) |
| 868 | { | 652 | { |
| 869 | struct ftrace_page *pg; | 653 | struct ftrace_page *pg; |
| @@ -892,7 +676,7 @@ static int __init ftrace_dyn_table_alloc(unsigned long num_to_init) | |||
| 892 | pg = ftrace_pages = ftrace_pages_start; | 676 | pg = ftrace_pages = ftrace_pages_start; |
| 893 | 677 | ||
| 894 | cnt = num_to_init / ENTRIES_PER_PAGE; | 678 | cnt = num_to_init / ENTRIES_PER_PAGE; |
| 895 | pr_info("ftrace: allocating %ld hash entries in %d pages\n", | 679 | pr_info("ftrace: allocating %ld entries in %d pages\n", |
| 896 | num_to_init, cnt); | 680 | num_to_init, cnt); |
| 897 | 681 | ||
| 898 | for (i = 0; i < cnt; i++) { | 682 | for (i = 0; i < cnt; i++) { |
| @@ -1401,10 +1185,10 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
| 1401 | } | 1185 | } |
| 1402 | 1186 | ||
| 1403 | mutex_lock(&ftrace_sysctl_lock); | 1187 | mutex_lock(&ftrace_sysctl_lock); |
| 1404 | mutex_lock(&ftraced_lock); | 1188 | mutex_lock(&ftrace_start_lock); |
| 1405 | if (iter->filtered && ftraced_suspend && ftrace_enabled) | 1189 | if (iter->filtered && ftrace_start && ftrace_enabled) |
| 1406 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); | 1190 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); |
| 1407 | mutex_unlock(&ftraced_lock); | 1191 | mutex_unlock(&ftrace_start_lock); |
| 1408 | mutex_unlock(&ftrace_sysctl_lock); | 1192 | mutex_unlock(&ftrace_sysctl_lock); |
| 1409 | 1193 | ||
| 1410 | kfree(iter); | 1194 | kfree(iter); |
| @@ -1424,55 +1208,6 @@ ftrace_notrace_release(struct inode *inode, struct file *file) | |||
| 1424 | return ftrace_regex_release(inode, file, 0); | 1208 | return ftrace_regex_release(inode, file, 0); |
| 1425 | } | 1209 | } |
| 1426 | 1210 | ||
| 1427 | static ssize_t | ||
| 1428 | ftraced_read(struct file *filp, char __user *ubuf, | ||
| 1429 | size_t cnt, loff_t *ppos) | ||
| 1430 | { | ||
| 1431 | /* don't worry about races */ | ||
| 1432 | char *buf = ftraced_stop ? "disabled\n" : "enabled\n"; | ||
| 1433 | int r = strlen(buf); | ||
| 1434 | |||
| 1435 | return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); | ||
| 1436 | } | ||
| 1437 | |||
| 1438 | static ssize_t | ||
| 1439 | ftraced_write(struct file *filp, const char __user *ubuf, | ||
| 1440 | size_t cnt, loff_t *ppos) | ||
| 1441 | { | ||
| 1442 | char buf[64]; | ||
| 1443 | long val; | ||
| 1444 | int ret; | ||
| 1445 | |||
| 1446 | if (cnt >= sizeof(buf)) | ||
| 1447 | return -EINVAL; | ||
| 1448 | |||
| 1449 | if (copy_from_user(&buf, ubuf, cnt)) | ||
| 1450 | return -EFAULT; | ||
| 1451 | |||
| 1452 | if (strncmp(buf, "enable", 6) == 0) | ||
| 1453 | val = 1; | ||
| 1454 | else if (strncmp(buf, "disable", 7) == 0) | ||
| 1455 | val = 0; | ||
| 1456 | else { | ||
| 1457 | buf[cnt] = 0; | ||
| 1458 | |||
| 1459 | ret = strict_strtoul(buf, 10, &val); | ||
| 1460 | if (ret < 0) | ||
| 1461 | return ret; | ||
| 1462 | |||
| 1463 | val = !!val; | ||
| 1464 | } | ||
| 1465 | |||
| 1466 | if (val) | ||
| 1467 | ftrace_enable_daemon(); | ||
| 1468 | else | ||
| 1469 | ftrace_disable_daemon(); | ||
| 1470 | |||
| 1471 | filp->f_pos += cnt; | ||
| 1472 | |||
| 1473 | return cnt; | ||
| 1474 | } | ||
| 1475 | |||
| 1476 | static struct file_operations ftrace_avail_fops = { | 1211 | static struct file_operations ftrace_avail_fops = { |
| 1477 | .open = ftrace_avail_open, | 1212 | .open = ftrace_avail_open, |
| 1478 | .read = seq_read, | 1213 | .read = seq_read, |
| @@ -1503,54 +1238,6 @@ static struct file_operations ftrace_notrace_fops = { | |||
| 1503 | .release = ftrace_notrace_release, | 1238 | .release = ftrace_notrace_release, |
| 1504 | }; | 1239 | }; |
| 1505 | 1240 | ||
| 1506 | static struct file_operations ftraced_fops = { | ||
| 1507 | .open = tracing_open_generic, | ||
| 1508 | .read = ftraced_read, | ||
| 1509 | .write = ftraced_write, | ||
| 1510 | }; | ||
| 1511 | |||
| 1512 | /** | ||
| 1513 | * ftrace_force_update - force an update to all recording ftrace functions | ||
| 1514 | */ | ||
| 1515 | int ftrace_force_update(void) | ||
| 1516 | { | ||
| 1517 | int ret = 0; | ||
| 1518 | |||
| 1519 | if (unlikely(ftrace_disabled)) | ||
| 1520 | return -ENODEV; | ||
| 1521 | |||
| 1522 | mutex_lock(&ftrace_sysctl_lock); | ||
| 1523 | mutex_lock(&ftraced_lock); | ||
| 1524 | |||
| 1525 | /* | ||
| 1526 | * If ftraced_trigger is not set, then there is nothing | ||
| 1527 | * to update. | ||
| 1528 | */ | ||
| 1529 | if (ftraced_trigger && !ftrace_update_code()) | ||
| 1530 | ret = -EBUSY; | ||
| 1531 | |||
| 1532 | mutex_unlock(&ftraced_lock); | ||
| 1533 | mutex_unlock(&ftrace_sysctl_lock); | ||
| 1534 | |||
| 1535 | return ret; | ||
| 1536 | } | ||
| 1537 | |||
| 1538 | static void ftrace_force_shutdown(void) | ||
| 1539 | { | ||
| 1540 | struct task_struct *task; | ||
| 1541 | int command = FTRACE_DISABLE_CALLS | FTRACE_UPDATE_TRACE_FUNC; | ||
| 1542 | |||
| 1543 | mutex_lock(&ftraced_lock); | ||
| 1544 | task = ftraced_task; | ||
| 1545 | ftraced_task = NULL; | ||
| 1546 | ftraced_suspend = -1; | ||
| 1547 | ftrace_run_update_code(command); | ||
| 1548 | mutex_unlock(&ftraced_lock); | ||
| 1549 | |||
| 1550 | if (task) | ||
| 1551 | kthread_stop(task); | ||
| 1552 | } | ||
| 1553 | |||
| 1554 | static __init int ftrace_init_debugfs(void) | 1241 | static __init int ftrace_init_debugfs(void) |
| 1555 | { | 1242 | { |
| 1556 | struct dentry *d_tracer; | 1243 | struct dentry *d_tracer; |
| @@ -1581,17 +1268,11 @@ static __init int ftrace_init_debugfs(void) | |||
| 1581 | pr_warning("Could not create debugfs " | 1268 | pr_warning("Could not create debugfs " |
| 1582 | "'set_ftrace_notrace' entry\n"); | 1269 | "'set_ftrace_notrace' entry\n"); |
| 1583 | 1270 | ||
| 1584 | entry = debugfs_create_file("ftraced_enabled", 0644, d_tracer, | ||
| 1585 | NULL, &ftraced_fops); | ||
| 1586 | if (!entry) | ||
| 1587 | pr_warning("Could not create debugfs " | ||
| 1588 | "'ftraced_enabled' entry\n"); | ||
| 1589 | return 0; | 1271 | return 0; |
| 1590 | } | 1272 | } |
| 1591 | 1273 | ||
| 1592 | fs_initcall(ftrace_init_debugfs); | 1274 | fs_initcall(ftrace_init_debugfs); |
| 1593 | 1275 | ||
| 1594 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | ||
| 1595 | static int ftrace_convert_nops(unsigned long *start, | 1276 | static int ftrace_convert_nops(unsigned long *start, |
| 1596 | unsigned long *end) | 1277 | unsigned long *end) |
| 1597 | { | 1278 | { |
| @@ -1599,20 +1280,18 @@ static int ftrace_convert_nops(unsigned long *start, | |||
| 1599 | unsigned long addr; | 1280 | unsigned long addr; |
| 1600 | unsigned long flags; | 1281 | unsigned long flags; |
| 1601 | 1282 | ||
| 1283 | mutex_lock(&ftrace_start_lock); | ||
| 1602 | p = start; | 1284 | p = start; |
| 1603 | while (p < end) { | 1285 | while (p < end) { |
| 1604 | addr = ftrace_call_adjust(*p++); | 1286 | addr = ftrace_call_adjust(*p++); |
| 1605 | /* should not be called from interrupt context */ | ||
| 1606 | spin_lock(&ftrace_lock); | ||
| 1607 | ftrace_record_ip(addr); | 1287 | ftrace_record_ip(addr); |
| 1608 | spin_unlock(&ftrace_lock); | ||
| 1609 | ftrace_shutdown_replenish(); | ||
| 1610 | } | 1288 | } |
| 1611 | 1289 | ||
| 1612 | /* p is ignored */ | 1290 | /* disable interrupts to prevent kstop machine */ |
| 1613 | local_irq_save(flags); | 1291 | local_irq_save(flags); |
| 1614 | __ftrace_update_code(p); | 1292 | ftrace_update_code(); |
| 1615 | local_irq_restore(flags); | 1293 | local_irq_restore(flags); |
| 1294 | mutex_unlock(&ftrace_start_lock); | ||
| 1616 | 1295 | ||
| 1617 | return 0; | 1296 | return 0; |
| 1618 | } | 1297 | } |
| @@ -1658,130 +1337,26 @@ void __init ftrace_init(void) | |||
| 1658 | failed: | 1337 | failed: |
| 1659 | ftrace_disabled = 1; | 1338 | ftrace_disabled = 1; |
| 1660 | } | 1339 | } |
| 1661 | #else /* CONFIG_FTRACE_MCOUNT_RECORD */ | ||
| 1662 | static int ftraced(void *ignore) | ||
| 1663 | { | ||
| 1664 | unsigned long usecs; | ||
| 1665 | |||
| 1666 | while (!kthread_should_stop()) { | ||
| 1667 | |||
| 1668 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 1669 | |||
| 1670 | /* check once a second */ | ||
| 1671 | schedule_timeout(HZ); | ||
| 1672 | |||
| 1673 | if (unlikely(ftrace_disabled)) | ||
| 1674 | continue; | ||
| 1675 | |||
| 1676 | mutex_lock(&ftrace_sysctl_lock); | ||
| 1677 | mutex_lock(&ftraced_lock); | ||
| 1678 | if (!ftraced_suspend && !ftraced_stop && | ||
| 1679 | ftrace_update_code()) { | ||
| 1680 | usecs = nsecs_to_usecs(ftrace_update_time); | ||
| 1681 | if (ftrace_update_tot_cnt > 100000) { | ||
| 1682 | ftrace_update_tot_cnt = 0; | ||
| 1683 | pr_info("hm, dftrace overflow: %lu change%s" | ||
| 1684 | " (%lu total) in %lu usec%s\n", | ||
| 1685 | ftrace_update_cnt, | ||
| 1686 | ftrace_update_cnt != 1 ? "s" : "", | ||
| 1687 | ftrace_update_tot_cnt, | ||
| 1688 | usecs, usecs != 1 ? "s" : ""); | ||
| 1689 | ftrace_disabled = 1; | ||
| 1690 | WARN_ON_ONCE(1); | ||
| 1691 | } | ||
| 1692 | } | ||
| 1693 | mutex_unlock(&ftraced_lock); | ||
| 1694 | mutex_unlock(&ftrace_sysctl_lock); | ||
| 1695 | |||
| 1696 | ftrace_shutdown_replenish(); | ||
| 1697 | } | ||
| 1698 | __set_current_state(TASK_RUNNING); | ||
| 1699 | return 0; | ||
| 1700 | } | ||
| 1701 | |||
| 1702 | static int __init ftrace_dynamic_init(void) | ||
| 1703 | { | ||
| 1704 | struct task_struct *p; | ||
| 1705 | unsigned long addr; | ||
| 1706 | int ret; | ||
| 1707 | |||
| 1708 | addr = (unsigned long)ftrace_record_ip; | ||
| 1709 | |||
| 1710 | stop_machine(ftrace_dyn_arch_init, &addr, NULL); | ||
| 1711 | |||
| 1712 | /* ftrace_dyn_arch_init places the return code in addr */ | ||
| 1713 | if (addr) { | ||
| 1714 | ret = (int)addr; | ||
| 1715 | goto failed; | ||
| 1716 | } | ||
| 1717 | |||
| 1718 | ret = ftrace_dyn_table_alloc(NR_TO_INIT); | ||
| 1719 | if (ret) | ||
| 1720 | goto failed; | ||
| 1721 | |||
| 1722 | p = kthread_run(ftraced, NULL, "ftraced"); | ||
| 1723 | if (IS_ERR(p)) { | ||
| 1724 | ret = -1; | ||
| 1725 | goto failed; | ||
| 1726 | } | ||
| 1727 | |||
| 1728 | last_ftrace_enabled = ftrace_enabled = 1; | ||
| 1729 | ftraced_task = p; | ||
| 1730 | |||
| 1731 | return 0; | ||
| 1732 | |||
| 1733 | failed: | ||
| 1734 | ftrace_disabled = 1; | ||
| 1735 | return ret; | ||
| 1736 | } | ||
| 1737 | |||
| 1738 | core_initcall(ftrace_dynamic_init); | ||
| 1739 | #endif /* CONFIG_FTRACE_MCOUNT_RECORD */ | ||
| 1740 | 1340 | ||
| 1741 | #else | 1341 | #else |
| 1742 | # define ftrace_startup() do { } while (0) | 1342 | # define ftrace_startup() do { } while (0) |
| 1743 | # define ftrace_shutdown() do { } while (0) | 1343 | # define ftrace_shutdown() do { } while (0) |
| 1744 | # define ftrace_startup_sysctl() do { } while (0) | 1344 | # define ftrace_startup_sysctl() do { } while (0) |
| 1745 | # define ftrace_shutdown_sysctl() do { } while (0) | 1345 | # define ftrace_shutdown_sysctl() do { } while (0) |
| 1746 | # define ftrace_force_shutdown() do { } while (0) | ||
| 1747 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 1346 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
| 1748 | 1347 | ||
| 1749 | /** | 1348 | /** |
| 1750 | * ftrace_kill_atomic - kill ftrace from critical sections | 1349 | * ftrace_kill - kill ftrace |
| 1751 | * | 1350 | * |
| 1752 | * This function should be used by panic code. It stops ftrace | 1351 | * This function should be used by panic code. It stops ftrace |
| 1753 | * but in a not so nice way. If you need to simply kill ftrace | 1352 | * but in a not so nice way. If you need to simply kill ftrace |
| 1754 | * from a non-atomic section, use ftrace_kill. | 1353 | * from a non-atomic section, use ftrace_kill. |
| 1755 | */ | 1354 | */ |
| 1756 | void ftrace_kill_atomic(void) | ||
| 1757 | { | ||
| 1758 | ftrace_disabled = 1; | ||
| 1759 | ftrace_enabled = 0; | ||
| 1760 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
| 1761 | ftraced_suspend = -1; | ||
| 1762 | #endif | ||
| 1763 | clear_ftrace_function(); | ||
| 1764 | } | ||
| 1765 | |||
| 1766 | /** | ||
| 1767 | * ftrace_kill - totally shutdown ftrace | ||
| 1768 | * | ||
| 1769 | * This is a safety measure. If something was detected that seems | ||
| 1770 | * wrong, calling this function will keep ftrace from doing | ||
| 1771 | * any more modifications, and updates. | ||
| 1772 | * used when something went wrong. | ||
| 1773 | */ | ||
| 1774 | void ftrace_kill(void) | 1355 | void ftrace_kill(void) |
| 1775 | { | 1356 | { |
| 1776 | mutex_lock(&ftrace_sysctl_lock); | ||
| 1777 | ftrace_disabled = 1; | 1357 | ftrace_disabled = 1; |
| 1778 | ftrace_enabled = 0; | 1358 | ftrace_enabled = 0; |
| 1779 | |||
| 1780 | clear_ftrace_function(); | 1359 | clear_ftrace_function(); |
| 1781 | mutex_unlock(&ftrace_sysctl_lock); | ||
| 1782 | |||
| 1783 | /* Try to totally disable ftrace */ | ||
| 1784 | ftrace_force_shutdown(); | ||
| 1785 | } | 1360 | } |
| 1786 | 1361 | ||
| 1787 | /** | 1362 | /** |
| @@ -1870,3 +1445,4 @@ ftrace_enable_sysctl(struct ctl_table *table, int write, | |||
| 1870 | mutex_unlock(&ftrace_sysctl_lock); | 1445 | mutex_unlock(&ftrace_sysctl_lock); |
| 1871 | return ret; | 1446 | return ret; |
| 1872 | } | 1447 | } |
| 1448 | |||
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 94af1fe56bb4..cedf4e268285 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -130,7 +130,7 @@ struct buffer_page { | |||
| 130 | static inline void free_buffer_page(struct buffer_page *bpage) | 130 | static inline void free_buffer_page(struct buffer_page *bpage) |
| 131 | { | 131 | { |
| 132 | if (bpage->page) | 132 | if (bpage->page) |
| 133 | __free_page(bpage->page); | 133 | free_page((unsigned long)bpage->page); |
| 134 | kfree(bpage); | 134 | kfree(bpage); |
| 135 | } | 135 | } |
| 136 | 136 | ||
| @@ -966,7 +966,9 @@ rb_add_time_stamp(struct ring_buffer_per_cpu *cpu_buffer, | |||
| 966 | if (unlikely(*delta > (1ULL << 59) && !once++)) { | 966 | if (unlikely(*delta > (1ULL << 59) && !once++)) { |
| 967 | printk(KERN_WARNING "Delta way too big! %llu" | 967 | printk(KERN_WARNING "Delta way too big! %llu" |
| 968 | " ts=%llu write stamp = %llu\n", | 968 | " ts=%llu write stamp = %llu\n", |
| 969 | *delta, *ts, cpu_buffer->write_stamp); | 969 | (unsigned long long)*delta, |
| 970 | (unsigned long long)*ts, | ||
| 971 | (unsigned long long)cpu_buffer->write_stamp); | ||
| 970 | WARN_ON(1); | 972 | WARN_ON(1); |
| 971 | } | 973 | } |
| 972 | 974 | ||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d345d649d073..a610ca771558 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | 34 | ||
| 35 | #include <linux/stacktrace.h> | 35 | #include <linux/stacktrace.h> |
| 36 | #include <linux/ring_buffer.h> | 36 | #include <linux/ring_buffer.h> |
| 37 | #include <linux/irqflags.h> | ||
| 37 | 38 | ||
| 38 | #include "trace.h" | 39 | #include "trace.h" |
| 39 | 40 | ||
| @@ -851,7 +852,7 @@ ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) | |||
| 851 | preempt_enable_notrace(); | 852 | preempt_enable_notrace(); |
| 852 | } | 853 | } |
| 853 | 854 | ||
| 854 | #ifdef CONFIG_FTRACE | 855 | #ifdef CONFIG_FUNCTION_TRACER |
| 855 | static void | 856 | static void |
| 856 | function_trace_call(unsigned long ip, unsigned long parent_ip) | 857 | function_trace_call(unsigned long ip, unsigned long parent_ip) |
| 857 | { | 858 | { |
| @@ -865,9 +866,6 @@ function_trace_call(unsigned long ip, unsigned long parent_ip) | |||
| 865 | if (unlikely(!ftrace_function_enabled)) | 866 | if (unlikely(!ftrace_function_enabled)) |
| 866 | return; | 867 | return; |
| 867 | 868 | ||
| 868 | if (skip_trace(ip)) | ||
| 869 | return; | ||
| 870 | |||
| 871 | pc = preempt_count(); | 869 | pc = preempt_count(); |
| 872 | resched = need_resched(); | 870 | resched = need_resched(); |
| 873 | preempt_disable_notrace(); | 871 | preempt_disable_notrace(); |
| @@ -2379,9 +2377,10 @@ tracing_set_trace_write(struct file *filp, const char __user *ubuf, | |||
| 2379 | int i; | 2377 | int i; |
| 2380 | size_t ret; | 2378 | size_t ret; |
| 2381 | 2379 | ||
| 2380 | ret = cnt; | ||
| 2381 | |||
| 2382 | if (cnt > max_tracer_type_len) | 2382 | if (cnt > max_tracer_type_len) |
| 2383 | cnt = max_tracer_type_len; | 2383 | cnt = max_tracer_type_len; |
| 2384 | ret = cnt; | ||
| 2385 | 2384 | ||
| 2386 | if (copy_from_user(&buf, ubuf, cnt)) | 2385 | if (copy_from_user(&buf, ubuf, cnt)) |
| 2387 | return -EFAULT; | 2386 | return -EFAULT; |
| @@ -2414,8 +2413,8 @@ tracing_set_trace_write(struct file *filp, const char __user *ubuf, | |||
| 2414 | out: | 2413 | out: |
| 2415 | mutex_unlock(&trace_types_lock); | 2414 | mutex_unlock(&trace_types_lock); |
| 2416 | 2415 | ||
| 2417 | if (ret == cnt) | 2416 | if (ret > 0) |
| 2418 | filp->f_pos += cnt; | 2417 | filp->f_pos += ret; |
| 2419 | 2418 | ||
| 2420 | return ret; | 2419 | return ret; |
| 2421 | } | 2420 | } |
| @@ -3097,7 +3096,7 @@ void ftrace_dump(void) | |||
| 3097 | dump_ran = 1; | 3096 | dump_ran = 1; |
| 3098 | 3097 | ||
| 3099 | /* No turning back! */ | 3098 | /* No turning back! */ |
| 3100 | ftrace_kill_atomic(); | 3099 | ftrace_kill(); |
| 3101 | 3100 | ||
| 3102 | for_each_tracing_cpu(cpu) { | 3101 | for_each_tracing_cpu(cpu) { |
| 3103 | atomic_inc(&global_trace.data[cpu]->disabled); | 3102 | atomic_inc(&global_trace.data[cpu]->disabled); |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index f1f99572cde7..6889ca48f1f1 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -335,7 +335,7 @@ void update_max_tr_single(struct trace_array *tr, | |||
| 335 | 335 | ||
| 336 | extern cycle_t ftrace_now(int cpu); | 336 | extern cycle_t ftrace_now(int cpu); |
| 337 | 337 | ||
| 338 | #ifdef CONFIG_FTRACE | 338 | #ifdef CONFIG_FUNCTION_TRACER |
| 339 | void tracing_start_function_trace(void); | 339 | void tracing_start_function_trace(void); |
| 340 | void tracing_stop_function_trace(void); | 340 | void tracing_stop_function_trace(void); |
| 341 | #else | 341 | #else |
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index e90eb0c2c56c..0f85a64003d3 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c | |||
| @@ -64,7 +64,7 @@ static void function_trace_ctrl_update(struct trace_array *tr) | |||
| 64 | 64 | ||
| 65 | static struct tracer function_trace __read_mostly = | 65 | static struct tracer function_trace __read_mostly = |
| 66 | { | 66 | { |
| 67 | .name = "ftrace", | 67 | .name = "function", |
| 68 | .init = function_trace_init, | 68 | .init = function_trace_init, |
| 69 | .reset = function_trace_reset, | 69 | .reset = function_trace_reset, |
| 70 | .ctrl_update = function_trace_ctrl_update, | 70 | .ctrl_update = function_trace_ctrl_update, |
diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c index a7db7f040ae0..9c74071c10e0 100644 --- a/kernel/trace/trace_irqsoff.c +++ b/kernel/trace/trace_irqsoff.c | |||
| @@ -63,7 +63,7 @@ irq_trace(void) | |||
| 63 | */ | 63 | */ |
| 64 | static __cacheline_aligned_in_smp unsigned long max_sequence; | 64 | static __cacheline_aligned_in_smp unsigned long max_sequence; |
| 65 | 65 | ||
| 66 | #ifdef CONFIG_FTRACE | 66 | #ifdef CONFIG_FUNCTION_TRACER |
| 67 | /* | 67 | /* |
| 68 | * irqsoff uses its own tracer function to keep the overhead down: | 68 | * irqsoff uses its own tracer function to keep the overhead down: |
| 69 | */ | 69 | */ |
| @@ -104,7 +104,7 @@ static struct ftrace_ops trace_ops __read_mostly = | |||
| 104 | { | 104 | { |
| 105 | .func = irqsoff_tracer_call, | 105 | .func = irqsoff_tracer_call, |
| 106 | }; | 106 | }; |
| 107 | #endif /* CONFIG_FTRACE */ | 107 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 108 | 108 | ||
| 109 | /* | 109 | /* |
| 110 | * Should this new latency be reported/recorded? | 110 | * Should this new latency be reported/recorded? |
diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c index fe4a252c2363..3ae93f16b565 100644 --- a/kernel/trace/trace_sched_wakeup.c +++ b/kernel/trace/trace_sched_wakeup.c | |||
| @@ -31,7 +31,7 @@ static raw_spinlock_t wakeup_lock = | |||
| 31 | 31 | ||
| 32 | static void __wakeup_reset(struct trace_array *tr); | 32 | static void __wakeup_reset(struct trace_array *tr); |
| 33 | 33 | ||
| 34 | #ifdef CONFIG_FTRACE | 34 | #ifdef CONFIG_FUNCTION_TRACER |
| 35 | /* | 35 | /* |
| 36 | * irqsoff uses its own tracer function to keep the overhead down: | 36 | * irqsoff uses its own tracer function to keep the overhead down: |
| 37 | */ | 37 | */ |
| @@ -96,7 +96,7 @@ static struct ftrace_ops trace_ops __read_mostly = | |||
| 96 | { | 96 | { |
| 97 | .func = wakeup_tracer_call, | 97 | .func = wakeup_tracer_call, |
| 98 | }; | 98 | }; |
| 99 | #endif /* CONFIG_FTRACE */ | 99 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 100 | 100 | ||
| 101 | /* | 101 | /* |
| 102 | * Should this new latency be reported/recorded? | 102 | * Should this new latency be reported/recorded? |
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 09cf230d7eca..90bc752a7580 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
| @@ -70,7 +70,7 @@ static int trace_test_buffer(struct trace_array *tr, unsigned long *count) | |||
| 70 | return ret; | 70 | return ret; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | #ifdef CONFIG_FTRACE | 73 | #ifdef CONFIG_FUNCTION_TRACER |
| 74 | 74 | ||
| 75 | #ifdef CONFIG_DYNAMIC_FTRACE | 75 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 76 | 76 | ||
| @@ -99,13 +99,6 @@ int trace_selftest_startup_dynamic_tracing(struct tracer *trace, | |||
| 99 | /* passed in by parameter to fool gcc from optimizing */ | 99 | /* passed in by parameter to fool gcc from optimizing */ |
| 100 | func(); | 100 | func(); |
| 101 | 101 | ||
| 102 | /* update the records */ | ||
| 103 | ret = ftrace_force_update(); | ||
| 104 | if (ret) { | ||
| 105 | printk(KERN_CONT ".. ftraced failed .. "); | ||
| 106 | return ret; | ||
| 107 | } | ||
| 108 | |||
| 109 | /* | 102 | /* |
| 110 | * Some archs *cough*PowerPC*cough* add charachters to the | 103 | * Some archs *cough*PowerPC*cough* add charachters to the |
| 111 | * start of the function names. We simply put a '*' to | 104 | * start of the function names. We simply put a '*' to |
| @@ -183,13 +176,6 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr) | |||
| 183 | /* make sure msleep has been recorded */ | 176 | /* make sure msleep has been recorded */ |
| 184 | msleep(1); | 177 | msleep(1); |
| 185 | 178 | ||
| 186 | /* force the recorded functions to be traced */ | ||
| 187 | ret = ftrace_force_update(); | ||
| 188 | if (ret) { | ||
| 189 | printk(KERN_CONT ".. ftraced failed .. "); | ||
| 190 | return ret; | ||
| 191 | } | ||
| 192 | |||
| 193 | /* start the tracing */ | 179 | /* start the tracing */ |
| 194 | ftrace_enabled = 1; | 180 | ftrace_enabled = 1; |
| 195 | tracer_enabled = 1; | 181 | tracer_enabled = 1; |
| @@ -226,7 +212,7 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr) | |||
| 226 | 212 | ||
| 227 | return ret; | 213 | return ret; |
| 228 | } | 214 | } |
| 229 | #endif /* CONFIG_FTRACE */ | 215 | #endif /* CONFIG_FUNCTION_TRACER */ |
| 230 | 216 | ||
| 231 | #ifdef CONFIG_IRQSOFF_TRACER | 217 | #ifdef CONFIG_IRQSOFF_TRACER |
| 232 | int | 218 | int |
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index 74c5d9a3afae..be682b62fe58 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
| @@ -44,6 +44,10 @@ static inline void check_stack(void) | |||
| 44 | if (this_size <= max_stack_size) | 44 | if (this_size <= max_stack_size) |
| 45 | return; | 45 | return; |
| 46 | 46 | ||
| 47 | /* we do not handle interrupt stacks yet */ | ||
| 48 | if (!object_is_on_stack(&this_size)) | ||
| 49 | return; | ||
| 50 | |||
| 47 | raw_local_irq_save(flags); | 51 | raw_local_irq_save(flags); |
| 48 | __raw_spin_lock(&max_stack_lock); | 52 | __raw_spin_lock(&max_stack_lock); |
| 49 | 53 | ||
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index f2b7c28a4708..af8c85664882 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c | |||
| @@ -131,6 +131,9 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry, void *probe) | |||
| 131 | 131 | ||
| 132 | old = entry->funcs; | 132 | old = entry->funcs; |
| 133 | 133 | ||
| 134 | if (!old) | ||
| 135 | return NULL; | ||
| 136 | |||
| 134 | debug_print_probes(entry); | 137 | debug_print_probes(entry); |
| 135 | /* (N -> M), (N > 1, M >= 0) probes */ | 138 | /* (N -> M), (N > 1, M >= 0) probes */ |
| 136 | for (nr_probes = 0; old[nr_probes]; nr_probes++) { | 139 | for (nr_probes = 0; old[nr_probes]; nr_probes++) { |
| @@ -388,6 +391,11 @@ int tracepoint_probe_unregister(const char *name, void *probe) | |||
| 388 | if (entry->rcu_pending) | 391 | if (entry->rcu_pending) |
| 389 | rcu_barrier_sched(); | 392 | rcu_barrier_sched(); |
| 390 | old = tracepoint_entry_remove_probe(entry, probe); | 393 | old = tracepoint_entry_remove_probe(entry, probe); |
| 394 | if (!old) { | ||
| 395 | printk(KERN_WARNING "Warning: Trying to unregister a probe" | ||
| 396 | "that doesn't exist\n"); | ||
| 397 | goto end; | ||
| 398 | } | ||
| 391 | mutex_unlock(&tracepoints_mutex); | 399 | mutex_unlock(&tracepoints_mutex); |
| 392 | tracepoint_update_probes(); /* may update entry */ | 400 | tracepoint_update_probes(); /* may update entry */ |
| 393 | mutex_lock(&tracepoints_mutex); | 401 | mutex_lock(&tracepoints_mutex); |
diff --git a/lib/Makefile b/lib/Makefile index 16feaab057b2..7cb65d85aeb0 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Makefile for some libs needed in the kernel. | 2 | # Makefile for some libs needed in the kernel. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | ifdef CONFIG_FTRACE | 5 | ifdef CONFIG_FUNCTION_TRACER |
| 6 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 6 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| 7 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) | 7 | KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) |
| 8 | endif | 8 | endif |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index f8eebd489149..78330c37a61b 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
| @@ -497,8 +497,10 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
| 497 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", | 497 | printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n", |
| 498 | (unsigned long long)*hwdev->dma_mask, | 498 | (unsigned long long)*hwdev->dma_mask, |
| 499 | (unsigned long long)dev_addr); | 499 | (unsigned long long)dev_addr); |
| 500 | panic("swiotlb_alloc_coherent: allocated memory is out of " | 500 | |
| 501 | "range for device"); | 501 | /* DMA_TO_DEVICE to avoid memcpy in unmap_single */ |
| 502 | unmap_single(hwdev, ret, size, DMA_TO_DEVICE); | ||
| 503 | return NULL; | ||
| 502 | } | 504 | } |
| 503 | *dma_handle = dev_addr; | 505 | *dma_handle = dev_addr; |
| 504 | return ret; | 506 | return ret; |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index e4c5ac9fe89b..ba85d8831893 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -2279,6 +2279,11 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, | |||
| 2279 | } | 2279 | } |
| 2280 | 2280 | ||
| 2281 | memset(&opts, 0, sizeof(opts)); | 2281 | memset(&opts, 0, sizeof(opts)); |
| 2282 | #ifdef CONFIG_SYN_COOKIES | ||
| 2283 | if (unlikely(req->cookie_ts)) | ||
| 2284 | TCP_SKB_CB(skb)->when = cookie_init_timestamp(req); | ||
| 2285 | else | ||
| 2286 | #endif | ||
| 2282 | TCP_SKB_CB(skb)->when = tcp_time_stamp; | 2287 | TCP_SKB_CB(skb)->when = tcp_time_stamp; |
| 2283 | tcp_header_size = tcp_synack_options(sk, req, mss, | 2288 | tcp_header_size = tcp_synack_options(sk, req, mss, |
| 2284 | skb, &opts, &md5) + | 2289 | skb, &opts, &md5) + |
| @@ -2304,11 +2309,6 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, | |||
| 2304 | 2309 | ||
| 2305 | /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */ | 2310 | /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */ |
| 2306 | th->window = htons(min(req->rcv_wnd, 65535U)); | 2311 | th->window = htons(min(req->rcv_wnd, 65535U)); |
| 2307 | #ifdef CONFIG_SYN_COOKIES | ||
| 2308 | if (unlikely(req->cookie_ts)) | ||
| 2309 | TCP_SKB_CB(skb)->when = cookie_init_timestamp(req); | ||
| 2310 | else | ||
| 2311 | #endif | ||
| 2312 | tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location); | 2312 | tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location); |
| 2313 | th->doff = (tcp_header_size >> 2); | 2313 | th->doff = (tcp_header_size >> 2); |
| 2314 | TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS); | 2314 | TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS); |
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index b9d97effebe3..defeb7a0d502 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
| @@ -261,6 +261,8 @@ static inline int can_respond(struct sk_buff *skb) | |||
| 261 | return 0; /* we are not the destination */ | 261 | return 0; /* we are not the destination */ |
| 262 | if (ph->pn_res == PN_PREFIX && !pskb_may_pull(skb, 5)) | 262 | if (ph->pn_res == PN_PREFIX && !pskb_may_pull(skb, 5)) |
| 263 | return 0; | 263 | return 0; |
| 264 | if (ph->pn_res == PN_COMMGR) /* indications */ | ||
| 265 | return 0; | ||
| 264 | 266 | ||
| 265 | ph = pn_hdr(skb); /* re-acquires the pointer */ | 267 | ph = pn_hdr(skb); /* re-acquires the pointer */ |
| 266 | pm = pn_msg(skb); | 268 | pm = pn_msg(skb); |
| @@ -309,7 +311,8 @@ static int send_reset_indications(struct sk_buff *rskb) | |||
| 309 | 311 | ||
| 310 | return pn_raw_send(data, sizeof(data), rskb->dev, | 312 | return pn_raw_send(data, sizeof(data), rskb->dev, |
| 311 | pn_object(oph->pn_sdev, 0x00), | 313 | pn_object(oph->pn_sdev, 0x00), |
| 312 | pn_object(oph->pn_rdev, oph->pn_robj), 0x10); | 314 | pn_object(oph->pn_rdev, oph->pn_robj), |
| 315 | PN_COMMGR); | ||
| 313 | } | 316 | } |
| 314 | 317 | ||
| 315 | 318 | ||
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 5ed4cbf1e0e1..468fbc9016c7 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build | |||
| @@ -198,10 +198,16 @@ cmd_modversions = \ | |||
| 198 | fi; | 198 | fi; |
| 199 | endif | 199 | endif |
| 200 | 200 | ||
| 201 | ifdef CONFIG_64BIT | ||
| 202 | arch_bits = 64 | ||
| 203 | else | ||
| 204 | arch_bits = 32 | ||
| 205 | endif | ||
| 206 | |||
| 201 | ifdef CONFIG_FTRACE_MCOUNT_RECORD | 207 | ifdef CONFIG_FTRACE_MCOUNT_RECORD |
| 202 | cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl \ | 208 | cmd_record_mcount = perl $(srctree)/scripts/recordmcount.pl \ |
| 203 | "$(ARCH)" "$(OBJDUMP)" "$(OBJCOPY)" "$(CC)" "$(LD)" "$(NM)" "$(RM)" \ | 209 | "$(ARCH)" "$(arch_bits)" "$(OBJDUMP)" "$(OBJCOPY)" "$(CC)" "$(LD)" \ |
| 204 | "$(MV)" "$(@)"; | 210 | "$(NM)" "$(RM)" "$(MV)" "$(@)"; |
| 205 | endif | 211 | endif |
| 206 | 212 | ||
| 207 | define rule_cc_o_c | 213 | define rule_cc_o_c |
diff --git a/scripts/bootgraph.pl b/scripts/bootgraph.pl index 5e7316e5aa39..d2c61efc216f 100644 --- a/scripts/bootgraph.pl +++ b/scripts/bootgraph.pl | |||
| @@ -37,7 +37,10 @@ | |||
| 37 | # dmesg | perl scripts/bootgraph.pl > output.svg | 37 | # dmesg | perl scripts/bootgraph.pl > output.svg |
| 38 | # | 38 | # |
| 39 | 39 | ||
| 40 | my %start, %end; | 40 | use strict; |
| 41 | |||
| 42 | my %start; | ||
| 43 | my %end; | ||
| 41 | my $done = 0; | 44 | my $done = 0; |
| 42 | my $maxtime = 0; | 45 | my $maxtime = 0; |
| 43 | my $firsttime = 100; | 46 | my $firsttime = 100; |
| @@ -105,18 +108,20 @@ my $threshold = ($maxtime - $firsttime) / 60.0; | |||
| 105 | my $stylecounter = 0; | 108 | my $stylecounter = 0; |
| 106 | my %rows; | 109 | my %rows; |
| 107 | my $rowscount = 1; | 110 | my $rowscount = 1; |
| 108 | while (($key,$value) = each %start) { | 111 | my @initcalls = sort { $start{$a} <=> $start{$b} } keys(%start); |
| 112 | my $key; | ||
| 113 | foreach $key (@initcalls) { | ||
| 109 | my $duration = $end{$key} - $start{$key}; | 114 | my $duration = $end{$key} - $start{$key}; |
| 110 | 115 | ||
| 111 | if ($duration >= $threshold) { | 116 | if ($duration >= $threshold) { |
| 112 | my $s, $s2, $e, $y; | 117 | my ($s, $s2, $e, $w, $y, $y2, $style); |
| 113 | $pid = $pids{$key}; | 118 | my $pid = $pids{$key}; |
| 114 | 119 | ||
| 115 | if (!defined($rows{$pid})) { | 120 | if (!defined($rows{$pid})) { |
| 116 | $rows{$pid} = $rowscount; | 121 | $rows{$pid} = $rowscount; |
| 117 | $rowscount = $rowscount + 1; | 122 | $rowscount = $rowscount + 1; |
| 118 | } | 123 | } |
| 119 | $s = ($value - $firsttime) * $mult; | 124 | $s = ($start{$key} - $firsttime) * $mult; |
| 120 | $s2 = $s + 6; | 125 | $s2 = $s + 6; |
| 121 | $e = ($end{$key} - $firsttime) * $mult; | 126 | $e = ($end{$key} - $firsttime) * $mult; |
| 122 | $w = $e - $s; | 127 | $w = $e - $s; |
| @@ -140,9 +145,9 @@ while (($key,$value) = each %start) { | |||
| 140 | my $time = $firsttime; | 145 | my $time = $firsttime; |
| 141 | my $step = ($maxtime - $firsttime) / 15; | 146 | my $step = ($maxtime - $firsttime) / 15; |
| 142 | while ($time < $maxtime) { | 147 | while ($time < $maxtime) { |
| 143 | my $s2 = ($time - $firsttime) * $mult; | 148 | my $s3 = ($time - $firsttime) * $mult; |
| 144 | my $tm = int($time * 100) / 100.0; | 149 | my $tm = int($time * 100) / 100.0; |
| 145 | print "<text transform=\"translate($s2,89) rotate(90)\">$tm</text>\n"; | 150 | print "<text transform=\"translate($s3,89) rotate(90)\">$tm</text>\n"; |
| 146 | $time = $time + $step; | 151 | $time = $time + $step; |
| 147 | } | 152 | } |
| 148 | 153 | ||
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index f56d760bd589..6b9fe3eb8360 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl | |||
| @@ -106,7 +106,13 @@ if ($#ARGV < 6) { | |||
| 106 | exit(1); | 106 | exit(1); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | my ($arch, $objdump, $objcopy, $cc, $ld, $nm, $rm, $mv, $inputfile) = @ARGV; | 109 | my ($arch, $bits, $objdump, $objcopy, $cc, |
| 110 | $ld, $nm, $rm, $mv, $inputfile) = @ARGV; | ||
| 111 | |||
| 112 | # Acceptable sections to record. | ||
| 113 | my %text_sections = ( | ||
| 114 | ".text" => 1, | ||
| 115 | ); | ||
| 110 | 116 | ||
| 111 | $objdump = "objdump" if ((length $objdump) == 0); | 117 | $objdump = "objdump" if ((length $objdump) == 0); |
| 112 | $objcopy = "objcopy" if ((length $objcopy) == 0); | 118 | $objcopy = "objcopy" if ((length $objcopy) == 0); |
| @@ -129,8 +135,16 @@ my $function_regex; # Find the name of a function | |||
| 129 | # (return offset and func name) | 135 | # (return offset and func name) |
| 130 | my $mcount_regex; # Find the call site to mcount (return offset) | 136 | my $mcount_regex; # Find the call site to mcount (return offset) |
| 131 | 137 | ||
| 138 | if ($arch eq "x86") { | ||
| 139 | if ($bits == 64) { | ||
| 140 | $arch = "x86_64"; | ||
| 141 | } else { | ||
| 142 | $arch = "i386"; | ||
| 143 | } | ||
| 144 | } | ||
| 145 | |||
| 132 | if ($arch eq "x86_64") { | 146 | if ($arch eq "x86_64") { |
| 133 | $section_regex = "Disassembly of section"; | 147 | $section_regex = "Disassembly of section\\s+(\\S+):"; |
| 134 | $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; | 148 | $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; |
| 135 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$"; | 149 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$"; |
| 136 | $type = ".quad"; | 150 | $type = ".quad"; |
| @@ -142,7 +156,7 @@ if ($arch eq "x86_64") { | |||
| 142 | $cc .= " -m64"; | 156 | $cc .= " -m64"; |
| 143 | 157 | ||
| 144 | } elsif ($arch eq "i386") { | 158 | } elsif ($arch eq "i386") { |
| 145 | $section_regex = "Disassembly of section"; | 159 | $section_regex = "Disassembly of section\\s+(\\S+):"; |
| 146 | $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; | 160 | $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; |
| 147 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$"; | 161 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$"; |
| 148 | $type = ".long"; | 162 | $type = ".long"; |
| @@ -289,7 +303,13 @@ my $text; | |||
| 289 | while (<IN>) { | 303 | while (<IN>) { |
| 290 | # is it a section? | 304 | # is it a section? |
| 291 | if (/$section_regex/) { | 305 | if (/$section_regex/) { |
| 292 | $read_function = 1; | 306 | |
| 307 | # Only record text sections that we know are safe | ||
| 308 | if (defined($text_sections{$1})) { | ||
| 309 | $read_function = 1; | ||
| 310 | } else { | ||
| 311 | $read_function = 0; | ||
| 312 | } | ||
| 293 | # print out any recorded offsets | 313 | # print out any recorded offsets |
| 294 | update_funcs() if ($text_found); | 314 | update_funcs() if ($text_found); |
| 295 | 315 | ||
diff --git a/sound/oss/kahlua.c b/sound/oss/kahlua.c index eb9bc365530d..c180598f1710 100644 --- a/sound/oss/kahlua.c +++ b/sound/oss/kahlua.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Initialisation code for Cyrix/NatSemi VSA1 softaudio | 2 | * Initialisation code for Cyrix/NatSemi VSA1 softaudio |
| 3 | * | 3 | * |
| 4 | * (C) Copyright 2003 Red Hat Inc <alan@redhat.com> | 4 | * (C) Copyright 2003 Red Hat Inc <alan@lxorguk.ukuu.org.uk> |
| 5 | * | 5 | * |
| 6 | * XpressAudio(tm) is used on the Cyrix MediaGX (now NatSemi Geode) systems. | 6 | * XpressAudio(tm) is used on the Cyrix MediaGX (now NatSemi Geode) systems. |
| 7 | * The older version (VSA1) provides fairly good soundblaster emulation | 7 | * The older version (VSA1) provides fairly good soundblaster emulation |
diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c index 92f3a976ef2e..a7f38e63303f 100644 --- a/sound/pci/ad1889.c +++ b/sound/pci/ad1889.c | |||
| @@ -932,7 +932,7 @@ snd_ad1889_create(struct snd_card *card, | |||
| 932 | goto free_and_ret; | 932 | goto free_and_ret; |
| 933 | 933 | ||
| 934 | chip->bar = pci_resource_start(pci, 0); | 934 | chip->bar = pci_resource_start(pci, 0); |
| 935 | chip->iobase = ioremap_nocache(chip->bar, pci_resource_len(pci, 0)); | 935 | chip->iobase = pci_ioremap_bar(pci, 0); |
| 936 | if (chip->iobase == NULL) { | 936 | if (chip->iobase == NULL) { |
| 937 | printk(KERN_ERR PFX "unable to reserve region.\n"); | 937 | printk(KERN_ERR PFX "unable to reserve region.\n"); |
| 938 | err = -EBUSY; | 938 | err = -EBUSY; |
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index 085a52b8c807..226fe8237d31 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c | |||
| @@ -1609,7 +1609,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, | |||
| 1609 | return err; | 1609 | return err; |
| 1610 | } | 1610 | } |
| 1611 | chip->addr = pci_resource_start(pci, 0); | 1611 | chip->addr = pci_resource_start(pci, 0); |
| 1612 | chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci, 0)); | 1612 | chip->remap_addr = pci_ioremap_bar(pci, 0); |
| 1613 | if (chip->remap_addr == NULL) { | 1613 | if (chip->remap_addr == NULL) { |
| 1614 | snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); | 1614 | snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); |
| 1615 | snd_atiixp_free(chip); | 1615 | snd_atiixp_free(chip); |
diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c index 2f106306c7fe..0e6e5cc1c501 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c | |||
| @@ -1252,7 +1252,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card, | |||
| 1252 | return err; | 1252 | return err; |
| 1253 | } | 1253 | } |
| 1254 | chip->addr = pci_resource_start(pci, 0); | 1254 | chip->addr = pci_resource_start(pci, 0); |
| 1255 | chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci, 0)); | 1255 | chip->remap_addr = pci_ioremap_bar(pci, 0); |
| 1256 | if (chip->remap_addr == NULL) { | 1256 | if (chip->remap_addr == NULL) { |
| 1257 | snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); | 1257 | snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); |
| 1258 | snd_atiixp_free(chip); | 1258 | snd_atiixp_free(chip); |
diff --git a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c index 68368e490074..a36d4d1fd419 100644 --- a/sound/pci/au88x0/au88x0.c +++ b/sound/pci/au88x0/au88x0.c | |||
| @@ -180,8 +180,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip) | |||
| 180 | if ((err = pci_request_regions(pci, CARD_NAME_SHORT)) != 0) | 180 | if ((err = pci_request_regions(pci, CARD_NAME_SHORT)) != 0) |
| 181 | goto regions_out; | 181 | goto regions_out; |
| 182 | 182 | ||
| 183 | chip->mmio = ioremap_nocache(pci_resource_start(pci, 0), | 183 | chip->mmio = pci_ioremap_bar(pci, 0); |
| 184 | pci_resource_len(pci, 0)); | ||
| 185 | if (!chip->mmio) { | 184 | if (!chip->mmio) { |
| 186 | printk(KERN_ERR "MMIO area remap failed.\n"); | 185 | printk(KERN_ERR "MMIO area remap failed.\n"); |
| 187 | err = -ENOMEM; | 186 | err = -ENOMEM; |
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 3aa8d973540a..1aa1c0402540 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c | |||
| @@ -749,8 +749,7 @@ static int __devinit snd_bt87x_create(struct snd_card *card, | |||
| 749 | pci_disable_device(pci); | 749 | pci_disable_device(pci); |
| 750 | return err; | 750 | return err; |
| 751 | } | 751 | } |
| 752 | chip->mmio = ioremap_nocache(pci_resource_start(pci, 0), | 752 | chip->mmio = pci_ioremap_bar(pci, 0); |
| 753 | pci_resource_len(pci, 0)); | ||
| 754 | if (!chip->mmio) { | 753 | if (!chip->mmio) { |
| 755 | snd_printk(KERN_ERR "cannot remap io memory\n"); | 754 | snd_printk(KERN_ERR "cannot remap io memory\n"); |
| 756 | err = -ENOMEM; | 755 | err = -ENOMEM; |
diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index ef9308f7c45b..192e7842e181 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c | |||
| @@ -1382,8 +1382,8 @@ static int __devinit snd_cs4281_create(struct snd_card *card, | |||
| 1382 | chip->ba0_addr = pci_resource_start(pci, 0); | 1382 | chip->ba0_addr = pci_resource_start(pci, 0); |
| 1383 | chip->ba1_addr = pci_resource_start(pci, 1); | 1383 | chip->ba1_addr = pci_resource_start(pci, 1); |
| 1384 | 1384 | ||
| 1385 | chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); | 1385 | chip->ba0 = pci_ioremap_bar(pci, 0); |
| 1386 | chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); | 1386 | chip->ba1 = pci_ioremap_bar(pci, 1); |
| 1387 | if (!chip->ba0 || !chip->ba1) { | 1387 | if (!chip->ba0 || !chip->ba1) { |
| 1388 | snd_cs4281_free(chip); | 1388 | snd_cs4281_free(chip); |
| 1389 | return -ENOMEM; | 1389 | return -ENOMEM; |
diff --git a/sound/pci/cs5530.c b/sound/pci/cs5530.c index 7ff8b68e997e..6dea5b5cc774 100644 --- a/sound/pci/cs5530.c +++ b/sound/pci/cs5530.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * cs5530.c - Initialisation code for Cyrix/NatSemi VSA1 softaudio | 2 | * cs5530.c - Initialisation code for Cyrix/NatSemi VSA1 softaudio |
| 3 | * | 3 | * |
| 4 | * (C) Copyright 2007 Ash Willis <ashwillis@programmer.net> | 4 | * (C) Copyright 2007 Ash Willis <ashwillis@programmer.net> |
| 5 | * (C) Copyright 2003 Red Hat Inc <alan@redhat.com> | 5 | * (C) Copyright 2003 Red Hat Inc <alan@lxorguk.ukuu.org.uk> |
| 6 | * | 6 | * |
| 7 | * This driver was ported (shamelessly ripped ;) from oss/kahlua.c but I did | 7 | * This driver was ported (shamelessly ripped ;) from oss/kahlua.c but I did |
| 8 | * mess with it a bit. The chip seems to have to have trouble with full duplex | 8 | * mess with it a bit. The chip seems to have to have trouble with full duplex |
| @@ -132,7 +132,7 @@ static int __devinit snd_cs5530_create(struct snd_card *card, | |||
| 132 | } | 132 | } |
| 133 | chip->pci_base = pci_resource_start(pci, 0); | 133 | chip->pci_base = pci_resource_start(pci, 0); |
| 134 | 134 | ||
| 135 | mem = ioremap_nocache(chip->pci_base, pci_resource_len(pci, 0)); | 135 | mem = pci_ioremap_bar(pci, 0); |
| 136 | if (mem == NULL) { | 136 | if (mem == NULL) { |
| 137 | kfree(chip); | 137 | kfree(chip); |
| 138 | pci_disable_device(pci); | 138 | pci_disable_device(pci); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 9f316c1b2790..f080f8ce0ecb 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -2158,7 +2158,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
| 2158 | } | 2158 | } |
| 2159 | 2159 | ||
| 2160 | chip->addr = pci_resource_start(pci, 0); | 2160 | chip->addr = pci_resource_start(pci, 0); |
| 2161 | chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci,0)); | 2161 | chip->remap_addr = pci_ioremap_bar(pci, 0); |
| 2162 | if (chip->remap_addr == NULL) { | 2162 | if (chip->remap_addr == NULL) { |
| 2163 | snd_printk(KERN_ERR SFX "ioremap error\n"); | 2163 | snd_printk(KERN_ERR SFX "ioremap error\n"); |
| 2164 | err = -ENXIO; | 2164 | err = -ENXIO; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index ef4955c73c88..4eceab9bd109 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -307,6 +307,13 @@ struct alc_spec { | |||
| 307 | /* for PLL fix */ | 307 | /* for PLL fix */ |
| 308 | hda_nid_t pll_nid; | 308 | hda_nid_t pll_nid; |
| 309 | unsigned int pll_coef_idx, pll_coef_bit; | 309 | unsigned int pll_coef_idx, pll_coef_bit; |
| 310 | |||
| 311 | #ifdef SND_HDA_NEEDS_RESUME | ||
| 312 | #define ALC_MAX_PINS 16 | ||
| 313 | unsigned int num_pins; | ||
| 314 | hda_nid_t pin_nids[ALC_MAX_PINS]; | ||
| 315 | unsigned int pin_cfgs[ALC_MAX_PINS]; | ||
| 316 | #endif | ||
| 310 | }; | 317 | }; |
| 311 | 318 | ||
| 312 | /* | 319 | /* |
| @@ -2778,6 +2785,64 @@ static void alc_free(struct hda_codec *codec) | |||
| 2778 | codec->spec = NULL; /* to be sure */ | 2785 | codec->spec = NULL; /* to be sure */ |
| 2779 | } | 2786 | } |
| 2780 | 2787 | ||
| 2788 | #ifdef SND_HDA_NEEDS_RESUME | ||
| 2789 | static void store_pin_configs(struct hda_codec *codec) | ||
| 2790 | { | ||
| 2791 | struct alc_spec *spec = codec->spec; | ||
| 2792 | hda_nid_t nid, end_nid; | ||
| 2793 | |||
| 2794 | end_nid = codec->start_nid + codec->num_nodes; | ||
| 2795 | for (nid = codec->start_nid; nid < end_nid; nid++) { | ||
| 2796 | unsigned int wid_caps = get_wcaps(codec, nid); | ||
| 2797 | unsigned int wid_type = | ||
| 2798 | (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; | ||
| 2799 | if (wid_type != AC_WID_PIN) | ||
| 2800 | continue; | ||
| 2801 | if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids)) | ||
| 2802 | break; | ||
| 2803 | spec->pin_nids[spec->num_pins] = nid; | ||
| 2804 | spec->pin_cfgs[spec->num_pins] = | ||
| 2805 | snd_hda_codec_read(codec, nid, 0, | ||
| 2806 | AC_VERB_GET_CONFIG_DEFAULT, 0); | ||
| 2807 | spec->num_pins++; | ||
| 2808 | } | ||
| 2809 | } | ||
| 2810 | |||
| 2811 | static void resume_pin_configs(struct hda_codec *codec) | ||
| 2812 | { | ||
| 2813 | struct alc_spec *spec = codec->spec; | ||
| 2814 | int i; | ||
| 2815 | |||
| 2816 | for (i = 0; i < spec->num_pins; i++) { | ||
| 2817 | hda_nid_t pin_nid = spec->pin_nids[i]; | ||
| 2818 | unsigned int pin_config = spec->pin_cfgs[i]; | ||
| 2819 | snd_hda_codec_write(codec, pin_nid, 0, | ||
| 2820 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_0, | ||
| 2821 | pin_config & 0x000000ff); | ||
| 2822 | snd_hda_codec_write(codec, pin_nid, 0, | ||
| 2823 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, | ||
| 2824 | (pin_config & 0x0000ff00) >> 8); | ||
| 2825 | snd_hda_codec_write(codec, pin_nid, 0, | ||
| 2826 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, | ||
| 2827 | (pin_config & 0x00ff0000) >> 16); | ||
| 2828 | snd_hda_codec_write(codec, pin_nid, 0, | ||
| 2829 | AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, | ||
| 2830 | pin_config >> 24); | ||
| 2831 | } | ||
| 2832 | } | ||
| 2833 | |||
| 2834 | static int alc_resume(struct hda_codec *codec) | ||
| 2835 | { | ||
| 2836 | resume_pin_configs(codec); | ||
| 2837 | codec->patch_ops.init(codec); | ||
| 2838 | snd_hda_codec_resume_amp(codec); | ||
| 2839 | snd_hda_codec_resume_cache(codec); | ||
| 2840 | return 0; | ||
| 2841 | } | ||
| 2842 | #else | ||
| 2843 | #define store_pin_configs(codec) | ||
| 2844 | #endif | ||
| 2845 | |||
| 2781 | /* | 2846 | /* |
| 2782 | */ | 2847 | */ |
| 2783 | static struct hda_codec_ops alc_patch_ops = { | 2848 | static struct hda_codec_ops alc_patch_ops = { |
| @@ -2786,6 +2851,9 @@ static struct hda_codec_ops alc_patch_ops = { | |||
| 2786 | .init = alc_init, | 2851 | .init = alc_init, |
| 2787 | .free = alc_free, | 2852 | .free = alc_free, |
| 2788 | .unsol_event = alc_unsol_event, | 2853 | .unsol_event = alc_unsol_event, |
| 2854 | #ifdef SND_HDA_NEEDS_RESUME | ||
| 2855 | .resume = alc_resume, | ||
| 2856 | #endif | ||
| 2789 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 2857 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 2790 | .check_power_status = alc_check_power_status, | 2858 | .check_power_status = alc_check_power_status, |
| 2791 | #endif | 2859 | #endif |
| @@ -3832,6 +3900,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec) | |||
| 3832 | spec->num_mux_defs = 1; | 3900 | spec->num_mux_defs = 1; |
| 3833 | spec->input_mux = &spec->private_imux; | 3901 | spec->input_mux = &spec->private_imux; |
| 3834 | 3902 | ||
| 3903 | store_pin_configs(codec); | ||
| 3835 | return 1; | 3904 | return 1; |
| 3836 | } | 3905 | } |
| 3837 | 3906 | ||
| @@ -5250,6 +5319,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec) | |||
| 5250 | } | 5319 | } |
| 5251 | spec->num_mixers++; | 5320 | spec->num_mixers++; |
| 5252 | 5321 | ||
| 5322 | store_pin_configs(codec); | ||
| 5253 | return 1; | 5323 | return 1; |
| 5254 | } | 5324 | } |
| 5255 | 5325 | ||
| @@ -10313,6 +10383,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
| 10313 | if (err < 0) | 10383 | if (err < 0) |
| 10314 | return err; | 10384 | return err; |
| 10315 | 10385 | ||
| 10386 | store_pin_configs(codec); | ||
| 10316 | return 1; | 10387 | return 1; |
| 10317 | } | 10388 | } |
| 10318 | 10389 | ||
| @@ -11447,6 +11518,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec) | |||
| 11447 | if (err < 0) | 11518 | if (err < 0) |
| 11448 | return err; | 11519 | return err; |
| 11449 | 11520 | ||
| 11521 | store_pin_configs(codec); | ||
| 11450 | return 1; | 11522 | return 1; |
| 11451 | } | 11523 | } |
| 11452 | 11524 | ||
| @@ -12230,6 +12302,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
| 12230 | spec->mixers[spec->num_mixers] = alc269_capture_mixer; | 12302 | spec->mixers[spec->num_mixers] = alc269_capture_mixer; |
| 12231 | spec->num_mixers++; | 12303 | spec->num_mixers++; |
| 12232 | 12304 | ||
| 12305 | store_pin_configs(codec); | ||
| 12233 | return 1; | 12306 | return 1; |
| 12234 | } | 12307 | } |
| 12235 | 12308 | ||
| @@ -13316,6 +13389,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec) | |||
| 13316 | spec->mixers[spec->num_mixers] = alc861_capture_mixer; | 13389 | spec->mixers[spec->num_mixers] = alc861_capture_mixer; |
| 13317 | spec->num_mixers++; | 13390 | spec->num_mixers++; |
| 13318 | 13391 | ||
| 13392 | store_pin_configs(codec); | ||
| 13319 | return 1; | 13393 | return 1; |
| 13320 | } | 13394 | } |
| 13321 | 13395 | ||
| @@ -14427,6 +14501,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) | |||
| 14427 | if (err < 0) | 14501 | if (err < 0) |
| 14428 | return err; | 14502 | return err; |
| 14429 | 14503 | ||
| 14504 | store_pin_configs(codec); | ||
| 14430 | return 1; | 14505 | return 1; |
| 14431 | } | 14506 | } |
| 14432 | 14507 | ||
| @@ -16258,6 +16333,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 16258 | 16333 | ||
| 16259 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; | 16334 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; |
| 16260 | spec->num_mixers++; | 16335 | spec->num_mixers++; |
| 16336 | |||
| 16337 | store_pin_configs(codec); | ||
| 16261 | return 1; | 16338 | return 1; |
| 16262 | } | 16339 | } |
| 16263 | 16340 | ||
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index 2d0dce649a64..ae7601f353a7 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c | |||
| @@ -1314,8 +1314,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci, | |||
| 1314 | } | 1314 | } |
| 1315 | for (i = 0; i < 2; i++) { | 1315 | for (i = 0; i < 2; i++) { |
| 1316 | mgr->mem[i].phys = pci_resource_start(pci, i); | 1316 | mgr->mem[i].phys = pci_resource_start(pci, i); |
| 1317 | mgr->mem[i].virt = ioremap_nocache(mgr->mem[i].phys, | 1317 | mgr->mem[i].virt = pci_ioremap_bar(pci, i); |
| 1318 | pci_resource_len(pci, i)); | ||
| 1319 | if (!mgr->mem[i].virt) { | 1318 | if (!mgr->mem[i].virt) { |
| 1320 | printk(KERN_ERR "unable to remap resource 0x%lx\n", | 1319 | printk(KERN_ERR "unable to remap resource 0x%lx\n", |
| 1321 | mgr->mem[i].phys); | 1320 | mgr->mem[i].phys); |
diff --git a/sound/soc/blackfin/bf5xx-i2s.c b/sound/soc/blackfin/bf5xx-i2s.c index 827587f08180..e020c160ee44 100644 --- a/sound/soc/blackfin/bf5xx-i2s.c +++ b/sound/soc/blackfin/bf5xx-i2s.c | |||
| @@ -70,12 +70,24 @@ static struct sport_param sport_params[2] = { | |||
| 70 | } | 70 | } |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| 73 | static u16 sport_req[][7] = { | 73 | /* |
| 74 | { P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, | 74 | * Setting the TFS pin selector for SPORT 0 based on whether the selected |
| 75 | P_SPORT0_DRPRI, P_SPORT0_RSCLK, 0}, | 75 | * port id F or G. If the port is F then no conflict should exist for the |
| 76 | { P_SPORT1_DTPRI, P_SPORT1_TSCLK, P_SPORT1_RFS, | 76 | * TFS. When Port G is selected and EMAC then there is a conflict between |
| 77 | P_SPORT1_DRPRI, P_SPORT1_RSCLK, 0}, | 77 | * the PHY interrupt line and TFS. Current settings prevent the conflict |
| 78 | }; | 78 | * by ignoring the TFS pin when Port G is selected. This allows both |
| 79 | * ssm2602 using Port G and EMAC concurrently. | ||
| 80 | */ | ||
| 81 | #ifdef CONFIG_BF527_SPORT0_PORTF | ||
| 82 | #define LOCAL_SPORT0_TFS (P_SPORT0_TFS) | ||
| 83 | #else | ||
| 84 | #define LOCAL_SPORT0_TFS (0) | ||
| 85 | #endif | ||
| 86 | |||
| 87 | static u16 sport_req[][7] = { {P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, | ||
| 88 | P_SPORT0_DRPRI, P_SPORT0_RSCLK, LOCAL_SPORT0_TFS, 0}, | ||
| 89 | {P_SPORT1_DTPRI, P_SPORT1_TSCLK, P_SPORT1_RFS, P_SPORT1_DRPRI, | ||
| 90 | P_SPORT1_RSCLK, P_SPORT1_TFS, 0} }; | ||
| 79 | 91 | ||
| 80 | static int bf5xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, | 92 | static int bf5xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, |
| 81 | unsigned int fmt) | 93 | unsigned int fmt) |
| @@ -98,23 +110,21 @@ static int bf5xx_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 98 | ret = -EINVAL; | 110 | ret = -EINVAL; |
| 99 | break; | 111 | break; |
| 100 | default: | 112 | default: |
| 113 | printk(KERN_ERR "%s: Unknown DAI format type\n", __func__); | ||
| 101 | ret = -EINVAL; | 114 | ret = -EINVAL; |
| 102 | break; | 115 | break; |
| 103 | } | 116 | } |
| 104 | 117 | ||
| 105 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 118 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
| 106 | case SND_SOC_DAIFMT_CBS_CFS: | ||
| 107 | ret = -EINVAL; | ||
| 108 | break; | ||
| 109 | case SND_SOC_DAIFMT_CBM_CFS: | ||
| 110 | ret = -EINVAL; | ||
| 111 | break; | ||
| 112 | case SND_SOC_DAIFMT_CBM_CFM: | 119 | case SND_SOC_DAIFMT_CBM_CFM: |
| 113 | break; | 120 | break; |
| 121 | case SND_SOC_DAIFMT_CBS_CFS: | ||
| 122 | case SND_SOC_DAIFMT_CBM_CFS: | ||
| 114 | case SND_SOC_DAIFMT_CBS_CFM: | 123 | case SND_SOC_DAIFMT_CBS_CFM: |
| 115 | ret = -EINVAL; | 124 | ret = -EINVAL; |
| 116 | break; | 125 | break; |
| 117 | default: | 126 | default: |
| 127 | printk(KERN_ERR "%s: Unknown DAI master type\n", __func__); | ||
| 118 | ret = -EINVAL; | 128 | ret = -EINVAL; |
| 119 | break; | 129 | break; |
| 120 | } | 130 | } |
diff --git a/sound/sound_core.c b/sound/sound_core.c index faef87a9bc3f..a75b289a5d78 100644 --- a/sound/sound_core.c +++ b/sound/sound_core.c | |||
| @@ -57,7 +57,7 @@ module_exit(cleanup_soundcore); | |||
| 57 | /* | 57 | /* |
| 58 | * OSS sound core handling. Breaks out sound functions to submodules | 58 | * OSS sound core handling. Breaks out sound functions to submodules |
| 59 | * | 59 | * |
| 60 | * Author: Alan Cox <alan.cox@linux.org> | 60 | * Author: Alan Cox <alan@lxorguk.ukuu.org.uk> |
| 61 | * | 61 | * |
| 62 | * Fixes: | 62 | * Fixes: |
| 63 | * | 63 | * |
diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c index d0169f5e6047..55ad76ee2d09 100644 --- a/virt/kvm/irq_comm.c +++ b/virt/kvm/irq_comm.c | |||
| @@ -25,15 +25,23 @@ | |||
| 25 | #include "ioapic.h" | 25 | #include "ioapic.h" |
| 26 | 26 | ||
| 27 | /* This should be called with the kvm->lock mutex held */ | 27 | /* This should be called with the kvm->lock mutex held */ |
| 28 | void kvm_set_irq(struct kvm *kvm, int irq, int level) | 28 | void kvm_set_irq(struct kvm *kvm, int irq_source_id, int irq, int level) |
| 29 | { | 29 | { |
| 30 | unsigned long *irq_state = (unsigned long *)&kvm->arch.irq_states[irq]; | ||
| 31 | |||
| 32 | /* Logical OR for level trig interrupt */ | ||
| 33 | if (level) | ||
| 34 | set_bit(irq_source_id, irq_state); | ||
| 35 | else | ||
| 36 | clear_bit(irq_source_id, irq_state); | ||
| 37 | |||
| 30 | /* Not possible to detect if the guest uses the PIC or the | 38 | /* Not possible to detect if the guest uses the PIC or the |
| 31 | * IOAPIC. So set the bit in both. The guest will ignore | 39 | * IOAPIC. So set the bit in both. The guest will ignore |
| 32 | * writes to the unused one. | 40 | * writes to the unused one. |
| 33 | */ | 41 | */ |
| 34 | kvm_ioapic_set_irq(kvm->arch.vioapic, irq, level); | 42 | kvm_ioapic_set_irq(kvm->arch.vioapic, irq, !!(*irq_state)); |
| 35 | #ifdef CONFIG_X86 | 43 | #ifdef CONFIG_X86 |
| 36 | kvm_pic_set_irq(pic_irqchip(kvm), irq, level); | 44 | kvm_pic_set_irq(pic_irqchip(kvm), irq, !!(*irq_state)); |
| 37 | #endif | 45 | #endif |
| 38 | } | 46 | } |
| 39 | 47 | ||
| @@ -58,3 +66,31 @@ void kvm_unregister_irq_ack_notifier(struct kvm *kvm, | |||
| 58 | { | 66 | { |
| 59 | hlist_del(&kian->link); | 67 | hlist_del(&kian->link); |
| 60 | } | 68 | } |
| 69 | |||
| 70 | /* The caller must hold kvm->lock mutex */ | ||
| 71 | int kvm_request_irq_source_id(struct kvm *kvm) | ||
| 72 | { | ||
| 73 | unsigned long *bitmap = &kvm->arch.irq_sources_bitmap; | ||
| 74 | int irq_source_id = find_first_zero_bit(bitmap, | ||
| 75 | sizeof(kvm->arch.irq_sources_bitmap)); | ||
| 76 | if (irq_source_id >= sizeof(kvm->arch.irq_sources_bitmap)) { | ||
| 77 | printk(KERN_WARNING "kvm: exhaust allocatable IRQ sources!\n"); | ||
| 78 | irq_source_id = -EFAULT; | ||
| 79 | } else | ||
| 80 | set_bit(irq_source_id, bitmap); | ||
| 81 | return irq_source_id; | ||
| 82 | } | ||
| 83 | |||
| 84 | void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id) | ||
| 85 | { | ||
| 86 | int i; | ||
| 87 | |||
| 88 | if (irq_source_id <= 0 || | ||
| 89 | irq_source_id >= sizeof(kvm->arch.irq_sources_bitmap)) { | ||
| 90 | printk(KERN_ERR "kvm: IRQ source ID out of range!\n"); | ||
| 91 | return; | ||
| 92 | } | ||
| 93 | for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) | ||
| 94 | clear_bit(irq_source_id, &kvm->arch.irq_states[i]); | ||
| 95 | clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap); | ||
| 96 | } | ||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index cf0ab8ed3845..a87f45edfae8 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -105,14 +105,12 @@ static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work) | |||
| 105 | */ | 105 | */ |
| 106 | mutex_lock(&assigned_dev->kvm->lock); | 106 | mutex_lock(&assigned_dev->kvm->lock); |
| 107 | kvm_set_irq(assigned_dev->kvm, | 107 | kvm_set_irq(assigned_dev->kvm, |
| 108 | assigned_dev->irq_source_id, | ||
| 108 | assigned_dev->guest_irq, 1); | 109 | assigned_dev->guest_irq, 1); |
| 109 | mutex_unlock(&assigned_dev->kvm->lock); | 110 | mutex_unlock(&assigned_dev->kvm->lock); |
| 110 | kvm_put_kvm(assigned_dev->kvm); | 111 | kvm_put_kvm(assigned_dev->kvm); |
| 111 | } | 112 | } |
| 112 | 113 | ||
| 113 | /* FIXME: Implement the OR logic needed to make shared interrupts on | ||
| 114 | * this line behave properly | ||
| 115 | */ | ||
| 116 | static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id) | 114 | static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id) |
| 117 | { | 115 | { |
| 118 | struct kvm_assigned_dev_kernel *assigned_dev = | 116 | struct kvm_assigned_dev_kernel *assigned_dev = |
| @@ -134,7 +132,7 @@ static void kvm_assigned_dev_ack_irq(struct kvm_irq_ack_notifier *kian) | |||
| 134 | 132 | ||
| 135 | dev = container_of(kian, struct kvm_assigned_dev_kernel, | 133 | dev = container_of(kian, struct kvm_assigned_dev_kernel, |
| 136 | ack_notifier); | 134 | ack_notifier); |
| 137 | kvm_set_irq(dev->kvm, dev->guest_irq, 0); | 135 | kvm_set_irq(dev->kvm, dev->irq_source_id, dev->guest_irq, 0); |
| 138 | enable_irq(dev->host_irq); | 136 | enable_irq(dev->host_irq); |
| 139 | } | 137 | } |
| 140 | 138 | ||
| @@ -146,6 +144,7 @@ static void kvm_free_assigned_device(struct kvm *kvm, | |||
| 146 | free_irq(assigned_dev->host_irq, (void *)assigned_dev); | 144 | free_irq(assigned_dev->host_irq, (void *)assigned_dev); |
| 147 | 145 | ||
| 148 | kvm_unregister_irq_ack_notifier(kvm, &assigned_dev->ack_notifier); | 146 | kvm_unregister_irq_ack_notifier(kvm, &assigned_dev->ack_notifier); |
| 147 | kvm_free_irq_source_id(kvm, assigned_dev->irq_source_id); | ||
| 149 | 148 | ||
| 150 | if (cancel_work_sync(&assigned_dev->interrupt_work)) | 149 | if (cancel_work_sync(&assigned_dev->interrupt_work)) |
| 151 | /* We had pending work. That means we will have to take | 150 | /* We had pending work. That means we will have to take |
| @@ -215,6 +214,11 @@ static int kvm_vm_ioctl_assign_irq(struct kvm *kvm, | |||
| 215 | match->ack_notifier.gsi = assigned_irq->guest_irq; | 214 | match->ack_notifier.gsi = assigned_irq->guest_irq; |
| 216 | match->ack_notifier.irq_acked = kvm_assigned_dev_ack_irq; | 215 | match->ack_notifier.irq_acked = kvm_assigned_dev_ack_irq; |
| 217 | kvm_register_irq_ack_notifier(kvm, &match->ack_notifier); | 216 | kvm_register_irq_ack_notifier(kvm, &match->ack_notifier); |
| 217 | r = kvm_request_irq_source_id(kvm); | ||
| 218 | if (r < 0) | ||
| 219 | goto out_release; | ||
| 220 | else | ||
| 221 | match->irq_source_id = r; | ||
| 218 | 222 | ||
| 219 | /* Even though this is PCI, we don't want to use shared | 223 | /* Even though this is PCI, we don't want to use shared |
| 220 | * interrupts. Sharing host devices with guest-assigned devices | 224 | * interrupts. Sharing host devices with guest-assigned devices |
