[OpenBIOS] [PATCH 2/2] sbus: add probe for display device
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sun Aug 11 13:06:13 CEST 2013
If we are unable to find valid FCode at the probe address then we fallback to
the internal TCX driver in order to preserve existing behaviour.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
openbios-devel/drivers/sbus.c | 30 ++++++++++++++++++++++++++++--
openbios-devel/drivers/sbus.fs | 27 ++++++++++++++++++---------
2 files changed, 46 insertions(+), 11 deletions(-)
diff --git a/openbios-devel/drivers/sbus.c b/openbios-devel/drivers/sbus.c
index 6ef6bda..128f3a8 100644
--- a/openbios-devel/drivers/sbus.c
+++ b/openbios-devel/drivers/sbus.c
@@ -141,8 +141,34 @@ uint16_t graphic_depth;
static void
ob_tcx_init(unsigned int slot, const char *path)
{
- push_str(path);
- fword("find-device");
+ phandle_t ph = 0;
+ int found = 0;
+ char buf[6];
+
+ while ((ph = dt_iterate_type(ph, "display"))) {
+ found = -1;
+ }
+
+ if (!found) {
+ printk("No display device located during SBus probe - falling back to internal TCX driver\n");
+
+ /* Make the sbus node the current instance and active package for probing */
+ feval("active-package my-self");
+ push_str("/iommu/sbus");
+ feval("2dup find-device open-dev to my-self");
+
+ fword("new-device");
+ PUSH(0);
+ PUSH(0);
+ snprintf(buf, 6, "%d,0", slot);
+ push_str(buf);
+ fword("set-args");
+ feval("['] tcx-driver-fcode 2 cells + 1 byte-load");
+ fword("finish-device");
+
+ /* Restore */
+ feval("to my-self active-package!");
+ }
}
static void
diff --git a/openbios-devel/drivers/sbus.fs b/openbios-devel/drivers/sbus.fs
index fa8c95c..22f3f72 100644
--- a/openbios-devel/drivers/sbus.fs
+++ b/openbios-devel/drivers/sbus.fs
@@ -64,15 +64,24 @@
\ -------------------------------------------------------------------------
: 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
+ ['] decode-unit-sbus catch if
+ 2drop 2drop 2drop 2drop
+ exit
+ then
+
+ h# 10000 map-in-sbus
+
+ dup c@
+ dup h# f1 = swap h# fd = or if
+ new-device
+ >r set-args r>
+ dup 1 byte-load
+ finish-device
+ else
+ nip nip nip nip
+ ." Invalid FCode start byte" cr
+ then
- finish-device
+ h# 10000 map-out-sbus
;
--
1.7.10.4
More information about the OpenBIOS
mailing list