shithub: riscv

ref: e14d6249749a1101abdad7998e1cd5cdc49e137a
dir: /rc/bin/pci/

View raw version
#!/bin/rc
# pci [-bv] - dump pci configuration
rfork e
fn verbose {
	if (! test -f /lib/pci)
		echo $0: no /lib/pci >[1=2]
	awk '

	function lower(s) {
		gsub(/A/, "a", s)
		gsub(/B/, "b", s)
		gsub(/C/, "c", s)
		gsub(/D/, "d", s)
		gsub(/E/, "e", s)
		gsub(/F/, "f", s)
		return s
	}
	BEGIN{
		file="/lib/pci"
		FS="\t"
		while(getline <file > 0){
			if(/^;/) continue
			if(/^[0-9a-fA-F]/){
				vid=lower($1)
				vendor[vid] = $2
			}
			if(/^	[0-9a-fA-F]/){
				did=lower($2)
				id[vid "/" did] = $3
			}
		}
		FS = " "
	}

	{
		print $0
		vid = $4
		sub(/\/.*/, "", vid)
		if(vid in vendor){
			s = vendor[vid]
			if($4 in id)
				s = s " " id[$4]
			print "\t" s
		}
	}
'
}
fn usage {
	echo usage: $1 '[-bv]' >[1=2]
	exit usage
}

filter=cat
bridges=yes
done=0
while (~ $done 0 && ! ~ $#* 0 && ~ $1 -*) {
	if (~ $1 -*b*)
		bridges=no
	if (~ $1 -*v*)
		filter=verbose
	switch ($1) {
	case --
		done = 1		# no break in rc, alas
	case -*[~bv]*
		usage $0
	}
	shift
}
if (! ~ $#* 0)
	usage $0

builtin cd '#$/pci' && grep . *ctl | {
	if (~ $bridges no)
		sed /:06/d
	if not
		cat
	} |
	sed '
	s/ctl:/:	/
	t noop
: noop
	s/:	01/:	disk 01/
	s/:	02/:	net  02/
	s/:	03/:	vid  03/
	s/:	04/:	aud  04/
	s/:	05/:	mem  05/
	s/:	06/:	brg  06/
	s/:	07/:	ser  07/
	s/:	0c\.03/:	usb  0c.03/
	s/:	0c\.05/:	smb  0c.05/
	s/:	0d/:	rad  0d/
	s/:	10/:	cryp 10/
	t
	s/	/	---  /
' | $filter