cregit-Linux how code gets into the kernel

Release 4.14 arch/powerpc/kernel/udbg_16550.c

/*
 * udbg for NS16550 compatible serial ports
 *
 * Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
 *
 *      This program is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU General Public License
 *      as published by the Free Software Foundation; either version
 *      2 of the License, or (at your option) any later version.
 */
#include <linux/types.h>
#include <asm/udbg.h>
#include <asm/io.h>
#include <asm/reg_a2.h>

extern u8 real_readb(volatile u8 __iomem  *addr);
extern void real_writeb(u8 data, volatile u8 __iomem *addr);
extern u8 real_205_readb(volatile u8 __iomem  *addr);
extern void real_205_writeb(u8 data, volatile u8 __iomem *addr);


#define UART_RBR	0

#define UART_IER	1

#define UART_FCR	2

#define UART_LCR	3

#define UART_MCR	4

#define UART_LSR	5

#define UART_MSR	6

#define UART_SCR	7

#define UART_THR	UART_RBR

#define UART_IIR	UART_FCR

#define UART_DLL	UART_RBR

#define UART_DLM	UART_IER

#define UART_DLAB	UART_LCR


#define LSR_DR   0x01  
/* Data ready */

#define LSR_OE   0x02  
/* Overrun */

#define LSR_PE   0x04  
/* Parity error */

#define LSR_FE   0x08  
/* Framing error */

#define LSR_BI   0x10  
/* Break */

#define LSR_THRE 0x20  
/* Xmit holding register empty */

#define LSR_TEMT 0x40  
/* Xmitter empty */

#define LSR_ERR  0x80  
/* Error */


#define LCR_DLAB 0x80


static u8 (*udbg_uart_in)(unsigned int reg);

static void (*udbg_uart_out)(unsigned int reg, u8 data);


static void udbg_uart_flush(void) { if (!udbg_uart_in) return; /* wait for idle */ while ((udbg_uart_in(UART_LSR) & LSR_THRE) == 0) cpu_relax(); }

Contributors

PersonTokensPropCommitsCommitProp
Milton D. Miller II1961.29%133.33%
Benjamin Herrenschmidt1032.26%133.33%
Andrew Klossner26.45%133.33%
Total31100.00%3100.00%


static void udbg_uart_putc(char c) { if (!udbg_uart_out) return; if (c == '\n') udbg_uart_putc('\r'); udbg_uart_flush(); udbg_uart_out(UART_THR, c); }

Contributors

PersonTokensPropCommitsCommitProp
Andrew Klossner1644.44%133.33%
Milton D. Miller II1233.33%133.33%
Benjamin Herrenschmidt822.22%133.33%
Total36100.00%3100.00%


static int udbg_uart_getc_poll(void) { if (!udbg_uart_in) return -1; if (!(udbg_uart_in(UART_LSR) & LSR_DR)) return udbg_uart_in(UART_RBR); return -1; }

Contributors

PersonTokensPropCommitsCommitProp
Milton D. Miller II2461.54%133.33%
Benjamin Herrenschmidt820.51%133.33%
Anton Blanchard717.95%133.33%
Total39100.00%3100.00%


static int udbg_uart_getc(void) { if (!udbg_uart_in) return -1; /* wait for char */ while (!(udbg_uart_in(UART_LSR) & LSR_DR)) cpu_relax(); return udbg_uart_in(UART_RBR); }

Contributors

PersonTokensPropCommitsCommitProp
Milton D. Miller II2256.41%133.33%
Benjamin Herrenschmidt1743.59%266.67%
Total39100.00%3100.00%


static void udbg_use_uart(void) { udbg_putc = udbg_uart_putc; udbg_flush = udbg_uart_flush; udbg_getc = udbg_uart_getc; udbg_getc_poll = udbg_uart_getc_poll; }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt2187.50%150.00%
Milton D. Miller II312.50%150.00%
Total24100.00%2100.00%


