diff options
Diffstat (limited to 'arch/powerpc/sysdev')
| -rw-r--r-- | arch/powerpc/sysdev/Makefile | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/ehv_pic.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/mpic.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/udbg_memcons.c | 105 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xics/ics-opal.c | 2 |
5 files changed, 110 insertions, 3 deletions
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index b0a518e97599..99464a7bdb3b 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
| @@ -64,6 +64,8 @@ endif | |||
| 64 | 64 | ||
| 65 | obj-$(CONFIG_PPC_SCOM) += scom.o | 65 | obj-$(CONFIG_PPC_SCOM) += scom.o |
| 66 | 66 | ||
| 67 | obj-$(CONFIG_PPC_EARLY_DEBUG_MEMCONS) += udbg_memcons.o | ||
| 68 | |||
| 67 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 69 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
| 68 | 70 | ||
| 69 | obj-$(CONFIG_PPC_XICS) += xics/ | 71 | obj-$(CONFIG_PPC_XICS) += xics/ |
diff --git a/arch/powerpc/sysdev/ehv_pic.c b/arch/powerpc/sysdev/ehv_pic.c index 6e0e1005227f..9cd0e60716fe 100644 --- a/arch/powerpc/sysdev/ehv_pic.c +++ b/arch/powerpc/sysdev/ehv_pic.c | |||
| @@ -81,7 +81,7 @@ int ehv_pic_set_affinity(struct irq_data *d, const struct cpumask *dest, | |||
| 81 | ev_int_set_config(src, config, prio, cpuid); | 81 | ev_int_set_config(src, config, prio, cpuid); |
| 82 | spin_unlock_irqrestore(&ehv_pic_lock, flags); | 82 | spin_unlock_irqrestore(&ehv_pic_lock, flags); |
| 83 | 83 | ||
| 84 | return 0; | 84 | return IRQ_SET_MASK_OK; |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | static unsigned int ehv_pic_type_to_vecpri(unsigned int type) | 87 | static unsigned int ehv_pic_type_to_vecpri(unsigned int type) |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index ee21b5e71aec..0a13ecb270c7 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
| @@ -836,7 +836,7 @@ int mpic_set_affinity(struct irq_data *d, const struct cpumask *cpumask, | |||
| 836 | mpic_physmask(mask)); | 836 | mpic_physmask(mask)); |
| 837 | } | 837 | } |
| 838 | 838 | ||
| 839 | return 0; | 839 | return IRQ_SET_MASK_OK; |
| 840 | } | 840 | } |
| 841 | 841 | ||
| 842 | static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type) | 842 | static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type) |
diff --git a/arch/powerpc/sysdev/udbg_memcons.c b/arch/powerpc/sysdev/udbg_memcons.c new file mode 100644 index 000000000000..ce5a7b489e4b --- /dev/null +++ b/arch/powerpc/sysdev/udbg_memcons.c | |||
| @@ -0,0 +1,105 @@ | |||
| 1 | /* | ||
| 2 | * A udbg backend which logs messages and reads input from in memory | ||
| 3 | * buffers. | ||
| 4 | * | ||
| 5 | * The console output can be read from memcons_output which is a | ||
| 6 | * circular buffer whose next write position is stored in memcons.output_pos. | ||
| 7 | * | ||
| 8 | * Input may be passed by writing into the memcons_input buffer when it is | ||
| 9 | * empty. The input buffer is empty when both input_pos == input_start and | ||
| 10 | * *input_start == '\0'. | ||
| 11 | * | ||
| 12 | * Copyright (C) 2003-2005 Anton Blanchard and Milton Miller, IBM Corp | ||
| 13 | * Copyright (C) 2013 Alistair Popple, IBM Corp | ||
| 14 | * | ||
| 15 | * This program is free software; you can redistribute it and/or | ||
| 16 | * modify it under the terms of the GNU General Public License | ||
| 17 | * as published by the Free Software Foundation; either version | ||
| 18 | * 2 of the License, or (at your option) any later version. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #include <linux/init.h> | ||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <asm/barrier.h> | ||
| 24 | #include <asm/page.h> | ||
| 25 | #include <asm/processor.h> | ||
| 26 | #include <asm/udbg.h> | ||
| 27 | |||
| 28 | struct memcons { | ||
| 29 | char *output_start; | ||
| 30 | char *output_pos; | ||
| 31 | char *output_end; | ||
| 32 | char *input_start; | ||
| 33 | char *input_pos; | ||
| 34 | char *input_end; | ||
| 35 | }; | ||
| 36 | |||
| 37 | static char memcons_output[CONFIG_PPC_MEMCONS_OUTPUT_SIZE]; | ||
| 38 | static char memcons_input[CONFIG_PPC_MEMCONS_INPUT_SIZE]; | ||
| 39 | |||
| 40 | struct memcons memcons = { | ||
| 41 | .output_start = memcons_output, | ||
| 42 | .output_pos = memcons_output, | ||
| 43 | .output_end = &memcons_output[CONFIG_PPC_MEMCONS_OUTPUT_SIZE], | ||
| 44 | .input_start = memcons_input, | ||
| 45 | .input_pos = memcons_input, | ||
| 46 | .input_end = &memcons_input[CONFIG_PPC_MEMCONS_INPUT_SIZE], | ||
| 47 | }; | ||
| 48 | |||
| 49 | void memcons_putc(char c) | ||
| 50 | { | ||
| 51 | char *new_output_pos; | ||
| 52 | |||
| 53 | *memcons.output_pos = c; | ||
| 54 | wmb(); | ||
| 55 | new_output_pos = memcons.output_pos + 1; | ||
| 56 | if (new_output_pos >= memcons.output_end) | ||
| 57 | new_output_pos = memcons.output_start; | ||
| 58 | |||
| 59 | memcons.output_pos = new_output_pos; | ||
| 60 | } | ||
| 61 | |||
| 62 | int memcons_getc_poll(void) | ||
| 63 | { | ||
| 64 | char c; | ||
| 65 | char *new_input_pos; | ||
| 66 | |||
| 67 | if (*memcons.input_pos) { | ||
| 68 | c = *memcons.input_pos; | ||
| 69 | |||
| 70 | new_input_pos = memcons.input_pos + 1; | ||
| 71 | if (new_input_pos >= memcons.input_end) | ||
| 72 | new_input_pos = memcons.input_start; | ||
| 73 | else if (*new_input_pos == '\0') | ||
| 74 | new_input_pos = memcons.input_start; | ||
| 75 | |||
| 76 | *memcons.input_pos = '\0'; | ||
| 77 | wmb(); | ||
| 78 | memcons.input_pos = new_input_pos; | ||
| 79 | return c; | ||
| 80 | } | ||
| 81 | |||
| 82 | return -1; | ||
| 83 | } | ||
| 84 | |||
| 85 | int memcons_getc(void) | ||
| 86 | { | ||
| 87 | int c; | ||
| 88 | |||
| 89 | while (1) { | ||
| 90 | c = memcons_getc_poll(); | ||
| 91 | if (c == -1) | ||
| 92 | cpu_relax(); | ||
| 93 | else | ||
| 94 | break; | ||
| 95 | } | ||
| 96 | |||
| 97 | return c; | ||
| 98 | } | ||
| 99 | |||
| 100 | void udbg_init_memcons(void) | ||
| 101 | { | ||
| 102 | udbg_putc = memcons_putc; | ||
| 103 | udbg_getc = memcons_getc; | ||
| 104 | udbg_getc_poll = memcons_getc_poll; | ||
| 105 | } | ||
diff --git a/arch/powerpc/sysdev/xics/ics-opal.c b/arch/powerpc/sysdev/xics/ics-opal.c index f7e8609df0d5..39d72212655e 100644 --- a/arch/powerpc/sysdev/xics/ics-opal.c +++ b/arch/powerpc/sysdev/xics/ics-opal.c | |||
| @@ -148,7 +148,7 @@ static int ics_opal_set_affinity(struct irq_data *d, | |||
| 148 | __func__, d->irq, hw_irq, server, rc); | 148 | __func__, d->irq, hw_irq, server, rc); |
| 149 | return -1; | 149 | return -1; |
| 150 | } | 150 | } |
| 151 | return 0; | 151 | return IRQ_SET_MASK_OK; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | static struct irq_chip ics_opal_irq_chip = { | 154 | static struct irq_chip ics_opal_irq_chip = { |
