# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

inherit linux-info

DESCRIPTION="Microcode for V.Islands Radeon GPUs and APUs"
HOMEPAGE="http://people.freedesktop.org/~agd5f/radeon_ucode/"
SRC_URI="mirror://gentoo/${P}.tar.xz"

LICENSE="radeon-ucode"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="legacy"

RDEPEND="legacy? ( !sys-firmware/radeon-ucode )
	!>sys-kernel/linux-firmware-20150812[-savedconfig]"

S=${WORKDIR}/radeon_ucode

AMDGPU_LEGACY_CIK="bonaire hawaii kabini kaveri mullins"

src_install() {
	local directory files legacyfiles
	if use legacy; then
		for directory in ${AMDGPU_LEGACY_CIK}; do
			legacyfiles+=( ${directory}/*.bin )
		done
		insinto /lib/firmware/radeon
		doins ${legacyfiles[@]}
	fi
	for directory in */; do
		if [[ ${AMDGPU_LEGACY_CIK} != *${directory%/}* ]]; then
			files+=( ${directory}/*.bin )
		fi
	done
	insinto /lib/firmware/amdgpu
	doins ${files[@]}
	FILES=( ${files[@]/*\//amdgpu/} ${legacyfiles[@]/*\//radeon/} )
}

pkg_postinst() {
	if linux_config_exists && linux_chkconfig_builtin DRM_AMDGPU; then
		if ! linux_chkconfig_present FIRMWARE_IN_KERNEL || \
			! [[ "$(linux_chkconfig_string EXTRA_FIRMWARE)" == *_rlc.bin* ]]; then
			ewarn "Your kernel has amdgpu DRM built-in but not the microcode."
			ewarn "For kernel modesetting to work, please set in kernel config"
			ewarn "CONFIG_FIRMWARE_IN_KERNEL=y"
			ewarn "CONFIG_EXTRA_FIRMWARE_DIR=\"/lib/firmware\""
			ewarn "CONFIG_EXTRA_FIRMWARE=\"${FILES[@]}\""
			ewarn "You may skip microcode files for which no hardware is installed."
			ewarn "More information at https://wiki.gentoo.org/wiki/AMDGPU#Firmware"
		fi
	fi
}
