On Wed, Nov 07, 2018 at 05:33:13PM +0100, Mark Kettenis wrote:
> > From: Ben Pye <[email protected]>
> > Content-Type: text/plain; charset="utf-8"
> > 
> > I have been attempting to run OpenBSD on my HP Chromebook 13, it's a
> > Skylake device with eMMC storage. Previously sdhc attempted to set the
> > same bus voltage multiple times, and after the first, successful,
> > attempt it would break resulting in all later commands timing out. This
> > patch changes sdhc such that it only sets the voltage if the request is
> > for a different level, this is the behaviour FreeBSD has.
> 
> That makes sense.  We'll need to test this on more hardware.  And
> maybe we need to reset hp->vdd in some places (suspend/resume, resets).

As you suspected suspend/resume isn't working with this current patch. At
least for my hardware I need to restore the bus_power setting on resume
in addition to the other registers. This seems to get the eMMC device
back up.

I am however hitting another (potentially unrelated?) issue having done
this. I am using softraid for FDE and so my physical device is sd0 and
my softraid device is sd1. After resume sd0 is detached and reattached
and appears to still be working, the device name is printed to the dmesg
output. sd1 however stays in a broken state and so eventually the system
crashes as it's root filesystem just disappeared. I have included a
(partial - I have ended up adding a lot of logging to get it coming up
after suspend) dmesg below. Any ideas?

Thanks
Ben

sdmmc0: CID: mid=0x90 oid=0x014a pnm="HBG4e\^E" rev=0x00 psn=0x507b6955 mdt=000
sdmmc0: read_bl_len=512 sector_size=512
scsibus1 at sdmmc0: 2 targets, initiator 0
sd0 at scsibus1 targ 1 lun 0: <SD/MMC, HBG4e\\005, 0000> SCSI2 0/direct 
removable
sd0: 29824MB, 512 bytes/sector, 61079552 sectors
ugen0 at uhub0 port 3 "Intel Bluetooth" rev 2.00/0.03 addr 2
uvideo0 at uhub0 port 7 configuration 1 interface 0 "Generic HP Truevision HD" 
rev 2.00/0.06 a
video0 at uvideo0
vscsi0 at root
scsibus2 at vscsi0: 256 targets
softraid0 at root
scsibus3 at softraid0: 256 targets
softraid0: sd1 was not shutdown properly
sd1 at scsibus3 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006> SCSI2 0/direct fixed
sd1: 29823MB, 512 bytes/sector, 61077937 sectors
sdhc0: timeout waiting for 0 
(state=1fef0106<CL,D3L,D2L,D1L,WPS,CD,CSS,CI,WTA,DLA,CID>)
softraid0: I/O error 5 on dev 0x400 at block 16
softraid0: could not write metadata to sd0a
root on sd1a (2d11d44f123d9141.a) swap on sd1b dump on sd1b
... (iwm, usb, video, etc messages omitted)
sd0 detached
scsibus1 detached
softraid0: sd1: i/o error 0 @ CRYPTO block 11831120
softraid0: sd1: i/o error 0 @ CRYPTO block 11820400
softraid0: sd1: i/o error 0 @ CRYPTO block 11831120
softraid0: sd1: i/o error 0 @ CRYPTO block 9755216
softraid0: sd1: i/o error 0 @ CRYPTO block 9748640
... (more i/o errors omitted)
sdmmc0: CID: mid=0x90 oid=0x014a pnm="HBG4e\^E" rev=0x00 psn=0x507b6955 mdt=000
sdmmc0: read_bl_len=512 sector_size=512
scsibus1 at sdmmc0: 2 targets, initiator 0
sd0 at scsibus1 targ 1 lun 0: <SD/MMC, HBG4e\\005, 0000> SCSI2 0/direct 
removable
sd0: 29824MB, 512 bytes/sector, 61079552 sectors
softraid0: sd1: i/o error 0 @ CRYPTO block 15148176
softraid0: sd1: i/o error 0 @ CRYPTO block 15141600
softraid0: sd1: i/o error 0 @ CRYPTO block 9755216
softraid0: sd1: i/o error 0 @ CRYPTO block 9748640
softraid0: sd1: i/o error 0 @ CRYPTO block 8144
softraid0: sd1: i/o error 0 @ CRYPTO block 1568
softraid0: sd1: i/o error 0 @ CRYPTO block 6291568
... (further i/o errors until panic)

> 
> Cheers,
> 
> Mark
> 
> > Index: sys/dev/sdmmc/sdhc.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/sdmmc/sdhc.c,v
> > retrieving revision 1.61
> > diff -u -p -u -p -r1.61 sdhc.c
> > --- sys/dev/sdmmc/sdhc.c    6 Sep 2018 10:15:17 -0000       1.61
> > +++ sys/dev/sdmmc/sdhc.c    7 Nov 2018 15:36:10 -0000
> > @@ -53,6 +53,7 @@ struct sdhc_host {
> >     u_int8_t regs[14];              /* host controller state */
> >     u_int16_t intr_status;          /* soft interrupt status */
> >     u_int16_t intr_error_status;    /* soft error status */
> > +   u_int8_t vdd;                   /* current vdd */
> >  
> >     bus_dmamap_t adma_map;
> >     bus_dma_segment_t adma_segs[1];
> > @@ -420,6 +421,8 @@ sdhc_host_reset(sdmmc_chipset_handle_t s
> >  
> >     s = splsdmmc();
> >  
> > +   hp->vdd = 0;
> > +
> >     /* Disable all interrupts. */
> >     HWRITE2(hp, SDHC_NINTR_SIGNAL_EN, 0);
> >  
> > @@ -491,6 +494,16 @@ sdhc_bus_power(sdmmc_chipset_handle_t sc
> >     int s;
> >  
> >     s = splsdmmc();
> > +
> > +   /* 
> > +    * If the requested vdd is the same as current vdd return.
> > +    */
> > +   if (hp->vdd == ocr) {
> > +           splx(s);
> > +           return 0;
> > +   }
> > +
> > +   hp->vdd = ocr;
> >  
> >     /*
> >      * Disable bus power before voltage change.
> > 
> > 
> 

Reply via email to