> Date: Fri, 18 Nov 2022 14:36:18 +0100
> From: Jan Stary <h...@stare.cz>
> 
> On Nov 18 12:51:32, mark.kette...@xs4all.nl wrote:
> > > Date: Fri, 18 Nov 2022 12:19:46 +0100
> > > From: Jan Stary <h...@stare.cz>
> > > 
> > > On Nov 17 14:44:59, h...@stare.cz wrote:
> > > > This is a freshly installed current/arm64 on a MAcBook Air,
> > > > model 2337 (M1, 2020); full dmesg below.
> > > 
> > > Upgrading the co-existing macOS to 12.6.1
> > > seems to have brken the working bsd installation.
> > > The booting bsd kernel gets to 
> > > 
> > > [...]
> > > exuart0 at simplebus0
> > > exuart1 at simplebus0
> > > aplspmi0 at simplebus0
> > > aplpmu0 at aplspmi0 sid 0xf
> > > aplsmc0 at simplebus0
> > > 
> > > and moves no further. Same with booting bsd.rd,
> > > same with booting the latest one from snapshots (off a USB stick).
> > > 
> > > Can the macOS upgrade be related? Is this known?
> > > The macOS upgrade also switched the default boot to macOS
> > > (while after the bsd install, the avahi boot went to bsd by default).
> > 
> > Possible.  In principle the OpenBSD install comes with its own set of
> > Apple firmwares.  But the SMC firmware (like the NVMe firmware) is
> > stored in some sort of ROM and therefore "global".  The macOS upgrade
> > might have updated the SMC in a way that is incompatible with the
> > aplsmc(4) driver.
> 
> Thanks for the insight.
> Is there something I can do to debug it?
> Also, the line that normally follows is
> 
>       aplsart0 at simplebus0
> 
> and some time ago there was a warning at this list
> not to upgrade to macOS 13 specifically related to aplsart
> - could it be that's in fact what's broken now (as opposed to SMC)?
> 
> Jan

Here is a diff that changes the rtkit code to not spin forever.  That
might get you going again.  You'll need to boot a kernel with this
diff from a USB stick or something like that.

Cheers,

Mark


