shithub: front

Download patch

ref: 705638e189cd73d4088de61bc5cb7262a682162f
parent: 6b8c36d51f8c68b94f6f3a8712070a924927d677
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Nov 15 18:20:28 EST 2024

pc, pc64: refactor pcibios code so we dont pollute the amd64 kernel

We can move the pcibios code to its own module
and just provide a stub pcibiosinit() function
for pc64 so we do not have to pull in that code
and the data structures.

also lets us clean up mkdevlist hacks.

--- a/sys/src/9/pc/bios32.c
+++ b/sys/src/9/pc/bios32.c
@@ -71,7 +71,7 @@
 }
 
 void
-BIOS32close(BIOS32si* si)
+bios32close(BIOS32si* si)
 {
 	vunmap(si->base, si->length);
 	free(si);
--- a/sys/src/9/pc/fns.h
+++ b/sys/src/9/pc/fns.h
@@ -113,6 +113,7 @@
 void	outsl(int, void*, int);
 ulong	paddr(void*);
 void	patwc(void*, int);
+int	pcibiosinit(int*, int*);
 void	pcicfginit(void);
 int	(*pcicfgrw8)(int, int, int, int);
 int	(*pcicfgrw16)(int, int, int, int);
--- a/sys/src/9/pc/mkfile
+++ b/sys/src/9/pc/mkfile
@@ -137,6 +137,7 @@
 etherwpi.$O:			../port/wifi.h
 etherrt2860.$O: 		../port/wifi.h
 l.$O rebootcode.$O apbootstrap.$O:	mem.h
+pcipc.$O pcibios.$O:		../port/pci.h io.h
 
 initcode.out:		init9.$O initcode.$O /$objtype/lib/libc.a
 	$LD -l -R1 -s -o $target $prereq
--- a/sys/src/9/pc/pc
+++ b/sys/src/9/pc/pc
@@ -96,7 +96,7 @@
 	pmmc		pci
 
 misc
-	pci		pcipc
+	pci		pcipc pcibios bios32
 
 	archgeneric	devkbd i8259 i8253
 	archacpi	mp apic squidboy ec hpet
--- /dev/null
+++ b/sys/src/9/pc/pcibios.c
@@ -1,0 +1,107 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+#include "../port/pci.h"
+
+static BIOS32si* pcibiossi;
+
+static int
+pcicfgrw8bios(int tbdf, int rno, int data, int read)
+{
+	BIOS32ci ci;
+
+	memset(&ci, 0, sizeof(BIOS32ci));
+	ci.ebx = (BUSBNO(tbdf)<<8)|(BUSDNO(tbdf)<<3)|BUSFNO(tbdf);
+	ci.edi = rno;
+	if(read){
+		ci.eax = 0xB108;
+		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
+			return ci.ecx & 0xFF;
+	}
+	else{
+		ci.eax = 0xB10B;
+		ci.ecx = data & 0xFF;
+		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
+			return 0;
+	}
+
+	return -1;
+}
+
+static int
+pcicfgrw16bios(int tbdf, int rno, int data, int read)
+{
+	BIOS32ci ci;
+
+	memset(&ci, 0, sizeof(BIOS32ci));
+	ci.ebx = (BUSBNO(tbdf)<<8)|(BUSDNO(tbdf)<<3)|BUSFNO(tbdf);
+	ci.edi = rno;
+	if(read){
+		ci.eax = 0xB109;
+		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
+			return ci.ecx & 0xFFFF;
+	}
+	else{
+		ci.eax = 0xB10C;
+		ci.ecx = data & 0xFFFF;
+		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
+			return 0;
+	}
+
+	return -1;
+}
+
+static int
+pcicfgrw32bios(int tbdf, int rno, int data, int read)
+{
+	BIOS32ci ci;
+
+	memset(&ci, 0, sizeof(BIOS32ci));
+	ci.ebx = (BUSBNO(tbdf)<<8)|(BUSDNO(tbdf)<<3)|BUSFNO(tbdf);
+	ci.edi = rno;
+	if(read){
+		ci.eax = 0xB10A;
+		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
+			return ci.ecx;
+	}
+	else{
+		ci.eax = 0xB10D;
+		ci.ecx = data;
+		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
+			return 0;
+	}
+
+	return -1;
+}
+
+int
+pcibiosinit(int *maxdno, int *maxbno)
+{
+	BIOS32ci ci;
+
+	pcibiossi = bios32open("$PCI");
+	if(pcibiossi == nil)
+		return -1;
+
+	memset(&ci, 0, sizeof(BIOS32ci));
+	ci.eax = 0xB101;
+	if(bios32ci(pcibiossi, &ci) || ci.edx != ((' '<<24)|('I'<<16)|('C'<<8)|'P')){
+		bios32close(pcibiossi);
+		pcibiossi = nil;
+		return -1;
+	}
+	if(ci.eax & 0x01)
+		*maxdno = 31;
+	else
+		*maxdno = 15;
+	*maxbno = ci.ecx & 0xff;
+
+	pcicfgrw8 = pcicfgrw8bios;
+	pcicfgrw16 = pcicfgrw16bios;
+	pcicfgrw32 = pcicfgrw32bios;
+
+	return 0;
+}
--- a/sys/src/9/pc/pcipc.c
+++ b/sys/src/9/pc/pcipc.c
@@ -23,7 +23,6 @@
 static int pcicfgmode = -1;
 static Pcidev* pciroot;
 static int nobios, nopcirouting;
-static BIOS32si* pcibiossi;
 
 static int pcicfgrw8raw(int, int, int, int);
 static int pcicfgrw16raw(int, int, int, int);
@@ -126,108 +125,6 @@
 	return data;
 }
 
