[OpenBIOS] [PATCHv2 09/14] sbus/tcx: implement probe_self() wrapper
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sun Aug 11 09:52:25 CEST 2013
Implement a C wrapper around the Forth probe-self word and test it by moving
TCX package properties to tcx.fs.
Note that the probe-self-sbus word is currently hard-coded to invoke the TCX
driver FCode - this is only temporary and will be replaced when we have a
working cpeek implementation.
Also remove the creation of the SUNW,tcx package from tree.fs since this is
now done as part of probe-self-sbus.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
openbios-devel/arch/sparc32/tree.fs | 19 ----------------
openbios-devel/drivers/sbus.c | 41 ++++++++++++++++++++++++-----------
openbios-devel/drivers/sbus.fs | 18 +++++++++++++++
openbios-devel/drivers/tcx.fs | 25 +++++++++++++++++++++
4 files changed, 71 insertions(+), 32 deletions(-)
diff --git a/openbios-devel/arch/sparc32/tree.fs b/openbios-devel/arch/sparc32/tree.fs
index 58e8339..c82bb17 100644
--- a/openbios-devel/arch/sparc32/tree.fs
+++ b/openbios-devel/arch/sparc32/tree.fs
@@ -70,25 +70,6 @@ finish-device
" /iommu/sbus" find-device
new-device
- " SUNW,tcx" device-name
- " display" device-type
- h# 1d encode-int " vbporch" property
- h# a0 encode-int " hbporch" property
- h# 06 encode-int " vsync" property
- h# 88 encode-int " hsync" property
- h# 03 encode-int " vfporch" property
- h# 18 encode-int " hfporch" property
- h# 03dfd240 encode-int " pixfreq" property
- h# 3c encode-int " vfreq" property
- h# 300 encode-int " height" property
- h# 400 encode-int " width" property
- h# 400 encode-int " linebytes" property
- 5 encode-int 0 encode-int encode+ " intr" property
- 5 encode-int " interrupts" property
-finish-device
-
-" /iommu/sbus" find-device
-new-device
" espdma" device-name
external
: encode-unit encode-unit-sbus ;
diff --git a/openbios-devel/drivers/sbus.c b/openbios-devel/drivers/sbus.c
index 5f2592f..3257142 100644
--- a/openbios-devel/drivers/sbus.c
+++ b/openbios-devel/drivers/sbus.c
@@ -141,7 +141,7 @@ uint16_t graphic_depth;
static void
ob_tcx_init(unsigned int slot, const char *path)
{
- phandle_t chosen, aliases;
+ phandle_t chosen;
push_str(path);
fword("find-device");
@@ -342,18 +342,6 @@ ob_tcx_init(unsigned int slot, const char *path)
}
bind_func("hw-set-color", tcx_hw_set_color);
-
- /* Currently we don't have an SBus probe routine, so execute FCode
- directly */
- feval("['] tcx-driver-fcode 2 cells + 1 byte-load");
-
- chosen = find_dev("/chosen");
- push_str(path);
- fword("open-dev");
- set_int_property(chosen, "screen", POP());
-
- aliases = find_dev("/aliases");
- set_property(aliases, "screen", path, strlen(path) + 1);
}
static void
@@ -445,11 +433,36 @@ ob_macio_init(unsigned int slot, uint64_t base, unsigned long offset)
}
static void
+sbus_probe_self(unsigned int slot, unsigned long offset)
+{
+ /* Wrapper for calling probe-self in Forth. This is mainly because some
+ drivers don't handle properties correctly when the sbus node is set
+ as the current instance during probe. */
+ char buf[6];
+
+ /* Make the sbus node the current instance and active package for probing */
+ feval("active-package my-self");
+ push_str("/iommu/sbus");
+ feval("open-dev to my-self");
+
+ PUSH(0);
+ PUSH(0);
+ snprintf(buf, 6, "%d,%ld", slot, offset);
+ push_str(buf);
+ fword("2dup");
+ fword("probe-self-sbus");
+
+ /* Restore */
+ feval("to my-self active-package!");
+}
+
+static void
sbus_probe_slot_ss5(unsigned int slot, uint64_t base)
{
// OpenBIOS and QEMU don't know how to do Sbus probing
switch(slot) {
case 3: // SUNW,tcx
+ sbus_probe_self(slot, 0);
ob_tcx_init(slot, "/iommu/sbus/SUNW,tcx");
break;
case 4:
@@ -472,6 +485,7 @@ sbus_probe_slot_ss10(unsigned int slot, uint64_t base)
// OpenBIOS and QEMU don't know how to do Sbus probing
switch(slot) {
case 2: // SUNW,tcx
+ sbus_probe_self(slot, 0);
ob_tcx_init(slot, "/iommu/sbus/SUNW,tcx");
break;
case 0xf: // le, esp, bpp, power-management
@@ -490,6 +504,7 @@ sbus_probe_slot_ss600mp(unsigned int slot, uint64_t base)
// OpenBIOS and QEMU don't know how to do Sbus probing
switch(slot) {
case 2: // SUNW,tcx
+ sbus_probe_self(slot, 0);
ob_tcx_init(slot, "/iommu/sbus/SUNW,tcx");
break;
case 0xf: // le, esp, bpp, power-management
diff --git a/openbios-devel/drivers/sbus.fs b/openbios-devel/drivers/sbus.fs
index 73cd23b..fa8c95c 100644
--- a/openbios-devel/drivers/sbus.fs
+++ b/openbios-devel/drivers/sbus.fs
@@ -58,3 +58,21 @@
: map-out-sbus ( virt )
" map-out" $call-parent
;
+
+\ -------------------------------------------------------------------------
+\ SBus probe
+\ -------------------------------------------------------------------------
+
+: probe-self-sbus ( arg-adr arg-len reg-adr reg-len fcode-adr fcode-len -- )
+ 2drop
+ new-device
+ set-args
+
+ \ Note: this is currently hardcoded to TCX for testing as we don't have
+ \ cpeek (yet). Once cpeek is in place, adapting this to probe any slot
+ \ will be faily easy.
+ " tcx-driver-fcode" $find drop 2 cells +
+ 1 byte-load
+
+ finish-device
+;
diff --git a/openbios-devel/drivers/tcx.fs b/openbios-devel/drivers/tcx.fs
index 19fa555..72f4762 100644
--- a/openbios-devel/drivers/tcx.fs
+++ b/openbios-devel/drivers/tcx.fs
@@ -4,6 +4,8 @@
\ This is the Forth source for an Fcode payload to initialise
\ the QEMU TCX graphics card.
\
+\ (C) Copyright 2013 Mark Cave-Ayland
+\
fcode-version3
@@ -30,6 +32,13 @@ fcode-version3
then
;
+\
+\ Installation
+\
+
+" SUNW,tcx" device-name
+" display" device-type
+
: qemu-tcx-driver-install ( -- )
openbios-video-addr to frame-buffer-adr
default-font set-font
@@ -38,6 +47,22 @@ fcode-version3
;
: qemu-tcx-driver-init
+
+ h# 1d encode-int " vbporch" property
+ h# a0 encode-int " hbporch" property
+ h# 06 encode-int " vsync" property
+ h# 88 encode-int " hsync" property
+ h# 03 encode-int " vfporch" property
+ h# 18 encode-int " hfporch" property
+ h# 03dfd240 encode-int " pixfreq" property
+ h# 3c encode-int " vfreq" property
+ h# 300 encode-int " height" property
+ h# 400 encode-int " width" property
+ h# 400 encode-int " linebytes" property
+
+ 5 encode-int 0 encode-int encode+ " intr" property
+ 5 encode-int " interrupts" property
+
['] qemu-tcx-driver-install is-install
;
--
1.7.10.4
More information about the OpenBIOS
mailing list