Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 1 | /* |
Chris Metcalf | ef06f55 | 2010-07-02 14:19:35 -0400 | [diff] [blame] | 2 | * Copyright 2010 Tilera Corporation. All Rights Reserved. |
Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 3 | * |
Chris Metcalf | ef06f55 | 2010-07-02 14:19:35 -0400 | [diff] [blame] | 4 | * This program is free software; you can redistribute it and/or |
| 5 | * modify it under the terms of the GNU General Public License |
| 6 | * as published by the Free Software Foundation, version 2. |
Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 7 | * |
Chris Metcalf | ef06f55 | 2010-07-02 14:19:35 -0400 | [diff] [blame] | 8 | * This program is distributed in the hope that it will be useful, but |
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or |
| 11 | * NON INFRINGEMENT. See the GNU General Public License for |
| 12 | * more details. |
Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 13 | * |
| 14 | * Tilera TILE Processor hypervisor console |
| 15 | */ |
| 16 | |
| 17 | #include <linux/console.h> |
| 18 | #include <linux/delay.h> |
| 19 | #include <linux/err.h> |
| 20 | #include <linux/init.h> |
| 21 | #include <linux/moduleparam.h> |
| 22 | #include <linux/types.h> |
| 23 | |
| 24 | #include <hv/hypervisor.h> |
| 25 | |
| 26 | #include "hvc_console.h" |
| 27 | |
| 28 | static int hvc_tile_put_chars(uint32_t vt, const char *buf, int count) |
| 29 | { |
| 30 | return hv_console_write((HV_VirtAddr)buf, count); |
| 31 | } |
| 32 | |
| 33 | static int hvc_tile_get_chars(uint32_t vt, char *buf, int count) |
| 34 | { |
| 35 | int i, c; |
| 36 | |
| 37 | for (i = 0; i < count; ++i) { |
| 38 | c = hv_console_read_if_ready(); |
| 39 | if (c < 0) |
| 40 | break; |
| 41 | buf[i] = c; |
| 42 | } |
| 43 | |
| 44 | return i; |
| 45 | } |
| 46 | |
| 47 | static const struct hv_ops hvc_tile_get_put_ops = { |
| 48 | .get_chars = hvc_tile_get_chars, |
| 49 | .put_chars = hvc_tile_put_chars, |
| 50 | }; |
| 51 | |
| 52 | static int __init hvc_tile_console_init(void) |
| 53 | { |
| 54 | extern void disable_early_printk(void); |
| 55 | hvc_instantiate(0, 0, &hvc_tile_get_put_ops); |
| 56 | add_preferred_console("hvc", 0, NULL); |
| 57 | disable_early_printk(); |
| 58 | return 0; |
| 59 | } |
| 60 | console_initcall(hvc_tile_console_init); |
| 61 | |
| 62 | static int __init hvc_tile_init(void) |
| 63 | { |
Vasiliy Kulikov | 6496a5c | 2010-09-12 22:57:14 +0400 | [diff] [blame] | 64 | struct hvc_struct *s; |
| 65 | s = hvc_alloc(0, 0, &hvc_tile_get_put_ops, 128); |
| 66 | return IS_ERR(s) ? PTR_ERR(s) : 0; |
Chris Metcalf | 867e359 | 2010-05-28 23:09:12 -0400 | [diff] [blame] | 67 | } |
| 68 | device_initcall(hvc_tile_init); |