void udbg_uart_setup(unsigned int speed, unsigned int clock) { unsigned int dll, base_bauds; if (!udbg_uart_out) return; if (clock == 0) clock = 1843200; if (speed == 0) speed = 9600; base_bauds = clock / 16; dll = base_bauds / speed; udbg_uart_out(UART_LCR, 0x00); udbg_uart_out(UART_IER, 0xff); udbg_uart_out(UART_IER, 0x00); udbg_uart_out(UART_LCR, LCR_DLAB); udbg_uart_out(UART_DLL, dll & 0xff); udbg_uart_out(UART_DLM, dll >> 8); /* 8 data, 1 stop, no parity */ udbg_uart_out(UART_LCR, 0x3); /* RTS/DTR */ udbg_uart_out(UART_MCR, 0x3); /* Clear & enable FIFOs */ udbg_uart_out(UART_FCR, 0x7); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt7256.69%375.00%
Milton D. Miller II5543.31%125.00%
Total127100.00%4100.00%


unsigned int udbg_probe_uart_speed(unsigned int clock) { unsigned int dll, dlm, divisor, prescaler, speed; u8 old_lcr; old_lcr = udbg_uart_in(UART_LCR); /* select divisor latch registers. */ udbg_uart_out(UART_LCR, old_lcr | LCR_DLAB); /* now, read the divisor */ dll = udbg_uart_in(UART_DLL); dlm = udbg_uart_in(UART_DLM); divisor = dlm << 8 | dll; /* check prescaling */ if (udbg_uart_in(UART_MCR) & 0x80) prescaler = 4; else prescaler = 1; /* restore the LCR */ udbg_uart_out(UART_LCR, old_lcr); /* calculate speed */ speed = (clock / prescaler) / (divisor * 16); /* sanity check */ if (speed > (clock / 16)) speed = 9600; return speed; }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt12096.00%266.67%
Kumar Gala54.00%133.33%
Total125100.00%3100.00%

static union { unsigned char __iomem *mmio_base; unsigned long pio_base; } udbg_uart; static unsigned int udbg_uart_stride = 1;
static u8 udbg_uart_in_pio(unsigned int reg) { return inb(udbg_uart.pio_base + (reg * udbg_uart_stride)); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt24100.00%1100.00%
Total24100.00%1100.00%


static void udbg_uart_out_pio(unsigned int reg, u8 data) { outb(data, udbg_uart.pio_base + (reg * udbg_uart_stride)); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt2692.86%150.00%
Milton D. Miller II27.14%150.00%
Total28100.00%2100.00%


void udbg_uart_init_pio(unsigned long port, unsigned int stride) { if (!port) return; udbg_uart.pio_base = port; udbg_uart_stride = stride; udbg_uart_in = udbg_uart_in_pio; udbg_uart_out = udbg_uart_out_pio; udbg_use_uart(); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt3485.00%133.33%
Milton D. Miller II512.50%133.33%
Andrew Klossner12.50%133.33%
Total40100.00%3100.00%


static u8 udbg_uart_in_mmio(unsigned int reg) { return in_8(udbg_uart.mmio_base + (reg * udbg_uart_stride)); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt2083.33%133.33%
Milton D. Miller II312.50%133.33%
Andrew Klossner14.17%133.33%
Total24100.00%3100.00%


static void udbg_uart_out_mmio(unsigned int reg, u8 data) { out_8(udbg_uart.mmio_base + (reg * udbg_uart_stride), data); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt2485.71%150.00%
Andrew Klossner414.29%150.00%
Total28100.00%2100.00%


void udbg_uart_init_mmio(void __iomem *addr, unsigned int stride) { if (!addr) return; udbg_uart.mmio_base = addr; udbg_uart_stride = stride; udbg_uart_in = udbg_uart_in_mmio; udbg_uart_out = udbg_uart_out_mmio; udbg_use_uart(); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt3482.93%133.33%
Milton D. Miller II49.76%133.33%
Andrew Klossner37.32%133.33%
Total41100.00%3100.00%

#ifdef CONFIG_PPC_MAPLE #define UDBG_UART_MAPLE_ADDR ((void __iomem *)0xf40003f8)
static u8 udbg_uart_in_maple(unsigned int reg) { return real_readb(UDBG_UART_MAPLE_ADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt18100.00%1100.00%
Total18100.00%1100.00%


static void udbg_uart_out_maple(unsigned int reg, u8 val) { real_writeb(val, UDBG_UART_MAPLE_ADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1672.73%133.33%
Andrew Klossner522.73%133.33%
Milton D. Miller II14.55%133.33%
Total22100.00%3100.00%


void __init udbg_init_maple_realmode(void) { udbg_uart_in = udbg_uart_in_maple; udbg_uart_out = udbg_uart_out_maple; udbg_use_uart(); }

Contributors

PersonTokensPropCommitsCommitProp
Milton D. Miller II1052.63%125.00%
Benjamin Herrenschmidt631.58%125.00%
Andrew Klossner210.53%125.00%
Michael Ellerman15.26%125.00%
Total19100.00%4100.00%

#endif /* CONFIG_PPC_MAPLE */ #ifdef CONFIG_PPC_PASEMI #define UDBG_UART_PAS_ADDR ((void __iomem *)0xfcff03f8UL)
static u8 udbg_uart_in_pas(unsigned int reg) { return real_205_readb(UDBG_UART_PAS_ADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1161.11%133.33%
Olof Johansson633.33%133.33%
Andrew Klossner15.56%133.33%
Total18100.00%3100.00%


static void udbg_uart_out_pas(unsigned int reg, u8 val) { real_205_writeb(val, UDBG_UART_PAS_ADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1254.55%133.33%
Andrew Klossner940.91%133.33%
Olof Johansson14.55%133.33%
Total22100.00%3100.00%


void __init udbg_init_pas_realmode(void) { udbg_uart_in = udbg_uart_in_pas; udbg_uart_out = udbg_uart_out_pas; udbg_use_uart(); }

Contributors

PersonTokensPropCommitsCommitProp
Olof Johansson1052.63%133.33%
Benjamin Herrenschmidt736.84%133.33%
Andrew Klossner210.53%133.33%
Total19100.00%3100.00%

#endif /* CONFIG_PPC_PASEMI */ #ifdef CONFIG_PPC_EARLY_DEBUG_44x #include <platforms/44x/44x.h>
static u8 udbg_uart_in_44x_as1(unsigned int reg) { return as1_readb((void __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1669.57%133.33%
Andrew Klossner521.74%133.33%
David Gibson28.70%133.33%
Total23100.00%3100.00%


static void udbg_uart_out_44x_as1(unsigned int reg, u8 val) { as1_writeb(val, (void __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1970.37%150.00%
Hollis Blanchard829.63%150.00%
Total27100.00%2100.00%


void __init udbg_init_44x_as1(void) { udbg_uart_in = udbg_uart_in_44x_as1; udbg_uart_out = udbg_uart_out_44x_as1; udbg_use_uart(); }

Contributors

PersonTokensPropCommitsCommitProp
David Gibson1052.63%125.00%
Benjamin Herrenschmidt631.58%125.00%
Andrew Klossner210.53%125.00%
Hollis Blanchard15.26%125.00%
Total19100.00%4100.00%

#endif /* CONFIG_PPC_EARLY_DEBUG_44x */ #ifdef CONFIG_PPC_EARLY_DEBUG_40x
static u8 udbg_uart_in_40x(unsigned int reg) { return real_readb((void __iomem *)CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt2295.65%266.67%
Andrew Klossner14.35%133.33%
Total23100.00%3100.00%


static void udbg_uart_out_40x(unsigned int reg, u8 val) { real_writeb(val, (void __iomem *)CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1970.37%266.67%
Andrew Klossner829.63%133.33%
Total27100.00%3100.00%


void __init udbg_init_40x_realmode(void) { udbg_uart_in = udbg_uart_in_40x; udbg_uart_out = udbg_uart_out_40x; udbg_use_uart(); }

Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt1789.47%266.67%
Andrew Klossner210.53%133.33%
Total19100.00%3100.00%

#endif /* CONFIG_PPC_EARLY_DEBUG_40x */

Overall Contributors

PersonTokensPropCommitsCommitProp
Benjamin Herrenschmidt69963.20%531.25%
Milton D. Miller II24922.51%212.50%
Andrew Klossner645.79%16.25%
Olof Johansson474.25%16.25%
David Gibson211.90%16.25%
Hollis Blanchard90.81%16.25%
Anton Blanchard70.63%16.25%
Kumar Gala50.45%16.25%
Jack Miller30.27%16.25%
Michael Ellerman10.09%16.25%
Lucas De Marchi10.09%16.25%
Total1106100.00%16100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.