-static int
-pcicfgrw8bios(int tbdf, int rno, int data, int read)
-{
-	BIOS32ci ci;
-
-	if(pcibiossi == nil)
-		return -1;
-
-	memset(&ci, 0, sizeof(BIOS32ci));
-	ci.ebx = (BUSBNO(tbdf)<<8)|(BUSDNO(tbdf)<<3)|BUSFNO(tbdf);
-	ci.edi = rno;
-	if(read){
-		ci.eax = 0xB108;
-		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
-			return ci.ecx & 0xFF;
-	}
-	else{
-		ci.eax = 0xB10B;
-		ci.ecx = data & 0xFF;
-		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
-			return 0;
-	}
-
-	return -1;
-}
-
-static int
-pcicfgrw16bios(int tbdf, int rno, int data, int read)
-{
-	BIOS32ci ci;
-
-	if(pcibiossi == nil)
-		return -1;
-
-	memset(&ci, 0, sizeof(BIOS32ci));
-	ci.ebx = (BUSBNO(tbdf)<<8)|(BUSDNO(tbdf)<<3)|BUSFNO(tbdf);
-	ci.edi = rno;
-	if(read){
-		ci.eax = 0xB109;
-		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
-			return ci.ecx & 0xFFFF;
-	}
-	else{
-		ci.eax = 0xB10C;
-		ci.ecx = data & 0xFFFF;
-		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
-			return 0;
-	}
-
-	return -1;
-}
-
-static int
-pcicfgrw32bios(int tbdf, int rno, int data, int read)
-{
-	BIOS32ci ci;
-
-	if(pcibiossi == nil)
-		return -1;
-
-	memset(&ci, 0, sizeof(BIOS32ci));
-	ci.ebx = (BUSBNO(tbdf)<<8)|(BUSDNO(tbdf)<<3)|BUSFNO(tbdf);
-	ci.edi = rno;
-	if(read){
-		ci.eax = 0xB10A;
-		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
-			return ci.ecx;
-	}
-	else{
-		ci.eax = 0xB10D;
-		ci.ecx = data;
-		if(!bios32ci(pcibiossi, &ci)/* && !(ci.eax & 0xFF)*/)
-			return 0;
-	}
-
-	return -1;
-}
-
-static BIOS32si*
-pcibiosinit(void)
-{
-	BIOS32ci ci;
-	BIOS32si *si;
-
-	if((si = bios32open("$PCI")) == nil)
-		return nil;
-
-	memset(&ci, 0, sizeof(BIOS32ci));
-	ci.eax = 0xB101;
-	if(bios32ci(si, &ci) || ci.edx != ((' '<<24)|('I'<<16)|('C'<<8)|'P')){
-		free(si);
-		return nil;
-	}
-	if(ci.eax & 0x01)
-		pcimaxdno = 31;
-	else
-		pcimaxdno = 15;
-	pcimaxbno = ci.ecx & 0xff;
-
-	return si;
-}
-
 static uchar
 pIIxget(Pcidev *router, uchar link)
 {
@@ -673,11 +570,8 @@
 	}
 
 	if(pcicfgmode < 0 || pcibios) {
-		if((pcibiossi = pcibiosinit()) == nil)
+		if(pcibiosinit(&pcimaxdno, &pcimaxbno) < 0)
 			goto out;
-		pcicfgrw8 = pcicfgrw8bios;
-		pcicfgrw16 = pcicfgrw16bios;
-		pcicfgrw32 = pcicfgrw32bios;
 		pcicfgmode = 3;
 	}
 
