WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

[Xen-ia64-devel] [patch] SN2 polling console driver

To: Alex Williamson <alex.williamson@xxxxxx>, xen-ia64-devel@xxxxxxxxxxxxxxxxxxx, Greg Edwards <edwardsg@xxxxxxx>
Subject: [Xen-ia64-devel] [patch] SN2 polling console driver
From: Jes Sorensen <jes@xxxxxxx>
Date: Tue, 22 May 2007 17:18:43 +0200
Delivery-date: Tue, 22 May 2007 08:17:03 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5.0.4 (X11/20060527)
Hi,

First cut at adding polling input support to the SN2 console driver.
This is slooooooooow, but it works.

Jes

# HG changeset patch
# User jes@xxxxxxxxxxxxxxxx
# Date 1179847015 -7200
# Node ID 7cb47b607563bb356dad2a2fb1555bc261076f94
# Parent  a00f130f36c7e182494d0fdf0aaf2206bdfb3a6e
First cut of super simple console driver with polled input support. In
addition switch driver to use ia64_sn_console_putb() post-boot to get
interactive response.

Signed-off-by: Jes Sorensen <jes@xxxxxxx>

diff -r a00f130f36c7 -r 7cb47b607563 xen/arch/ia64/xen/sn_console.c
--- a/xen/arch/ia64/xen/sn_console.c    Tue May 22 15:08:10 2007 +0200
+++ b/xen/arch/ia64/xen/sn_console.c    Tue May 22 17:16:55 2007 +0200
@@ -8,18 +8,83 @@
 #include <asm/acpi.h>
 #include <asm/sn/sn_sal.h>
 #include <xen/serial.h>
+#include <xen/sched.h>
+
+struct sn_console_data {
+       struct timer timer;
+       unsigned int timeout_ms;
+       int booted;
+};
+
+static struct sn_console_data console_data = {
+       .timeout_ms = 8 * 16 * 1000 / 9600,
+};
+
 
 /*
  * sn_putc - Send a character to the console, polled or interrupt mode
  */
 static void sn_putc(struct serial_port *port, char c)
 {
-       ia64_sn_console_putc(c);
+       struct sn_console_data *sndata = port->uart;
+
+       if (sndata->booted)
+               ia64_sn_console_putb(&c, 1);
+       else
+               ia64_sn_console_putc(c);
 }
 
+/*
+ * sn_getc - Get a character from the console, polled or interrupt mode
+ */
+static int sn_getc(struct serial_port *port, char *pc)
+{
+       int ch;
+
+       ia64_sn_console_getc(&ch);
+       *pc = ch & 0xff;
+       return 1;
+}
+
+static void sn_endboot(struct serial_port *port)
+{
+       struct sn_console_data *sndata = port->uart;
+
+       sndata->booted = 1;
+}
+
+
+static void sn_poll(void *data)
+{
+       int ch, status;
+       struct serial_port *port = data;
+       struct sn_console_data *sndata = port->uart;
+       struct cpu_user_regs *regs = guest_cpu_user_regs();
+
+       status = ia64_sn_console_check(&ch);
+       if (!status && ch) {
+               serial_rx_interrupt(port, regs);
+       }
+       set_timer(&sndata->timer, NOW() + MILLISECS(sndata->timeout_ms));
+}
+
+
+static void sn_init_postirq(struct serial_port *port)
+{
+       struct sn_console_data *sndata = port->uart;
+
+        init_timer(&sndata->timer, sn_poll, port, 0);
+        set_timer(&sndata->timer, NOW() + MILLISECS(console_data.timeout_ms));
+}
+
+
 static struct uart_driver sn_sal_console = {
+       .init_postirq = sn_init_postirq,
        .putc = sn_putc,
+       .getc = sn_getc,
+       .endboot = sn_endboot,
 };
+
 
 /**
  * early_sn_setup - early setup routine for SN platforms
@@ -45,8 +110,7 @@ static void __init early_sn_setup(void)
        efi_systab = (efi_system_table_t *) __va(ia64_boot_param->efi_systab);
        config_tables = __va(efi_systab->tables);
        for (i = 0; i < efi_systab->nr_tables; i++) {
-               if (efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID) ==
-                   0) {
+               if (!efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID)) 
{
                        sal_systab = __va(config_tables[i].table);
                        p = (char *)(sal_systab + 1);
                        for (j = 0; j < sal_systab->entry_count; j++) {
@@ -73,11 +137,11 @@ static void __init early_sn_setup(void)
  */
 int __init sn_serial_console_early_setup(void)
 {
-       if (strcmp("sn2",acpi_get_sysname()))
+       if (strcmp("sn2", acpi_get_sysname()))
                return -1;
 
        early_sn_setup();       /* Find SAL entry points */
-       serial_register_uart(0, &sn_sal_console, NULL);
+       serial_register_uart(0, &sn_sal_console, &console_data);
 
        return 0;
 }
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
<Prev in Thread] Current Thread [Next in Thread>