On 2016-11-25 16:26, Ralf Ramsauer wrote:
> Add dbg-types PIO and MMIO for x86 inmates.
> 
> Signed-off-by: Ralf Ramsauer <[email protected]>
> ---
>  inmates/lib/x86/printk.c | 52 
> +++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 45 insertions(+), 7 deletions(-)
> 
> diff --git a/inmates/lib/x86/printk.c b/inmates/lib/x86/printk.c
> index 9939e61158..f7c75815f0 100644
> --- a/inmates/lib/x86/printk.c
> +++ b/inmates/lib/x86/printk.c
> @@ -13,6 +13,7 @@
>  #include <stdarg.h>
>  #include <inmate.h>
>  
> +#define DEBUG_TYPE           "PIO"
>  #define UART_BASE            0x3f8
>  #define UART_TX                      0x0
>  #define UART_DLL             0x0
> @@ -23,7 +24,31 @@
>  #define UART_LSR             0x5
>  #define UART_LSR_THRE                0x20
>  
> -static unsigned int printk_uart_base;
> +static long unsigned int printk_uart_base;
> +
> +static void uart_pio_out(unsigned int reg, u8 value)
> +{
> +     outb(value, printk_uart_base + reg);
> +}
> +
> +static u8 uart_pio_in(unsigned int reg)
> +{
> +     return inb(printk_uart_base + reg);
> +}
> +
> +static void uart_mmio32_out(unsigned int reg, u8 value)
> +{
> +     mmio_write32((void *)printk_uart_base + reg * 4, value);
> +}
> +
> +static u8 uart_mmio32_in(unsigned int reg)
> +{
> +     return mmio_read32((void *)printk_uart_base + reg * 4);
> +}
> +
> +/* choose 8 bit PIO by default */
> +static void (*uart_reg_out)(unsigned int, u8) = uart_pio_out;
> +static u8 (*uart_reg_in)(unsigned int) = uart_pio_in;
>  
>  static void uart_write(const char *msg)
>  {
> @@ -39,9 +64,9 @@ static void uart_write(const char *msg)
>                       c = *msg++;
>               if (!c)
>                       break;
> -             while (!(inb(printk_uart_base + UART_LSR) & UART_LSR_THRE))
> +             while (!(uart_reg_in(UART_LSR) & UART_LSR_THRE))
>                       cpu_relax();
> -             outb(c, printk_uart_base + UART_TX);
> +             uart_reg_out(UART_TX, c);
>       }
>  }
>  
> @@ -50,18 +75,28 @@ static void uart_write(const char *msg)
>  
>  static void dbg_init(void)
>  {
> +     const char *type;
> +     char buf[32];
>       unsigned int divider;
>  
>       printk_uart_base = cmdline_parse_int("dbg-base", UART_BASE);
>       divider = cmdline_parse_int("dbg-divider", 0);
> +     type = cmdline_parse_str("dbg-type", buf, sizeof(buf), DEBUG_TYPE);
> +
> +     if (strncmp(type, "MMIO", 4) == 0) {
> +             uart_reg_out = uart_mmio32_out;
> +             uart_reg_in = uart_mmio32_in;

You also need map_range(base, size, MAP_UNCACHED) in order to do this
mmio on x86.

Jan

> +     } else if (strncmp(type, "none", 4) == 0) {
> +             printk_uart_base = 0;
> +     }
>  
>       if (!printk_uart_base || !divider)
>               return;
>  
> -     outb(UART_LCR_DLAB, printk_uart_base + UART_LCR);
> -     outb(divider, printk_uart_base + UART_DLL);
> -     outb(0, printk_uart_base + UART_DLM);
> -     outb(UART_LCR_8N1, printk_uart_base + UART_LCR);
> +     uart_reg_out(UART_LCR, UART_LCR_DLAB);
> +     uart_reg_out(UART_DLL, divider);
> +     uart_reg_out(UART_DLM, 0);
> +     uart_reg_out(UART_LCR, UART_LCR_8N1);
>  }
>  
>  void printk(const char *fmt, ...)
> @@ -74,6 +109,9 @@ void printk(const char *fmt, ...)
>               inited = true;
>       }
>  
> +     if (!printk_uart_base)
> +             return;
> +
>       va_start(ap, fmt);
>  
>       __vprintk(fmt, ap);
> 

-- 
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to