--- a/sys/src/9/pc64/dat.h
+++ b/sys/src/9/pc64/dat.h
@@ -1,5 +1,3 @@
-typedef struct BIOS32si	BIOS32si;
-typedef struct BIOS32ci	BIOS32ci;
 typedef struct Conf	Conf;
 typedef struct Confmem	Confmem;
 typedef struct FPssestate	FPssestate;
@@ -23,7 +21,6 @@
 typedef struct Ureg	Ureg;
 typedef struct Vctl	Vctl;
 
-#pragma incomplete BIOS32si
 #pragma incomplete Pcidev
 #pragma incomplete Ureg
 
@@ -352,12 +349,3 @@
 	int	nports;			/* Number of ports */
 	Devport	*ports;			/* The ports themselves */
 };
-
-typedef struct BIOS32ci {		/* BIOS32 Calling Interface */
-	u32int	eax;
-	u32int	ebx;
-	u32int	ecx;
-	u32int	edx;
-	u32int	esi;
-	u32int	edi;
-} BIOS32ci;
--- a/sys/src/9/pc64/fns.h
+++ b/sys/src/9/pc64/fns.h
@@ -3,10 +3,6 @@
 Dirtab*	addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong));
 void	archinit(void);
 void	archreset(void);
-int	bios32call(BIOS32ci*, u16int[3]);
-int	bios32ci(BIOS32si*, BIOS32ci*);
-void	bios32close(BIOS32si*);
-BIOS32si* bios32open(char*);
 void	bootargsinit(void);
 uintptr	cankaddr(uintptr);
 int	checksum(void *, int);
@@ -117,6 +113,7 @@
 void	outsl(int, void*, int);
 uintptr	paddr(void*);
 void	patwc(void*, int);
+int	pcibiosinit(int*, int*);
 void	pcicfginit(void);
 int	(*pcicfgrw8)(int, int, int, int);
 int	(*pcicfgrw16)(int, int, int, int);
--- a/sys/src/9/pc64/l.s
+++ b/sys/src/9/pc64/l.s
@@ -422,14 +422,6 @@
 	RET
 
 /*
- * BIOS32.
- */
-TEXT bios32call(SB), 1, $-4
-	XORL	AX, AX
-	INCL	AX
-	RET
-
-/*
  * Basic timing loop.
  */
 TEXT delayloop(SB), 1, $-4
--- a/sys/src/9/pc64/main.c
+++ b/sys/src/9/pc64/main.c
@@ -364,3 +364,10 @@
 	 */
 	mmuflushtlb(PADDR(m->pml4));
 }
+
+int
+pcibiosinit(int *, int *)
+{
+	return -1;
+}
+
--- a/sys/src/9/pc64/mkfile
+++ b/sys/src/9/pc64/mkfile
@@ -141,6 +141,8 @@
 etherwpi.$O:			../port/wifi.h
 etherrt2860.$O: 		../port/wifi.h
 
+pcipc.$O:	../port/pci.h io.h
+
 initcode.out:		init9.$O initcode.$O /$objtype/lib/libc.a
 	$LD -l -R1 -s -o $target $prereq
 
--- a/sys/src/9/port/mkdevlist
+++ b/sys/src/9/port/mkdevlist
@@ -1,6 +1,6 @@
 #!/bin/rc
 
-awk -v 'objtype='$objtype '
+awk '
 BEGIN{
 	if(ARGC < 2)
 		exit;
@@ -18,12 +18,12 @@
 }
 collect && $0 ~ /[^ \t]+/{
 	if(isdev)
-		obj["dev" $1 "'.$O'"]++;
+		obj["dev" $1]++;
 	else
-		obj[$1 "'.$O'"]++;
+		obj[$1]++;
 	for(i = 2; i <= NF; i++){
 		if($i !~ "[+=-].*")
-			obj[$i "'.$O'"]++;
+			obj[$i]++;
 	}
 }
 $0 ~ /^[^ \t]/{
@@ -37,10 +37,6 @@
 }
 
 END{
-	x = ""
 	for(i in obj)
-		x = x i "\n";
-	if((objtype ~ "386" || objtype ~ "amd64") && obj["pci" "'.$O'"])
-		x = x "bios32'.$O' \n";
-	printf x;
+		print i ".'$O'"
 }' $*
--