# mhwd Driver Config

NAME="video-nvidia-prime-render-offload"
INFO="Hybrid prime solution for NVIDIA Optimus Technology - Closed source NVIDIA driver & open source intel driver."
VERSION="2021.08.05"
FREEDRIVER="false"
PRIORITY="30"

# NVIDIA cards
CLASSIDS="0300 0302"
VENDORIDS="10de"
DEVICEIDS=">/var/lib/mhwd/ids/pci/nvidia.ids"

# Intel OR AMD cards
CLASSIDS="0300"
VENDORIDS="8086 1002"
DEVICEIDS="*"

# Conflicts
CONFLICTS="nvidia-390xx-utils opencl-nvidia-390xx nvidia-390xx-settings"
CONFLICTS_64="lib32-nvidia-390xx-utils lib32-opencl-nvidia-390xx"
CONKMOD="nvidia-390xx-dkms"

# Conflicts with other mhwd configs
MHWDCONFLICTS="video*nvidia*"

# Depends on other mhwd configs
MHWDDEPENDS="video-linux"

# Dependencies (nvidia-prime dependency is technically optional, but adds the prime-run command)
DEPENDS="nvidia-utils nvidia-prime nvidia-settings opencl-nvidia egl-wayland gwe"
DEPENDS_64="lib32-nvidia-utils lib32-opencl-nvidia"
DEPKMOD="nvidia-dkms"


XORGFILE="/etc/X11/mhwd.d/nvidia.conf"
UDEVFILE="/etc/udev/rules.d/90-mhwd-prime-powermanagement.rules"
MHWDGPU_BLCKLSTNVIDIA="/etc/modprobe.d/mhwd-gpu.conf"
MHWDGPU_MODLDNVIDIA="/etc/modules-load.d/mhwd-gpu.conf"

_setup_nvidia_powermanagememnt()
{
	cat <<EOF > "${UDEVFILE}"
# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"

# Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"
EOF
	echo 'options nvidia "NVreg_DynamicPowerManagement=0x02"' >> "${MHWDGPU_BLCKLSTNVIDIA}"
}

gdm_disable_wayland()
{
	if [[ -e /etc/gdm/custom.conf ]]; then
		sed -i -e 's|#WaylandEnable=false|WaylandEnable=false|g' /etc/gdm/custom.conf
	fi
}

post_install()
{

	_setup_nvidia_powermanagememnt

	# Without this 'glxgears' don't work in live-session
	MODULES_LOAD="/etc/modules-load.d"
	echo "nvidia-drm" >> "${MODULES_LOAD}/mhwd-gpu.conf"
	echo "nvidia-uvm" >> "${MODULES_LOAD}/mhwd-gpu.conf"
	if [ ! "$(pgrep X)" ];	then
		modprobe nvidia-drm
		modprobe nvidia-uvm
	fi
	gdm_disable_wayland
	#sed -i 's/MODULES=.*/MODULES=(intel_agp i915 nvidia nvidia_modeset nvidia_uvm nvidia_drm)/g' /etc/mkinitcpio.conf
	#mkinitcpio -P
}



post_remove()
{
	rm -f "${XORGFILE}"
	rm -f "${UDEVFILE}"
	if [ -f "${MHWDGPU_BLCKLSTNVIDIA}" ]; then
		sed -i '/^blacklist nouveau/d' "${MHWDGPU_BLCKLSTNVIDIA}"
		sed -i '/^blacklist ttm/d' "${MHWDGPU_BLCKLSTNVIDIA}"
		sed -i '/^blacklist drm_kms_helper/d' "${MHWDGPU_BLCKLSTNVIDIA}"
		sed -i '/^blacklist drm/d' "${MHWDGPU_BLCKLSTNVIDIA}"
		sed -i '/^options nvidia "NVreg_DynamicPowerManagement=0x02"/d' "${MHWDGPU_BLCKLSTNVIDIA}"
	fi

	if [ -f "${MHWDGPU_MODLDNVIDIA}" ]; then
		sed -i '/^nvidia/d' "${MHWDGPU_MODLDNVIDIA}"
	fi

	#sed -i 's/MODULES=.*/MODULES=()/g' /etc/mkinitcpio.conf
	#mkinitcpio -P
	mhwd-gpu --check
}
