]> git.saurik.com Git - apple/xnu.git/blame - pexpert/ppc/pe_kprintf.c
xnu-792.24.17.tar.gz
[apple/xnu.git] / pexpert / ppc / pe_kprintf.c
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
6601e61a 4 * @APPLE_LICENSE_HEADER_START@
1c79356b 5 *
6601e61a
A
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
8f6c56a5 11 *
6601e61a
A
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
8f6c56a5
A
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
6601e61a
A
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
8f6c56a5 19 *
6601e61a 20 * @APPLE_LICENSE_HEADER_END@
1c79356b
A
21 */
22/*
23 * file: pe_kprintf.c
24 * PPC platform expert debugging output initialization.
25 */
26#include <stdarg.h>
27#include <machine/machine_routines.h>
28#include <pexpert/protos.h>
29#include <pexpert/pexpert.h>
30#include <pexpert/ppc/powermac.h>
91447636 31#include <pexpert/device_tree.h>
1c79356b
A
32#include <kern/debug.h>
33#include <kern/simple_lock.h>
34
35/* extern references */
36extern void init_display_putc(unsigned char*, int, int);
37extern void display_putc(char c);
38extern int scc_putc(int unit, int line, int c);
39extern void cnputc(char c);
40
41/* Internal routines -- eventually put this in serial driver */
42void serial_putc(char c);
43
44/* Globals */
45void (*PE_kputc)(char c) = 0;
46
47unsigned int disableSerialOuput = TRUE;
48
55e303ae 49vm_offset_t scc = 0;
1c79356b 50
55e303ae 51struct slock kprintf_lock;
1c79356b
A
52
53void PE_init_kprintf(boolean_t vm_initialized)
54{
1c79356b 55 unsigned int boot_arg;
91447636
A
56 int32_t cnt, size, serial_baud = -1;
57 DTEntry options;
58 char *str, baud[7];
1c79356b
A
59
60 if (PE_state.initialized == FALSE)
61 panic("Platform Expert not initialized");
62
91447636 63 if (PE_parse_boot_arg("debug", &boot_arg))
55e303ae 64 if(boot_arg & DB_KPRT) disableSerialOuput = FALSE;
1c79356b 65
91447636
A
66 if (DTLookupEntry(0, "/options", &options) == kSuccess) {
67 if (DTGetProperty(options, "input-device", &str, &size) == kSuccess) {
68 if ((size > 5) && !strncmp("scca:", str, 5)) {
69 size -= 5;
70 str += 5;
71 if (size <= 6) {
72 strncpy(baud, str, size);
73 baud[size] = '\0';
74 gPESerialBaud = strtol(baud, 0, 0);
75 }
76 }
77 }
78 if (DTGetProperty(options, "output-device", &str, &size) == kSuccess) {
79 if ((size > 5) && !strncmp("scca:", str, 5)) {
80 size -= 5;
81 str += 5;
82 if (size <= 6) {
83 strncpy(baud, str, size);
84 baud[size] = '\0';
85 gPESerialBaud = strtol(baud, 0, 0);
86 }
87 }
88 }
89 }
90
91 /* Check the boot-args for new serial baud. */
92 if (PE_parse_boot_arg("serialbaud", &serial_baud))
93 if (serial_baud != -1) gPESerialBaud = serial_baud;
94
55e303ae 95 if( (scc = PE_find_scc())) { /* See if we can find the serial port */
6601e61a 96 scc = io_map_spec(scc, 0x1000); /* Map it in */
91447636 97 initialize_serial((void *)scc, gPESerialBaud); /* Start up the serial driver */
1c79356b
A
98 PE_kputc = serial_putc;
99
100 simple_lock_init(&kprintf_lock, 0);
55e303ae
A
101 } else
102 PE_kputc = cnputc;
1c79356b
A
103
104#if 0
105 /*
106 * FUTURE: eventually let the boot command determine where
107 * the debug output will be, serial, video, etc.
108 */
109 switch (PE_state.debug_video.v_display) {
110 case kDebugTypeSerial:
111 PE_kputc = serial_putc;
112 break;
113
114 case kDebugTypeDisplay:
115 init_display_putc( (unsigned char*)PE_state.debug_video.v_baseAddr,
116 PE_state.debug_video.v_rowBytes,
117 PE_state.debug_video.v_height);
118 PE_kputc = display_putc;
119 break;
120
121 default:
122 PE_state.debug_video.v_baseAddr = 0;
123 }
124#endif
125}
126
127void serial_putc(char c)
128{
129 (void) scc_putc(0, 1, c);
130 if (c == '\n') (void) scc_putc(0, 1, '\r');
131
132#if 0
133 (void) scc_putc(0, (int)PE_state.debug_video.v_baseAddr, c);
134 if (c == '\n') (void) scc_putc(0, (int)PE_state.debug_video.v_baseAddr, '\r');
135#endif
136}
137
138void kprintf(const char *fmt, ...)
139{
140 va_list listp;
141 boolean_t state;
142
143 state = ml_set_interrupts_enabled(FALSE);
144 simple_lock(&kprintf_lock);
145
146 if (!disableSerialOuput) {
147 va_start(listp, fmt);
148 _doprnt(fmt, &listp, PE_kputc, 16);
149 va_end(listp);
150 }
151
152 simple_unlock(&kprintf_lock);
153 ml_set_interrupts_enabled(state);
154}
155