shithub: riscv

Download patch

ref: 652508728d0a8486948b776b788da00ce5de6c05
parent: 966cf774397c137e70b8d1bee5018c7df2bb38bd
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Jun 6 12:25:00 EDT 2020

audioac97: use 64-bit physical addresses

--- a/sys/src/9/pc/audioac97.c
+++ b/sys/src/9/pc/audioac97.c
@@ -288,6 +288,9 @@
 
 	adev = arg;
 	ctlr = adev->ctlr;
+	if(ctlr == nil || ctlr->adev != adev)
+		return;
+
 	stat = csr32r(ctlr, Sta);
 	stat &= S2ri | Sri | Pri | Mint | Point | Piint | Moint | Miint | Gsci;
 	if(stat & (Point|Piint|Mint)){
@@ -480,52 +483,27 @@
 }
 
 static int
-ac97reset(Audio *adev)
+ac97reset1(Audio *adev, Ctlr *ctlr)
 {
-	static Ctlr *cards = nil;
-	Pcidev *p;
 	int i, irq, tbdf;
-	Ctlr *ctlr;
 	ulong ctl, stat = 0;
+	Pcidev *p;
 
-	/* make a list of all ac97 cards if not already done */
-	if(cards == nil){
-		p = nil;
-		while(p = ac97match(p)){
-			ctlr = xspanalloc(sizeof(Ctlr), 8, 0);
-			memset(ctlr, 0, sizeof(Ctlr));
-			ctlr->pcidev = p;
-			ctlr->next = cards;
-			cards = ctlr;
-		}
-	}
+	p = ctlr->pcidev;
 
-	/* pick a card from the list */
-	for(ctlr = cards; ctlr; ctlr = ctlr->next){
-		if(p = ctlr->pcidev){
-			ctlr->pcidev = nil;
-			goto Found;
-		}
-	}
-	return -1;
-
-Found:
-	adev->ctlr = ctlr;
-	ctlr->adev = adev;
-
 	/* ICH4 through ICH7 may use memory-type base address registers */
 	if(p->vid == 0x8086 &&
 	  (p->did == 0x24c5 || p->did == 0x24d5 || p->did == 0x266e || p->did == 0x27de) &&
 	  (p->mem[2].bar != 0 && p->mem[3].bar != 0) &&
 	  ((p->mem[2].bar & 1) == 0 && (p->mem[3].bar & 1) == 0)){
-		ctlr->mmmix = vmap(p->mem[2].bar & ~0xf, p->mem[2].size);
+		ctlr->mmmix = vmap(p->mem[2].bar & ~0xF, p->mem[2].size);
 		if(ctlr->mmmix == nil){
-			print("ac97: vmap failed for mmmix 0x%08lux\n", p->mem[2].bar);
+			print("ac97: vmap failed for mmmix %llux\n", p->mem[2].bar & ~0xF);
 			return -1;
 		}
-		ctlr->mmreg = vmap(p->mem[3].bar & ~0xf, p->mem[3].size);
+		ctlr->mmreg = vmap(p->mem[3].bar & ~0xF, p->mem[3].size);
 		if(ctlr->mmreg == nil){
-			print("ac97: vmap failed for mmreg 0x%08lux\n", p->mem[3].bar);
+			print("ac97: vmap failed for mmreg %llux\n", p->mem[3].bar & ~0xF);
 			vunmap(ctlr->mmmix, p->mem[2].size);
 			return -1;
 		}
@@ -532,7 +510,7 @@
 		ctlr->ismmio = 1;
 	}else{
 		if((p->mem[0].bar & 1) == 0 || (p->mem[1].bar & 1) == 0){
-			print("ac97: not i/o regions 0x%04lux 0x%04lux\n", p->mem[0].bar, p->mem[1].bar);
+			print("ac97: not i/o regions 0x%04llux 0x%04llux\n", p->mem[0].bar, p->mem[1].bar);
 			return -1;
 		}
 
@@ -556,6 +534,8 @@
 	irq = p->intl;
 	tbdf = p->tbdf;
 
+	adev->ctlr = ctlr;
+
 	print("#A%d: ac97 port 0x%04lux mixport 0x%04lux irq %d\n",
 		adev->ctlrno, ctlr->port, ctlr->mixport, irq);
 
@@ -649,6 +629,43 @@
 	intrenable(irq, ac97interrupt, adev, tbdf, adev->name);
 
 	return 0;
+}
+
+static int
+ac97reset(Audio *adev)
+{
+	static Ctlr *cards = nil;
+	Ctlr *ctlr;
+	Pcidev *p;
+
+	/* make a list of all ac97 cards if not already done */
+	if(cards == nil){
+		p = nil;
+		while((p = ac97match(p)) != nil){
+			ctlr = mallocz(sizeof(Ctlr), 1);
+			if(ctlr == nil){
+				print("ac97: can't allocate memory\n");
+				break;
+			}
+			ctlr->pcidev = p;
+			ctlr->next = cards;
+			cards = ctlr;
+		}
+	}
+
+	/* pick a card from the list */
+	for(ctlr = cards; ctlr; ctlr = ctlr->next){
+		if(ctlr->adev == nil && ctlr->pcidev != nil){
+			ctlr->adev = adev;
+			pcienable(ctlr->pcidev);
+			if(ac97reset1(adev, ctlr) == 0)
+				return 0;
+			pcidisable(ctlr->pcidev);
+			ctlr->pcidev = nil;
+			ctlr->adev = nil;
+		}
+	}
+	return -1;
 }
 
 void