Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102728659
D43360.id132486.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D43360.id132486.diff
View Options
diff --git a/sys/dev/uart/uart_dev_mvebu.c b/sys/dev/uart/uart_dev_mvebu.c
--- a/sys/dev/uart/uart_dev_mvebu.c
+++ b/sys/dev/uart/uart_dev_mvebu.c
@@ -104,18 +104,15 @@
/*
* For debugging purposes
*/
-#if 0
-#ifdef EARLY_PRINTF
-#if defined(SOCDEV_PA) && defined(SOCDEV_VA)
-#define UART_REG_OFFSET 0x12000
+#if CHECK_EARLY_PRINTF(mvebu)
static void
uart_mvebu_early_putc(int c)
{
volatile uint32_t *tsh;
volatile uint32_t *stat;
- tsh = (uint32_t *)(SOCDEV_VA + UART_REG_OFFSET + UART_TSH);
- stat = (uint32_t *)(SOCDEV_VA + UART_REG_OFFSET + UART_STAT);
+ tsh = (uint32_t *)(socdev_va + UART_REG_OFFSET + UART_TSH);
+ stat = (uint32_t *)(socdev_va + UART_REG_OFFSET + UART_STAT);
while(!(*stat & STAT_TX_RDY))
;
@@ -125,8 +122,6 @@
early_putc_t *early_putc = uart_mvebu_early_putc;
#endif
-#endif
-#endif
/*
* Low-level UART interface.
diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -81,9 +81,12 @@
* To use early printf on x86, add the following to your kernel config:
*
* options UART_NS8250_EARLY_PORT=0x3f8
- * options EARLY_PRINTF
+ * options EARLY_PRINTF=ns8250
*/
-#if defined(EARLY_PRINTF) && (defined(__amd64__) || defined(__i386__))
+#if CHECK_EARLY_PRINTF(ns8250)
+#if !(defined(__amd64__) || defined(__i386__))
+#error ns8250 early putc is x86 specific as it uses inb/outb
+#endif
static void
uart_ns8250_early_putc(int c)
{
diff --git a/sys/dev/uart/uart_dev_pl011.c b/sys/dev/uart/uart_dev_pl011.c
--- a/sys/dev/uart/uart_dev_pl011.c
+++ b/sys/dev/uart/uart_dev_pl011.c
@@ -249,6 +249,20 @@
{
}
+#if CHECK_EARLY_PRINTF(pl011)
+static void
+uart_pl011_early_putc(int c)
+{
+ volatile uint32_t *fr = (uint32_t *)(socdev_va + UART_FR * 4);
+ volatile uint32_t *dr = (uint32_t *)(socdev_va + UART_DR * 4);
+
+ while ((*fr & FR_TXFF) != 0)
+ ;
+ *dr = c & 0xff;
+}
+early_putc_t *early_putc = uart_pl011_early_putc;
+#endif /* CHECK_EARLY_PRINTF */
+
static void
uart_pl011_putc(struct uart_bas *bas, int c)
{
diff --git a/sys/dev/uart/uart_dev_snps.c b/sys/dev/uart/uart_dev_snps.c
--- a/sys/dev/uart/uart_dev_snps.c
+++ b/sys/dev/uart/uart_dev_snps.c
@@ -54,18 +54,16 @@
/*
* To use early printf on 64 bits Allwinner SoC, add to kernel config
* options SOCDEV_PA=0x0
- * options SOCDEV_VA=0x40000000
- * options EARLY_PRINTF
+ * options EARLY_PRINTF=snps
*
* To use early printf on 32 bits Allwinner SoC, add to kernel config
* options SOCDEV_PA=0x01C00000
* options SOCDEV_VA=0x10000000
- * options EARLY_PRINTF
+ * options EARLY_PRINTF=snps
*
* remove the if 0
*/
-#if 0
-#ifdef EARLY_PRINTF
+#if CHECK_EARLY_PRINTF(snps)
static void
uart_snps_early_putc(int c)
{
@@ -73,12 +71,12 @@
volatile uint32_t *tx;
#ifdef ALLWINNER_64
- stat = (uint32_t *) (SOCDEV_VA + 0x1C2807C);
- tx = (uint32_t *) (SOCDEV_VA + 0x1C28000);
+ stat = (uint32_t *) (socdev_va + 0x1C2807C);
+ tx = (uint32_t *) (socdev_va + 0x1C28000);
#endif
#ifdef ALLWINNER_32
- stat = (uint32_t *) (SOCDEV_VA + 0x2807C);
- tx = (uint32_t *) (SOCDEV_VA + 0x28000);
+ stat = (uint32_t *) (socdev_va + 0x2807C);
+ tx = (uint32_t *) (socdev_va + 0x28000);
#endif
while ((*stat & (1 << 2)) == 0)
@@ -86,8 +84,7 @@
*tx = c;
}
early_putc_t *early_putc = uart_snps_early_putc;
-#endif /* EARLY_PRINTF */
-#endif
+#endif /* CHECK_EARLY_PRINTF */
static kobj_method_t snps_methods[] = {
KOBJMETHOD(uart_probe, ns8250_bus_probe),
diff --git a/sys/kern/kern_cons.c b/sys/kern/kern_cons.c
--- a/sys/kern/kern_cons.c
+++ b/sys/kern/kern_cons.c
@@ -72,6 +72,18 @@
#include <machine/cpu.h>
#include <machine/clock.h>
+/*
+ * Check for 'options EARLY_PRINTF' that may have been used in old kernel
+ * config files. If you are hitting this error you should update your
+ * config to use 'options EARLY_PRINTF=<device name>', e.g. with the
+ * Arm pl011 use:
+ *
+ * options EARLY_PRINTF=pl011
+ */
+#if CHECK_EARLY_PRINTF(1)
+#error Update your config to use 'options EARLY_PRINTF=<device name>'
+#endif
+
static MALLOC_DEFINE(M_TTYCONS, "tty console", "tty console handling");
struct cn_device {
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -198,6 +198,15 @@
#ifdef EARLY_PRINTF
typedef void early_putc_t(int ch);
extern early_putc_t *early_putc;
+#define CHECK_EARLY_PRINTF(x) \
+ __CONCAT(early_printf_, EARLY_PRINTF) == __CONCAT(early_printf_, x)
+#define early_printf_1 1
+#define early_printf_mvebu 2
+#define early_printf_ns8250 3
+#define early_printf_pl011 4
+#define early_printf_snps 5
+#else
+#define CHECK_EARLY_PRINTF(x) 0
#endif
int kvprintf(char const *, void (*)(int, void*), void *, int,
__va_list) __printflike(1, 0);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 17, 11:08 AM (20 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14675146
Default Alt Text
D43360.id132486.diff (4 KB)
Attached To
Mode
D43360: sys: Simplify enabling EARLY_PRINTF uarts
Attached
Detach File
Event Timeline
Log In to Comment