Date: Wed, 21 Mar 2012 21:30:11 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 208334 for review Message-ID: <201203212130.q2LLUBWB044387@skunkworks.freebsd.org>
index | next in thread | raw e-mail
http://p4web.freebsd.org/@@208334?ac=10 Change 208334 by rwatson@rwatson_svr_ctsrd_mipsbuild on 2012/03/21 21:29:41 Adapt the Deimos gxemul console driver to FreeBSD, using it to implement a low-level console. This appears to work with local gxemul, but a tty driver is not yet implemented. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/mips/beri/gxemul_uart.c#2 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/mips/beri/gxemul_uart.c#2 (text+ko) ==== @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2011 Robert N. M. Watson + * Copyright (c) 2011-2012 Robert N. M. Watson * All rights reserved. * * This software was developed by SRI International and the University of @@ -28,10 +28,67 @@ * SUCH DAMAGE. */ -#include "include/gxemul.h" -#include "include/mips.h" +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/cons.h> +#include <sys/endian.h> +#include <sys/kdb.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/tty.h> + +#include <ddb/ddb.h> + +/* + * Low-level console driver functions. + */ +static cn_probe_t gxemul_uart_cnprobe; +static cn_init_t gxemul_uart_cninit; +static cn_term_t gxemul_uart_cnterm; +static cn_getc_t gxemul_uart_cngetc; +static cn_putc_t gxemul_uart_cnputc; +static cn_grab_t gxemul_uart_cngrab; +static cn_ungrab_t gxemul_uart_cnungrab; + +/* + * I/O routines lifted from Deimos. + * + * XXXRW: Should be using FreeBSD's bus routines here. + */ +#define MIPS_XKPHYS_UNCACHED_BASE 0x9000000000000000 + +typedef uint64_t paddr_t; +typedef uint64_t vaddr_t; + +static inline vaddr_t +mips_phys_to_uncached(paddr_t phys) +{ + + return (phys | MIPS_XKPHYS_UNCACHED_BASE); +} + +static inline uint8_t +mips_ioread_uint8(vaddr_t vaddr) +{ + uint8_t v; + + __asm__ __volatile__ ("lbu %0, 0(%1)" : "=r" (v) : "r" (vaddr)); + return (v); +} + +static inline void +mips_iowrite_uint8(vaddr_t vaddr, uint8_t v) +{ + + __asm__ __volatile__ ("sb %0, 0(%1)" : : "r" (v), "r" (vaddr)); +} -#include "dev/uart/uart.h" +/* + * gxemul-specific constants. + */ +#define GXEMUL_CONS_BASE 0x10000000 /* gxemul console device. */ /* * Routines for interacting with the gxemul test console. Programming details @@ -54,7 +111,7 @@ * Low-level read and write routines. */ static inline uint8_t -cons_data_read(void) +gxemul_uart_data_read(void) { return (mips_ioread_uint8(mips_phys_to_uncached(GXEMUL_CONS_BASE + @@ -62,54 +119,102 @@ } static inline void -cons_data_write(uint8_t v) +gxemul_uart_data_write(uint8_t v) { mips_iowrite_uint8(mips_phys_to_uncached(GXEMUL_CONS_BASE + GXEMUL_PUTGETCHAR_OFF), v); } -int -uart_writable(void) +static int +gxemul_uart_writable(void) { return (1); } -int -uart_readable(void) +static int +gxemul_uart_readable(void) { uint32_t v; if (buffer_valid) return (1); - v = cons_data_read(); + v = gxemul_uart_data_read(); if (v != 0) { buffer_valid = 1; buffer_data = v; + return (1); } return (0); } -char -uart_read(void) +static void +gxemul_uart_write(char ch) +{ + + while (!gxemul_uart_writable()); + gxemul_uart_data_write(ch); +} + +static char +gxemul_uart_read(void) { - while (!uart_readable()); + while (!gxemul_uart_readable()); buffer_valid = 0; return (buffer_data); } -void -uart_write(char ch) +/* + * Implementation of a FreeBSD low-level, polled console driver. + */ +static void +gxemul_uart_cnprobe(struct consdev *cp) +{ + + sprintf(cp->cn_name, "gxemul_uart"); + cp->cn_pri = CN_NORMAL; +} + +static void +gxemul_uart_cninit(struct consdev *cp) +{ + +} + +static void +gxemul_uart_cnterm(struct consdev *cp) +{ + +} + +static int +gxemul_uart_cngetc(struct consdev *cp) +{ + int ret; + + ret = gxemul_uart_read(); + return (ret); +} + +static void +gxemul_uart_cnputc(struct consdev *cp, int c) +{ + + gxemul_uart_write(c); +} + +static void +gxemul_uart_cngrab(struct consdev *cp) { - cons_data_write(ch); } -void -uart_init(void) +static void +gxemul_uart_cnungrab(struct consdev *cp) { - /* Nothing required. */ } + +CONSOLE_DRIVER(gxemul_uart);home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203212130.q2LLUBWB044387>
