From owner-p4-projects@FreeBSD.ORG Wed Mar 21 21:30:12 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 81E4E1065670; Wed, 21 Mar 2012 21:30:12 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2C38D106564A for ; Wed, 21 Mar 2012 21:30:12 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 0B22A8FC14 for ; Wed, 21 Mar 2012 21:30:12 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id q2LLUBoN044390 for ; Wed, 21 Mar 2012 21:30:11 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q2LLUBWB044387 for perforce@freebsd.org; Wed, 21 Mar 2012 21:30:11 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Wed, 21 Mar 2012 21:30:11 GMT Message-Id: <201203212130.q2LLUBWB044387@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 208334 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Mar 2012 21:30:12 -0000 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include + +/* + * 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);