On 05.11.15 22:47, Nathan Whitehorn wrote:
On 11/05/15 13:24, Andreas Tobler wrote:
Hi Nathan, Warner,
first, I had the feeling that I have to provide a fast solution which
makes PowerMacs usable again. I am aware that the committed version
doesn't win a prize.
Thank you!
Also, I didn't know that we have AIM & FDT, Nathan which one?
PS3 and POWER8 systems are AIM+FDT. Neither of these have I2C busses in
their FDTs, so the impact is low for now, but it makes me a little nervous.
Ah, maybe I have luck to convince my son to handover the PS3 to me. He
has a PS4 too...
About the POWER8, well, far away from my budget.....
On 05.11.15 21:26, Warner Losh wrote:
I'd suggested that this be driven off a global quirk like
u_int fdt_quirks;
#define FDT_QUIRK_8BIT_IIC_ADDR 1
...
In openfirm.h?
I'd really prefer an explicit platform check in ofw_iicbus.c for this by
looking at the compatible property of the root node. If this ever comes
up on another system, we can modify it, but I think it won't.
Attached a working proposal.
It does work with the Apple 8-bit I2C addresses and the fan regulation
works.
But I need a kind soul to test this on an arm board with Linux based FDT
I2C devices which have 7-bit addresses.
Ian?
Thanks in advance,
Andreas
if (fdt_quirks & FDT_QUIRK_8BIT_IIC_ADDR)
dinfo->opd_dinfo.addr = paddr;
else
dinfo->opd_dinfo.addr = paddr << 1;
And the platform code, whatever that means, would set it when it "knows"
this is the case.
If I get that right, I'd have to set the fdt_quirk in each I2C parent,
like kiic.c and smu.c?
On Thu, Nov 5, 2015 at 12:56 PM, Nathan Whitehorn
<nwhiteh...@freebsd.org <mailto:nwhiteh...@freebsd.org>> wrote:
I'm not sure this is the best way to do this: we have AIM systems
that use FDT, for example. Can we make it a quirk in the host-bus
driver? Or do a run-time check to see if the root node has MacRISC
in its compatible property?
The 'compatible property' approach would be limited/isolated to one
file (ofw_iicbus.c) in comparison to the quirk approach where I'd have
to adapt at least (known now) four files.
I can go either way, just my thoughts.
Index: sys/dev/ofw/ofw_iicbus.c
===================================================================
--- sys/dev/ofw/ofw_iicbus.c (revision 290373)
+++ sys/dev/ofw/ofw_iicbus.c (working copy)
@@ -101,9 +101,13 @@
{
struct iicbus_softc *sc = IICBUS_SOFTC(dev);
struct ofw_iicbus_devinfo *dinfo;
- phandle_t child, node;
+ phandle_t child, node, root;
pcell_t freq, paddr;
device_t childdev;
+ ssize_t compatlen;
+ char compat[255];
+ char *curstr;
+ u_int iic_addr_8bit = 0;
sc->dev = dev;
mtx_init(&sc->lock, "iicbus", NULL, MTX_DEF);
@@ -125,6 +129,21 @@
bus_enumerate_hinted_children(dev);
/*
+ * Check if we're running on a PowerMac, needed for the I2C
+ * address below.
+ */
+ root = OF_peer(0);
+ compatlen = OF_getprop(root, "compatible", compat,
+ sizeof(compat));
+ if (compatlen != -1) {
+ for (curstr = compat; curstr < compat + compatlen;
+ curstr += strlen(curstr) + 1) {
+ if (strncmp(curstr, "MacRISC", 7) == 0)
+ iic_addr_8bit = 1;
+ }
+ }
+
+ /*
* Attach those children represented in the device tree.
*/
for (child = OF_child(node); child != 0; child = OF_peer(child)) {
@@ -153,11 +172,11 @@
* Linux FDT data contains 7-bit values, so shift them up to
* 8-bit format.
*/
-#ifdef AIM
- dinfo->opd_dinfo.addr = paddr;
-#else
- dinfo->opd_dinfo.addr = paddr << 1;
-#endif
+ if (iic_addr_8bit)
+ dinfo->opd_dinfo.addr = paddr;
+ else
+ dinfo->opd_dinfo.addr = paddr << 1;
+
if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, child) !=
0) {
free(dinfo, M_DEVBUF);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"