Update of /cvsroot/gc-linux/linux/arch/ppc/platforms In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29422/arch/ppc/platforms Modified Files: Makefile Added Files: gcn-con.c gcn-con.h gcn-dvdcover.c gcn-rsw.c Removed Files: console.c console.h gc-dvdcover.c gc-rsw.c Log Message: - Transformed console.{c,h} into gcn-con.{c,h} Renamed consistenly parts of the code, and rearranged it a little bit. Remember that this is not a fully functional console but a console suitable for early debugging as it is available as soon as the setup arch code is run. - Moved gc-dvdcover.c to gcn-dvdcover.c. Renamed consistenly parts of the code. - Moved gc-rsw.c to gcn-rsw.c. Renamed consistenly parts of the code. - Added copyright headers to files. --- NEW FILE: gcn-con.c --- /* * arch/ppc/platforms/gcn-con.c * * Nintendo GameCube early debug console * Copyright (C) 2004 The GameCube Linux Team * * Based on console.c by tmbinc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * */ #include <linux/string.h> #include <linux/console.h> #include <linux/font.h> #include <linux/cache.h> #include "gamecube.h" #include "gcn-con.h" extern struct font_desc font_vga_8x16; #define FONT_XSIZE 8 #define FONT_YSIZE 16 #define FONT_XFACTOR 1 #define FONT_YFACTOR 1 #define FONT_XGAP 2 #define FONT_YGAP 0 #define COLOR_WHITE 0xFF80FF80 #define COLOR_BLACK 0x00800080 struct console_data_s { unsigned char *framebuffer; int xres, yres, stride; unsigned char *font; int cursor_x, cursor_y; int foreground, background; int border_left, border_right, border_top, border_bottom; int scrolled_lines; }; static struct console_data_s *default_console; #if 0 static int console_set_color(int background, int foreground) { default_console->foreground = foreground; default_console->background = background; return 0; } #endif static void console_drawc(struct console_data_s *con, int x, int y, unsigned char c) { x >>= 1; int ax, ay; unsigned long *ptr = (unsigned long *)(con->framebuffer + con->stride * y + x * 4); for (ay = 0; ay < FONT_YSIZE; ay++) { #if FONT_XFACTOR == 2 for (ax = 0; ax < 8; ax++) { unsigned long color; if ((con->font[c * FONT_YSIZE + ay] << ax) & 0x80) color = con->foreground; else color = con->background; #if FONT_YFACTOR == 2 // pixel doubling: we write u32 ptr[ay * 2 * con->stride / 4 + ax] = color; // line doubling ptr[(ay * 2 + 1) * con->stride / 4 + ax] = color; #else ptr[ay * con->stride / 4 + ax] = color; #endif } #else for (ax = 0; ax < 4; ax++) { unsigned long color[2]; int bits = (con->font[c * FONT_YSIZE + ay] << (ax * 2)); if (bits & 0x80) color[0] = con->foreground; else color[0] = con->background; if (bits & 0x40) color[1] = con->foreground; else color[1] = con->background; ptr[ay * con->stride / 4 + ax] = (color[0] & 0xFFFF00FF) | (color[1] & 0x0000FF00); } #endif } } static void console_putc(struct console_data_s *con, char c) { switch (c) { case '\n': con->cursor_y += FONT_YSIZE * FONT_YFACTOR + FONT_YGAP; con->cursor_x = con->border_left; break; default: console_drawc(con, con->cursor_x, con->cursor_y, c); con->cursor_x += FONT_XSIZE * FONT_XFACTOR + FONT_XGAP; if ((con->cursor_x + (FONT_XSIZE * FONT_XFACTOR)) > con->border_right) { con->cursor_y += FONT_YSIZE * FONT_YFACTOR + FONT_YGAP; con->cursor_x = con->border_left; } } if ((con->cursor_y + FONT_YSIZE * FONT_YFACTOR) >= con->border_bottom) { memcpy(con->framebuffer, con->framebuffer + con->stride * (FONT_YSIZE * FONT_YFACTOR + FONT_YGAP), con->stride * con->yres - FONT_YSIZE); int cnt = (con->stride * (FONT_YSIZE * FONT_YFACTOR + FONT_YGAP)) / 4; unsigned long *ptr = (unsigned long *)(con->framebuffer + con->stride * (con->yres - FONT_YSIZE)); while (cnt--) *ptr++ = con->background; con->cursor_y -= FONT_YSIZE * FONT_YFACTOR + FONT_YGAP; } flush_dcache_range((unsigned long)con->framebuffer, (unsigned long)(con->framebuffer + con->stride * con->yres)); } static void console_puts(struct console_data_s *con, const char *string) { while (*string) console_putc(con, *string++); } static void console_init(struct console_data_s *con, void *framebuffer, int xres, int yres, int stride) { int c; unsigned long *p; con->framebuffer = framebuffer; con->xres = xres; con->yres = yres; con->border_left = 0; con->border_top = 0; con->border_right = con->xres; con->border_bottom = con->yres; con->stride = stride; con->cursor_x = con->cursor_y = 0; con->font = font_vga_8x16.data; con->foreground = COLOR_WHITE; con->background = COLOR_BLACK; con->scrolled_lines = 0; c = con->xres * con->yres / 2; p = (unsigned long *)con->framebuffer; while (c--) *p++ = con->background; default_console = con; } static struct console_data_s gcn_con_data; static struct console gcn_con = { .name = "gcn-con", .flags = CON_PRINTBUFFER, .index = -1, }; /** * */ void gcn_con_puts(const char *s) { if (!default_console) gcn_con_init(); console_puts(default_console, s); } /** * */ void gcn_con_putc(char c) { if (!default_console) gcn_con_init(); console_putc(default_console, c); } /** * */ static void gcn_con_write(struct console *co, const char *b, unsigned int count) { while (count--) console_putc(default_console, *b++); } /** * */ void gcn_con_init(void) { console_init(&gcn_con_data, (void *)(0xd0000000 | GCN_XFB_START), 640, 576, 640 * 2); gcn_con_puts("gcn-con: console initialized.\n"); gcn_con.write = gcn_con_write; register_console(&gcn_con); } --- NEW FILE: gcn-con.h --- /* * arch/ppc/platforms/gcn-con.h * * Nintendo GameCube early debug console definitions * Copyright (C) 2004 The GameCube Linux Team * * Based on console.h by tmbinc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * */ #ifndef __GCN_CON_H #define __GCN_CON_H void gcn_con_init(void); void gcn_con_puts(const char *); void gcn_con_putc(char); #endif /* __GCN_CON_H */ --- NEW FILE: gcn-dvdcover.c --- /* * arch/ppc/platforms/gcn-dvdcover.c * * Nintendo GameCube DVD cover driver * Copyright (C) 2004 Stefan Esser * Copyright (C) 2004 The GameCube Linux Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <asm/io.h> #define DVD_IRQ 2 #define DI_DISR 0xcc006000 /* DI Status Register */ #define DI_DISR_BRKINT (1<<6) #define DI_DISR_BRKINTMASK (1<<5) #define DI_DISR_TCINT (1<<4) #define DI_DISR_TCINTMASK (1<<3) #define DI_DISR_DEINT (1<<2) #define DI_DISR_DEINTMASK (1<<1) #define DI_DISR_BRK (1<<0) #define DI_DICVR 0xcc006004 /* DI Cover Register */ #define DI_DICVR_CVRINT (1<<2) #define DI_DICVR_CVRINTMASK (1<<1) #define DI_DICVR_CVR (1<<0) #define DI_DICMDBUF0 0xcc006008 /* DI Command Buffer 0 */ #define DI_DICR 0xcc00601c /* DI Control Register */ #define DI_DICR_RW (1<<2) #define DI_DICR_DMA (1<<1) #define DI_DICR_TSTART (1<<0) #define DI_CMD_STOP (0xE3) #define DRV_MODULE_NAME "gcn-dvdcover" #define DRV_DESCRIPTION "Nintendo GameCube DVD cover driver" #define DRV_AUTHOR "Stefan Esser <se...@no...>" MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_AUTHOR); MODULE_LICENSE(GPL); #define PFX DRV_MODULE_NAME ": " #define di_printk(level, format, arg...) \ printk(level PFX format , ## arg) /** * */ static irqreturn_t gcn_dvdcover_handler(int this_irq, void *dev_id, struct pt_regs *regs) { unsigned long reason = readl(DI_DICVR); /* handle only DVD cover interrupts here */ if (reason & DI_DICVR_CVRINT) { writel(reason | DI_DICVR_CVRINT, DI_DICVR); di_printk(KERN_INFO, "DVD cover was %s.\n", (reason & DI_DICVR_CVR) ? "opened" : "closed"); return IRQ_HANDLED; } return IRQ_NONE; } /** * */ static int gcn_dvdcover_init(void) { unsigned long outval; int err; /* clear pending DI interrupts and mask new ones */ /* this prevents an annoying bug while we lack a complete DVD driver */ outval = DI_DISR_BRKINT | DI_DISR_TCINT | DI_DISR_DEINT; outval &= ~(DI_DISR_BRKINTMASK | DI_DISR_TCINTMASK | DI_DISR_DEINTMASK); writel(outval, DI_DISR); /* stop DVD motor */ writel(DI_CMD_STOP << 24, DI_DICMDBUF0); writel(DI_DICR_TSTART, DI_DICR); err = request_irq(DVD_IRQ, gcn_dvdcover_handler, 0, "Nintendo GameCube DVD", 0); if (err) { di_printk(KERN_ERR, "request of irq%d failed\n", DVD_IRQ); return err; } /* enable DVD cover interrupts */ writel(readl(DI_DICVR) | DI_DICVR_CVRINTMASK, DI_DICVR); return 0; } /** * */ static void gcn_dvdcover_exit(void) { free_irq(DVD_IRQ, 0); } module_init(gcn_dvdcover_init); module_exit(gcn_dvdcover_exit); --- NEW FILE: gcn-rsw.c --- /* * arch/ppc/platforms/gcn-rsw.c * * Nintendo GameCube reset switch driver * Copyright (C) 2004 Stefan Esser * Copyright (C) 2004 Albert Herranz * Copyright (C) 2004 The GameCube Linux Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/spinlock.h> #include <linux/delay.h> #include <linux/reboot.h> #ifdef CONFIG_KEXEC #include <linux/kexec.h> #endif #define RSW_IRQ 1 #define RSW_NORMAL_TIMEOUT 3 /* seconds */ #define RSW_EMERGENCY_PUSHES 10 typedef enum { IDLE = 0, /* nothing to do */ NORMAL_RESET, /* reboot requested */ EMERGENCY_RESET, /* try emergency reboot */ } gcn_rsw_state_t; struct gcn_rsw_private { gcn_rsw_state_t state; struct timer_list timer; unsigned long jiffies; int pushes; int timeout; spinlock_t lock; }; #define DRV_MODULE_NAME "gcn-rsw" #define DRV_DESCRIPTION "Nintendo GameCube reset switch driver" #define DRV_AUTHOR "Stefan Esser <se...@no...>" MODULE_DESCRIPTION(DRV_DESCRIPTION); MODULE_AUTHOR(DRV_AUTHOR); MODULE_LICENSE(GPL); #define PFX DRV_MODULE_NAME ": " #define rsw_printk(level, format, arg...) \ printk(level PFX format , ## arg) /* from kernel/sys.c */ extern void ctrl_alt_del(void); static struct gcn_rsw_private gcn_rsw_private = { .state = IDLE, .timeout = RSW_NORMAL_TIMEOUT, }; /** * */ static void gcn_rsw_normal_reset(unsigned long dummy) { ctrl_alt_del(); } /** * */ static void gcn_rsw_emergency_reset(void) { #ifdef CONFIG_KEXEC struct kimage *image; image = xchg(&kexec_image, 0); if (image) { machine_kexec(image); } #endif machine_restart(NULL); } /** * */ static irqreturn_t gcn_rsw_handler(int this_irq, void *data, struct pt_regs *regs) { struct gcn_rsw_private *priv = (struct gcn_rsw_private *)data; unsigned long flags; spin_lock_irqsave(priv->lock, flags); /* someone pushed the reset button */ switch (priv->state) { case IDLE: priv->state = NORMAL_RESET; printk(KERN_EMERG "Rebooting in %d seconds...\n", priv->timeout); printk(KERN_WARNING "Push the Reset button again to cancel reboot!\n"); /* schedule a reboot in a few seconds */ init_timer(&priv->timer); priv->timer.expires = jiffies + priv->timeout * HZ; priv->timer.function = (void (*)(unsigned long))gcn_rsw_normal_reset; add_timer(&priv->timer); priv->jiffies = jiffies; break; case NORMAL_RESET: if (time_before(jiffies, priv->jiffies + priv->timeout * HZ)) { /* the reset button was hit again before deadline */ del_timer(&priv->timer); priv->state = IDLE; printk(KERN_EMERG "Reboot cancelled!\n"); } else { /* * Time expired. System should be now restarting. * Go to emergency mode in case something goes bad. */ priv->state = EMERGENCY_RESET; priv->pushes = 0; printk(KERN_WARNING "SWITCHED TO EMERGENCY RESET MODE!\n" "Push %d times the Reset button to force" " a hard reset!\n" "NOTE THAT THIS COULD CAUSE DATA LOSS!\n", RSW_EMERGENCY_PUSHES); } break; case EMERGENCY_RESET: /* force a hard reset if the user insists ... */ if (++priv->pushes >= RSW_EMERGENCY_PUSHES) { spin_unlock_irqrestore(priv->lock, flags); gcn_rsw_emergency_reset(); return IRQ_HANDLED; } else { printk(KERN_INFO "%d/%d\n", priv->pushes, RSW_EMERGENCY_PUSHES); } break; } spin_unlock_irqrestore(priv->lock, flags); return IRQ_HANDLED; } /** * */ static int gcn_rsw_init(void) { int err; spin_lock_init(&gcn_rsw_private.lock); err = request_irq(RSW_IRQ, gcn_rsw_handler, 0, "Nintendo GameCube reset switch", (void *)&gcn_rsw_private); if (err) { rsw_printk(KERN_ERR, "request of irq%d failed\n", RSW_IRQ); } return err; } /** * */ static void gcn_rsw_exit(void) { free_irq(RSW_IRQ, &gcn_rsw_private); } module_init(gcn_rsw_init); module_exit(gcn_rsw_exit); Index: Makefile =================================================================== RCS file: /cvsroot/gc-linux/linux/arch/ppc/platforms/Makefile,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- Makefile 19 Oct 2004 22:58:36 -0000 1.14 +++ Makefile 19 Oct 2004 23:36:54 -0000 1.15 @@ -41,9 +41,9 @@ obj-$(CONFIG_SPRUCE) += spruce.o obj-$(CONFIG_LITE5200) += lite5200.o mpc5200.o obj-$(CONFIG_GAMECUBE) += gamecube.o gcn-rtc.o -obj-$(CONFIG_GAMECUBE_CONSOLE) += console.o -obj-$(CONFIG_GAMECUBE_RESET_SWITCH) += gc-rsw.o -obj-$(CONFIG_GAMECUBE_DVD_COVER) += gc-dvdcover.o +obj-$(CONFIG_GAMECUBE_CONSOLE) += gcn-con.o +obj-$(CONFIG_GAMECUBE_RESET) += gcn-rsw.o +obj-$(CONFIG_GAMECUBE_DVDCOVER) += gcn-dvdcover.o ifeq ($(CONFIG_SMP),y) obj-$(CONFIG_PPC_PMAC) += pmac_smp.o --- console.c DELETED --- --- console.h DELETED --- --- gc-dvdcover.c DELETED --- --- gc-rsw.c DELETED --- |