Index: arch/arm64/dev/aplmbox.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/aplmbox.c,v
retrieving revision 1.3
diff -u -p -r1.3 aplmbox.c
--- arch/arm64/dev/aplmbox.c    9 Nov 2022 19:18:11 -0000       1.3
+++ arch/arm64/dev/aplmbox.c    18 Nov 2022 16:12:35 -0000
@@ -187,7 +187,7 @@ aplmbox_recv(void *cookie, void *data, s
 
        ctrl = HREAD4(sc, MBOX_I2A_CTRL);
        if (ctrl & MBOX_I2A_CTRL_EMPTY)
-               return EAGAIN;
+               return EWOULDBLOCK;
 
        msg->data0 = HREAD8(sc, MBOX_I2A_RECV0);
        msg->data1 = HREAD8(sc, MBOX_I2A_RECV1);
Index: arch/arm64/dev/rtkit.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/rtkit.c,v
retrieving revision 1.9
diff -u -p -r1.9 rtkit.c
--- arch/arm64/dev/rtkit.c      11 Nov 2022 11:45:10 -0000      1.9
+++ arch/arm64/dev/rtkit.c      18 Nov 2022 16:12:35 -0000
@@ -99,16 +99,7 @@ struct rtkit_state {
 int
 rtkit_recv(struct mbox_channel *mc, struct aplmbox_msg *msg)
 {
-       int error, timo;
-
-       for (timo = 0; timo < 10000; timo++) {
-               error = mbox_recv(mc, msg, sizeof(*msg));
-               if (error == 0)
-                       break;
-               delay(10);
-       }
-
-       return error;
+       return mbox_recv(mc, msg, sizeof(*msg));
 }
 
 int
@@ -468,36 +459,18 @@ rtkit_init(int node, const char *name, i
 int
 rtkit_boot(struct rtkit_state *state)
 {
-       struct mbox_channel *mc = state->mc;
-       int error;
-
        /* Wake up! */
-       error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE,
-           RTKIT_MGMT_PWR_STATE_ON);
-       if (error)
-               return error;
-
-       while (state->iop_pwrstate != RTKIT_MGMT_PWR_STATE_ON)
-               rtkit_poll(state);
-
-       return 0;
+       return rtkit_set_iop_pwrstate(state, RTKIT_MGMT_PWR_STATE_ON);
 }
 
 void
 rtkit_shutdown(struct rtkit_state *state)
 {
-       struct mbox_channel *mc = state->mc;
        struct rtkit *rk = state->rk;
        int i;
 
-       if (state->ap_pwrstate != RTKIT_MGMT_PWR_STATE_QUIESCED)
-               rtkit_set_ap_pwrstate(state, RTKIT_MGMT_PWR_STATE_QUIESCED);
-
-       rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE,
-                  RTKIT_MGMT_PWR_STATE_SLEEP);
-
-       while (state->iop_pwrstate != RTKIT_MGMT_PWR_STATE_SLEEP)
-               rtkit_poll(state);
+       rtkit_set_ap_pwrstate(state, RTKIT_MGMT_PWR_STATE_QUIESCED);
+       rtkit_set_iop_pwrstate(state, RTKIT_MGMT_PWR_STATE_SLEEP);
 
        KASSERT(state->iop_pwrstate == RTKIT_MGMT_PWR_STATE_SLEEP);
        KASSERT(state->ap_pwrstate == RTKIT_MGMT_PWR_STATE_QUIESCED);
@@ -521,7 +494,7 @@ int
 rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
 {
        struct mbox_channel *mc = state->mc;
-       int error;
+       int error, timo;
 
        if (state->ap_pwrstate == pwrstate)
                return 0;
@@ -531,10 +504,48 @@ rtkit_set_ap_pwrstate(struct rtkit_state
        if (error)
                return error;
 
-       while (state->ap_pwrstate != pwrstate)
-               rtkit_poll(state);
+       for (timo = 0; timo < 100000; timo++) {
+               error = rtkit_poll(state);
+               if (error == EWOULDBLOCK) {
+                       delay(10);
+                       continue;
+               }
 
-       return 0;
+               KASSERT(error == 0);
+               if (state->ap_pwrstate == pwrstate)
+                       break;
+       }
+
+       return error;
+}
+
+int
+rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate)
+{
+       struct mbox_channel *mc = state->mc;
+       int error, timo;
+
+       if (state->iop_pwrstate == pwrstate)
+               return 0;
+
+       error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE,
+           pwrstate);
+       if (error)
+               return error;
+
+       for (timo = 0; timo < 100000; timo++) {
+               error = rtkit_poll(state);
+               if (error == EWOULDBLOCK) {
+                       delay(10);
+                       continue;
+               }
+
+               KASSERT(error == 0);
+               if (state->iop_pwrstate == pwrstate)
+                       break;
+       }
+
+       return error;
 }
 
 int
Index: arch/arm64/dev/rtkit.h
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/rtkit.h,v
retrieving revision 1.8
diff -u -p -r1.8 rtkit.h
--- arch/arm64/dev/rtkit.h      11 Nov 2022 11:45:10 -0000      1.8
+++ arch/arm64/dev/rtkit.h      18 Nov 2022 16:12:35 -0000
@@ -19,6 +19,7 @@ struct rtkit_state *rtkit_init(int, cons
 int    rtkit_boot(struct rtkit_state *);
 void   rtkit_shutdown(struct rtkit_state *);
 int    rtkit_set_ap_pwrstate(struct rtkit_state *, uint16_t);
+int    rtkit_set_iop_pwrstate(struct rtkit_state *, uint16_t);
 int    rtkit_poll(struct rtkit_state *);
 int    rtkit_start_endpoint(struct rtkit_state *, uint32_t,
            void (*)(void *, uint64_t), void *);

Reply via email to