shithub: rc

ref: d22a9cca4296bbe2087757c13b1c9f761fc4bbba
dir: /bin/br/

View raw version
#!/bin/rc
rfork e
if(! ~ $#* 1 || {test $1 -lt 0 || test $1 -gt 100}){
	echo usage: $0 percent
	exit usage >[1=2]
}
pci | awk -v 'fac='$1 '
function pipe(cmd, 	v){
	cmd | getline v
	close(cmd)
	return v
}
BEGIN{
	# intel graphics
	vid["8086"] = "igfx"
	# gm15 (not working on t43p)
	did["8086/2592","r"] = "0x61254";  did["8086/2592","w"] = "0x61254"
	# gm45
	did["8086/27ae","r"] = "0x61254";  did["8086/27ae","w"] = "0x61254"
	did["8086/27a2","r"] = "0x61254";  did["8086/27a2","w"] = "0x61254"
	# gm965
	did["8086/29a2","r"] = "0x61254";  did["8086/29a2","w"] = "0x61254"
	did["8086/2a02","r"] = "0x61254";  did["8086/2a02","w"] = "0x61254"
	did["8086/2a42","r"] = "0x61254";  did["8086/2a42","w"] = "0x61254"
	did["8086/a011","r"] = "0x61254";  did["8086/a011","w"] = "0x61254"
	# sandy bridge
	# for reference: BLC_PWM_CTL2, SBLC_PWM_CTL2
	did["8086/0046","r"] = "0xc8254";  did["8086/0046","w"] = "0x48254"
	did["8086/0102","r"] = "0xc8254";  did["8086/0102","w"] = "0xc8254"
	# works on x220, not on w520
	did["8086/0126","r"] = "0xc8254";  did["8086/0126","w"] = "0x48254"
	# ivy bridge
	did["8086/0152","r"] = "0xc8254";  did["8086/0152","w"] = "0x48254"
	did["8086/0166","r"] = "0xc8254";  did["8086/0166","w"] = "0x48254"
	# haswell
	did["8086/0412","r"] = "0xc8254";  did["8086/0412","w"] = "0x48254"
	did["8086/041a","r"] = "0xc8254";  did["8086/041a","w"] = "0x48254"
	did["8086/0a06","r"] = "0xc8254";  did["8086/0a06","w"] = "0x48254"
	did["8086/0a16","r"] = "0xc8254";  did["8086/0a16","w"] = "0x48254"
	did["8086/0a26","r"] = "0xc8254";  did["8086/0a26","w"] = "0x48254"
	# broadwell
	did["8086/1616","r"] = "0xc8254";  did["8086/1616","w"] = "0xc8254"
	# skylake
	did["8086/1916","r"] = "0xc8254";  did["8086/1916","w"] = "0xc8254"
	# kaby lake
	did["8086/3ea0","r"] = "0xc8254";  did["8086/3ea0","w"] = "0xc8254"
	did["8086/5916","r"] = "0xc8254";  did["8086/5916","w"] = "0xc8254"
	# gemini lake (not working)
	did["8086/3185","r"] = "0xc8254";  did["8086/3185","w"] = "0xc8254"
}
$2 == "vid" && dev == ""{
	split($4, id, "/")
	if(vid[id[1]] == "" || did[$4,"r"] == ""){
		print "unsupported device", id[1] "/" id[2] >"/fd/2"
		next
	}
	type = vid[id[1]]
	dev = $4
	mem = $7
}
function igfxpwm(){
	if(system("echo type igfx >/dev/vgactl") != 0){
		print "unsupported device", $4 >"/fd/2"
		exit "attach failed"
	}
	r = pipe("seg -Lr igfxmmio " mem " " did[dev,"r"])
	v = pipe("echo \''" r " & ~0xffff | ((" r ">>16) * " fac " / 100)\'' | pc")
	if(system("seg -Lw igfxmmio " mem " " did[dev,"w"] " " v) != 0)
		exit "write failed"
}
END{
	if(type == "igfx")
		igfxpwm()
	else{
		print "no known devices" >"/fd/2"
		exit "no known devices"
	}
}
'