shithub: tpi

Download patch

ref: b9efa5bad11f7ada9416bab6f63ca4dd69b520c5
parent: c7995ec2fca61ff3dcd10b2c233d6a45e66ad5a2
author: glenda <[email protected]>
date: Sun Jun 19 18:56:08 EDT 2022

emmc update

--- a/v1/9/emmc.diff
+++ b/v1/9/emmc.diff
@@ -1,246 +1,0 @@
-diff 90a08cf1fda8eaf4afe98f74a7572fb36b7ef369 uncommitted
---- a/sys/src/9/bcm/emmc.c
-+++ b/sys/src/9/bcm/emmc.c
-@@ -33,6 +33,7 @@
- 
- 	GoIdle		= 0,		/* mmc/sdio go idle state */
- 	MMCSelect	= 7,		/* mmc/sd card select command */
-+	Sendextcsd  = 8,		/* mmc ext_csd, sd send_if_cond */
- 	Setbuswidth	= 6,		/* mmc/sd set bus width command */
- 
- 	Switchfunc	= 6,		/* mmc/sd switch function command */
-@@ -141,6 +142,7 @@
- 
- static int cmdinfo[64] = {
- [0]  Ixchken,
-+[1]  Resp48,
- [2]  Resp136,
- [3]  Resp48 | Ixchken | Crcchken,
- [5]  Resp48,
-@@ -166,6 +168,7 @@
- 
- struct Ctlr {
- 	Rendez	r;
-+	Rendez	cardr;
- 	int	fastclock;
- 	ulong	extclk;
- 	int	appcmd;
-@@ -303,6 +306,11 @@
- 	 */
- 	if(cmd == Switchfunc && !emmc.appcmd)
- 		c |= Isdata|Card2host;
-+	/*
-+	 * CMD8 can be SD_SEND_IF_COND or SEND_EXT_CSD depending on arg
-+	 */
-+	if(cmd == Sendextcsd && arg == 0)
-+		c |= Isdata|Card2host;
- 	if(cmd == IORWextended){
- 		if(arg & (1<<31))
- 			c |= Host2card;
-@@ -318,8 +326,7 @@
- 		WR(Control0, r[Control0] & ~(Dwidth4|Hispeed));
- 		emmcclk(Initfreq);
- 	}
--	if((r[Status] & Datinhibit) &&
--	   ((c & Isdata) || (c & Respmask) == Resp48busy)){
-+	if(r[Status] & Cmdinhibit){
- 		print("emmccmd: need to reset Cmdinhibit intr %ux stat %ux\n",
- 			r[Interrupt], r[Status]);
- 		WR(Control1, r[Control1] | Srstcmd);
-@@ -345,9 +352,9 @@
- 		WR(Interrupt, i);
- 	}
- 	WR(Cmdtm, c);
--	now = MACHP(0)->ticks;
-+	now = m->ticks;
- 	while(((i=r[Interrupt])&(Cmddone|Err)) == 0)
--		if(MACHP(0)->ticks - now > HZ)
-+		if(m->ticks-now > HZ)
- 			break;
- 	if((i&(Cmddone|Err)) != Cmddone){
- 		if((i&~(Err|Cardintr)) != Ctoerr)
-@@ -494,6 +501,8 @@
- 	i = r[Interrupt];
- 	if(i&(Datadone|Err))
- 		wakeup(&emmc.r);
-+	if(i&Cardintr)
-+		wakeup(&emmc.cardr);
- 	WR(Irpten, r[Irpten] & ~i);
- }
- 
---- a/sys/src/9/port/sdmmc.c
-+++ b/sys/src/9/port/sdmmc.c
-@@ -23,6 +23,8 @@
- enum {
- 	Inittimeout	= 15,
- 	Multiblock	= 1,
-+	MMC_TYPE_SD = 1,
-+	MMC_TYPE_MMC = 2,
- 
- 	/* Commands */
- 	GO_IDLE_STATE	= 0,
-@@ -31,6 +33,7 @@
- 	SWITCH_FUNC	= 6,
- 	SELECT_CARD	= 7,
- 	SD_SEND_IF_COND	= 8,
-+	SEND_EXT_CSD = 8,
- 	SEND_CSD	= 9,
- 	STOP_TRANSMISSION= 12,
- 	SEND_STATUS	= 13,
-@@ -42,6 +45,7 @@
- 	APP_CMD		= 55,	/* prefix for following app-specific commands */
- 	SET_BUS_WIDTH	= 6,
- 	SD_SEND_OP_COND	= 41,
-+	MMC_SEND_OP_COND = 1,
- 
- 	/* Command arguments */
- 	/* SD_SEND_IF_COND */
-@@ -81,8 +85,12 @@
- 	u32int	csd[4];
- 
- 	int	retry;
-+
-+	uchar type;
- };
- 
-+SDio *sdcardlink;
-+
- extern SDifc sdmmcifc;
- extern SDio sdio;
- 
-@@ -104,9 +112,14 @@
- }
- 
- static void
--identify(SDunit *unit, u32int *csd)
-+identify(SDunit *unit)
- {
- 	uint csize, mult;
-+	Ctlr *ctl = unit->dev->ctlr;
-+	u32int *csd = ctl->csd;
-+	SDio *io = ctl->io;                                                     
-+	uchar ext_csd[512];
-+	u32int r[4];
- 
- 	unit->secsize = 1 << CSD(83, 80);
- 	switch(CSD(127, 126)){
-@@ -119,6 +132,22 @@
- 		csize = CSD(69, 48);
- 		unit->sectors = (csize+1) * 0x80000LL / unit->secsize;
- 		break;
-+	case 3:
-+		if(CSD(125, 122) < 4) { /* no EXT_CSD */
-+			print("sdmmc: no ext_csd\n");                           
-+			break;
-+		}
-+		if(waserror()){
-+			print("sdmmc: send_ext_csd error\n");
-+			nexterror();
-+		}
-+		io->iosetup(0, ext_csd, 512, 1);
-+		io->cmd(SEND_EXT_CSD, 0, r);
-+		io->io(0, ext_csd, 512);
-+		unit->sectors = ext_csd[212] | (ext_csd[213]<<8) |
-+					(ext_csd[214]<<16) | (ext_csd[215]<<24);
-+		poperror();
-+		break;
- 	}
- 	if(unit->secsize == 1024){
- 		unit->sectors <<= 1;
-@@ -132,7 +161,9 @@
- 	SDev *sdev;
- 	Ctlr *ctl;
- 
--	if(sdio.init() < 0)
-+	if(sdcardlink == nil)
-+		sdcardlink = &sdio;
-+	if(sdcardlink->init() < 0)
- 		return nil;
- 	sdev = malloc(sizeof(SDev));
- 	if(sdev == nil)
-@@ -147,7 +178,7 @@
- 	sdev->nunit = 1;
- 	sdev->ctlr = ctl;
- 	ctl->dev = sdev;
--	ctl->io = &sdio;
-+	ctl->io = sdcardlink;
- 	return sdev;
- }
- 
-@@ -213,20 +244,43 @@
- 			hcs = Hcs;
- 		poperror();
- 	}
--	for(i = 0; i < Inittimeout; i++){
--		tsleep(&up->sleep, return0, nil, 100);
--		io->cmd(APP_CMD, 0, r);
--		io->cmd(SD_SEND_OP_COND, hcs|V3_3, r);
--		if(r[0] & Powerup)
--			break;
-+	if(!waserror()){
-+		for(i = 0; i < Inittimeout; i++){
-+			tsleep(&up->sleep, return0, nil, 100);
-+			io->cmd(APP_CMD, 0, r);
-+			io->cmd(SD_SEND_OP_COND, hcs|V3_3, r);
-+			if(r[0] & Powerup){
-+				ctl->type = MMC_TYPE_SD;
-+				break;
-+			}
-+		}
-+	}else{
-+		io->cmd(GO_IDLE_STATE, 0, r);
-+		ctl->ocr = (1 << 30);
-+		for(i = 0; i < Inittimeout; i++){
-+			tsleep(&up->sleep, return0, nil, 100);
-+			io->cmd(MMC_SEND_OP_COND, ctl->ocr, r);
-+			if(r[0] & Powerup){
-+				ctl->type = MMC_TYPE_MMC;
-+				break;
-+			}
-+			ctl->ocr = r[0] | (1 << 30);
-+		}
- 	}
-+	if(ctl->type == 0)
-+		return 3;
- 	if(i == Inittimeout)
- 		return 2;
- 	ctl->ocr = r[0];
- 	io->cmd(ALL_SEND_CID, 0, r);
- 	memmove(ctl->cid, r, sizeof ctl->cid);
--	io->cmd(SEND_RELATIVE_ADDR, 0, r);
--	ctl->rca = r[0]>>16;
-+	if(ctl->type == MMC_TYPE_SD){
-+		io->cmd(SEND_RELATIVE_ADDR, 0, r);
-+		ctl->rca = r[0]>>16;
-+	}else if(ctl->type == MMC_TYPE_MMC){
-+		ctl->rca = 1;
-+		io->cmd(SEND_RELATIVE_ADDR, ctl->rca<<Rcashift, r);
-+	}
- 	io->cmd(SEND_CSD, ctl->rca<<Rcashift, r);
- 	memmove(ctl->csd, r, sizeof ctl->csd);
- 	return 1;
-@@ -275,15 +329,17 @@
- 		poperror();
- 		return 2;
- 	}
--	identify(unit, ctl->csd);
- 	io->cmd(SELECT_CARD, ctl->rca<<Rcashift, r);
-+	identify(unit);
- 	io->cmd(SET_BLOCKLEN, unit->secsize, r);
--	io->cmd(APP_CMD, ctl->rca<<Rcashift, r);
--	io->cmd(SET_BUS_WIDTH, Width4, r);
--	if(io->highspeed){
--		if(!waserror()){
--			mmcswitchfunc(io, Hispeed|Setfunc);
--			poperror();
-+	if(ctl->type == MMC_TYPE_SD){
-+		io->cmd(APP_CMD, ctl->rca<<Rcashift, r);
-+		io->cmd(SET_BUS_WIDTH, Width4, r);
-+		if(io->highspeed){
-+			if(!waserror()){
-+				mmcswitchfunc(io, Hispeed|Setfunc);
-+				poperror();
-+			}
- 		}
- 	}
- 	poperror();
--- a/v1/9/emmc/bcm/emmc.c
+++ b/v1/9/emmc/bcm/emmc.c
@@ -352,9 +352,9 @@
 		WR(Interrupt, i);
 	}
 	WR(Cmdtm, c);
-	now = m->ticks;
+	now = MACHP(0)->ticks;
 	while(((i=r[Interrupt])&(Cmddone|Err)) == 0)
-		if(m->ticks-now > HZ)
+		if(MACHP(0)->ticks - now > HZ)
 			break;
 	if((i&(Cmddone|Err)) != Cmddone){
 		if((i&~(Err|Cardintr)) != Ctoerr)
--- a/v1/9/emmc/port/sdmmc.c
+++ b/v1/9/emmc/port/sdmmc.c
@@ -254,6 +254,7 @@
 				break;
 			}
 		}
+		poperror();
 	}else{
 		io->cmd(GO_IDLE_STATE, 0, r);
 		ctl->ocr = (1 << 30);
@@ -388,7 +389,7 @@
 		error(Echange);
 	buf = data;
 	len = unit->secsize;
-	if(Multiblock){
+	if(Multiblock && (!write || !io->nomultiwrite)){
 		b = bno;
 		tries = 0;
 		while(waserror())