#!/sbin/openrc-run
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

depend() {
	before bootmisc hdparm
	after localmount
}

checkconfig() {
	if [ ! -f /etc/conf.d/pciparm ]; then
		ewarn "/etc/conf.d/pciparm does not exist, skipping"
		return 1
	fi

	if [ -z "${PCIPARM_ALL}" -a -z "${PCIPARM_BUS_0}" -a  -z "${PCIPARM_VENDOR_0}" ]; then
		ewarn "None of PCIPARM_ALL, PCIPARM_BUS_* or PCIPARM_VENDOR_* set in /etc/conf.d/pciparm"
		return 1
	fi
}

do_setpci() {
	#ewarn "do_setpci: /usr/sbin/setpci $SETPCI_OPT $@"
	SWITCH=$1
	SPEC_ID=$2
	shift 2
	case "$SWITCH" in
		-d) DESC=vendor ;;
		-s) DESC=bus ;;
		*) eerror "Unknown setpci type: $SWITCH" ; return 1 ;;
	esac

	if [ -z "$SPEC_ID" ]; then
		eerror "Missing device specifier!"
		return 1
	fi
	if [ -z "$*" ]; then
		eerror "Missing configuration to set for ($DESC) $SPEC_ID!"
		return 1
	fi

	ebegin "Setting PCI params for ($DESC) $SPEC_ID to $@"
	/usr/sbin/setpci $SETPCI_OPT $SWITCH $SPEC_ID "$@"
	rc=$?
	eend $rc
	return $rc
}

do_setpci_array() {
	name=$1
	shift
	i=0
	while true; do
		eval opt="\$${name}_$i"
		# End of loop
		[ -z "${opt}" ] && break
		# Pass in all other parameters here, in case we want to use multiple
		# arguments later.
		do_setpci "$@" $opt #|| return 1
		i=$(($i+1))
	done
}

start() {
	if get_bootparam "nopciparm" ; then
		ewarn "Skipping pciparm init as requested in kernel cmdline"
		return 0
	fi

	checkconfig || return 1
	
	# We do not exit after any errors presently, because it might be a
	# stability-related fix after a failure.
	[ -n "$PCIPARM_ALL" ] && \
		do_setpci -d '*:*' $PCIPARM_ALL #|| return 1

	do_setpci_array PCIPARM_BUS -s #|| return 1
	do_setpci_array PCIPARM_VENDOR -d #|| return 1
}
