1217044Snwhitehorn/*- 2217044Snwhitehorn * Copyright (C) 2010 Nathan Whitehorn 3217044Snwhitehorn * All rights reserved. 4217044Snwhitehorn * 5217044Snwhitehorn * Redistribution and use in source and binary forms, with or without 6217044Snwhitehorn * modification, are permitted provided that the following conditions 7217044Snwhitehorn * are met: 8217044Snwhitehorn * 1. Redistributions of source code must retain the above copyright 9217044Snwhitehorn * notice, this list of conditions and the following disclaimer. 10217044Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 11217044Snwhitehorn * notice, this list of conditions and the following disclaimer in the 12217044Snwhitehorn * documentation and/or other materials provided with the distribution. 13217044Snwhitehorn * 14217044Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15217044Snwhitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16217044Snwhitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17217044Snwhitehorn * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18217044Snwhitehorn * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19217044Snwhitehorn * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20217044Snwhitehorn * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21217044Snwhitehorn * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22217044Snwhitehorn * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23217044Snwhitehorn * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24217044Snwhitehorn */ 25217044Snwhitehorn 26217044Snwhitehorn#include <sys/cdefs.h> 27217044Snwhitehorn__FBSDID("$FreeBSD$"); 28217044Snwhitehorn 29217044Snwhitehorn#include <stand.h> 30217044Snwhitehorn#include "bootstrap.h" 31217044Snwhitehorn#include "font.h" 32217044Snwhitehorn#include "lv1call.h" 33217044Snwhitehorn#include "ps3.h" 34217044Snwhitehorn 35217044Snwhitehorn#define FONT_SIZE 14 36217044Snwhitehorn#define FONT dflt_font_14 37217044Snwhitehorn#define XMARGIN 40 38217044Snwhitehorn#define YMARGIN 30 39217044Snwhitehorn#define BG_COLOR 0x00000000 40217044Snwhitehorn#define FG_COLOR 0xffffffff 41217044Snwhitehorn 42217044Snwhitehorn#define FB_SIZE (16*1024*1024) 43217044Snwhitehornuint64_t fb_paddr = 0; 44217044Snwhitehornuint32_t *fb_vaddr; 45217044Snwhitehorn 46217044Snwhitehornint fb_width, fb_height; 47217044Snwhitehornint x, y; 48217044Snwhitehorn 49217044Snwhitehornstatic void ps3cons_probe(struct console *cp); 50217044Snwhitehornstatic int ps3cons_init(int arg); 51217044Snwhitehornstatic void ps3cons_putchar(int c); 52217044Snwhitehornstatic int ps3cons_getchar(); 53217044Snwhitehornstatic int ps3cons_poll(); 54217044Snwhitehorn 55217044Snwhitehornstruct console ps3console = { 56217044Snwhitehorn "ps3", 57217044Snwhitehorn "Playstation 3 Framebuffer", 58217044Snwhitehorn 0, 59217044Snwhitehorn ps3cons_probe, 60217044Snwhitehorn ps3cons_init, 61217044Snwhitehorn ps3cons_putchar, 62217044Snwhitehorn ps3cons_getchar, 63217044Snwhitehorn ps3cons_poll, 64217044Snwhitehorn}; 65217044Snwhitehorn 66217044Snwhitehornstatic void 67217044Snwhitehornps3cons_probe(struct console *cp) 68217044Snwhitehorn{ 69217044Snwhitehorn /* XXX: Get from HV */ 70217044Snwhitehorn fb_width = 720; 71217044Snwhitehorn fb_height = 480; 72217044Snwhitehorn 73217044Snwhitehorn cp->c_flags |= C_PRESENTIN|C_PRESENTOUT; 74217044Snwhitehorn} 75217044Snwhitehorn 76217044Snwhitehornstatic int 77217044Snwhitehornps3cons_init(int arg) 78217044Snwhitehorn{ 79217044Snwhitehorn uint64_t fbhandle, fbcontext; 80217044Snwhitehorn int i; 81217044Snwhitehorn 82217044Snwhitehorn lv1_gpu_open(0); 83217044Snwhitehorn lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET, 84217044Snwhitehorn 0,0,0,0); 85217044Snwhitehorn lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET, 86217044Snwhitehorn 0,0,1,0); 87217044Snwhitehorn lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, 88217044Snwhitehorn 0,L1GPU_DISPLAY_SYNC_VSYNC,0,0); 89217044Snwhitehorn lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, 90217044Snwhitehorn 1,L1GPU_DISPLAY_SYNC_VSYNC,0,0); 91217044Snwhitehorn lv1_gpu_memory_allocate(FB_SIZE, 0, 0, 0, 0, &fbhandle, &fb_paddr); 92217044Snwhitehorn lv1_gpu_context_allocate(fbhandle, 0, &fbcontext); 93217044Snwhitehorn 94217044Snwhitehorn lv1_gpu_context_attribute(fbcontext, 95217044Snwhitehorn L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0); 96217044Snwhitehorn lv1_gpu_context_attribute(fbcontext, 97217044Snwhitehorn L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0); 98217044Snwhitehorn 99217044Snwhitehorn fb_vaddr = ps3mmu_mapdev(fb_paddr, FB_SIZE); 100217044Snwhitehorn 101217044Snwhitehorn x = y = 0; 102217044Snwhitehorn 103217044Snwhitehorn /* Blank console */ 104217044Snwhitehorn for (i = 0; i < fb_width*fb_height; i++) 105217044Snwhitehorn fb_vaddr[i] = BG_COLOR; 106217044Snwhitehorn 107217044Snwhitehorn return (0); 108217044Snwhitehorn} 109217044Snwhitehorn 110217044Snwhitehornstatic void 111217044Snwhitehornps3cons_putchar(int c) 112217044Snwhitehorn{ 113217044Snwhitehorn uint32_t fg, bg; 114217044Snwhitehorn uint32_t *addr; 115217044Snwhitehorn int i, j, k; 116217044Snwhitehorn u_char *p; 117217044Snwhitehorn 118217044Snwhitehorn fg = FG_COLOR; 119217044Snwhitehorn bg = BG_COLOR; 120217044Snwhitehorn 121217044Snwhitehorn switch (c) { 122217044Snwhitehorn case '\0': 123217044Snwhitehorn break; 124217044Snwhitehorn case '\r': 125217044Snwhitehorn x = 0; 126217044Snwhitehorn break; 127217044Snwhitehorn case '\n': 128217044Snwhitehorn y += FONT_SIZE; 129217044Snwhitehorn break; 130217044Snwhitehorn case '\b': 131217044Snwhitehorn x = max(0, x - 8); 132217044Snwhitehorn break; 133217044Snwhitehorn default: 134217044Snwhitehorn /* Wrap long lines */ 135217044Snwhitehorn if (x + XMARGIN + FONT_SIZE > fb_width - XMARGIN) { 136217044Snwhitehorn y += FONT_SIZE; 137217044Snwhitehorn x = 0; 138217044Snwhitehorn } 139217044Snwhitehorn 140217044Snwhitehorn if (y + YMARGIN + FONT_SIZE > fb_height - YMARGIN) 141217044Snwhitehorn y = 0; 142217044Snwhitehorn 143217044Snwhitehorn addr = fb_vaddr + (y + YMARGIN)*fb_width + (x + XMARGIN); 144217044Snwhitehorn p = FONT + c*FONT_SIZE; 145217044Snwhitehorn 146217044Snwhitehorn for (i = 0; i < FONT_SIZE; i++) { 147217044Snwhitehorn for (j = 0, k = 7; j < 8; j++, k--) { 148217044Snwhitehorn if ((p[i] & (1 << k)) == 0) 149217044Snwhitehorn *(addr + j) = bg; 150217044Snwhitehorn else 151217044Snwhitehorn *(addr + j) = fg; 152217044Snwhitehorn } 153217044Snwhitehorn 154217044Snwhitehorn addr += fb_width; 155217044Snwhitehorn } 156217044Snwhitehorn 157217044Snwhitehorn x += 8; 158217044Snwhitehorn break; 159217044Snwhitehorn } 160217044Snwhitehorn} 161217044Snwhitehorn 162217044Snwhitehornstatic int 163217044Snwhitehornps3cons_getchar() 164217044Snwhitehorn{ 165217044Snwhitehorn return (-1); 166217044Snwhitehorn} 167217044Snwhitehorn 168217044Snwhitehornstatic int 169217044Snwhitehornps3cons_poll() 170217044Snwhitehorn{ 171217044Snwhitehorn return (0); 172217044Snwhitehorn} 173217044Snwhitehorn 174