Pablo Greco ceb317
#! /bin/bash
Pablo Greco ceb317
#
Pablo Greco ceb317
# Called as filter-modules.sh list-of-modules Arch
Pablo Greco ceb317
Pablo Greco ceb317
# This script filters the modules into the kernel-core and kernel-modules
Pablo Greco ceb317
# subpackages.  We list out subsystems/subdirs to prune from the installed
Pablo Greco ceb317
# module directory.  What is left is put into the kernel-core package.  What is
Pablo Greco ceb317
# pruned is contained in the kernel-modules package.
Pablo Greco ceb317
#
Pablo Greco ceb317
# This file contains the default subsys/subdirs to prune from all architectures.
Pablo Greco ceb317
# If an architecture needs to differ, we source a per-arch filter-<arch>.sh file
Pablo Greco ceb317
# that contains the set of override lists to be used instead.  If a module or
Pablo Greco ceb317
# subsys should be in kernel-modules on all arches, please change the defaults
Pablo Greco ceb317
# listed here.
Pablo Greco ceb317
Pablo Greco ceb317
# Overrides is individual modules which need to remain in kernel-core due to deps.
Pablo Greco ceb317
overrides="cec"
Pablo Greco ceb317
Pablo Greco ceb317
# Set the default dirs/modules to filter out
Pablo Greco ceb317
driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband leds media memstick mfd mmc mtd nfc ntb pcmcia platform power ssb soundwire staging tty uio w1"
Pablo Greco ceb317
Pablo Greco ceb317
chardrvs="mwave pcmcia"
Pablo Greco ceb317
Pablo Greco ceb317
netdrvs="appletalk can dsa hamradio ieee802154 ppp slip usb wireless"
Pablo Greco ceb317
Pablo Greco ceb317
ethdrvs="3com adaptec alteon amd aquantia atheros broadcom cadence calxeda chelsio cisco dec dlink emulex marvell mellanox neterion nvidia packetengines qlogic rdc sfc silan sis smsc stmicro sun tehuti ti wiznet xircom"
Pablo Greco ceb317
Pablo Greco ceb317
inputdrvs="gameport tablet touchscreen"
Pablo Greco ceb317
Pablo Greco ceb317
hiddrvs="surface-hid"
Pablo Greco ceb317
Pablo Greco ceb317
scsidrvs="aacraid aic7xxx be2iscsi bfa bnx2i bnx2fc csiostor cxgbi esas2r fcoe fnic isci libsas lpfc megaraid mpt3sas mvsas pm8001 qla2xxx qla4xxx sym53c8xx_2 ufs qedf"
Pablo Greco ceb317
Pablo Greco ceb317
usbdrvs="atm image misc serial"
Pablo Greco ceb317
Pablo Greco ceb317
fsdrvs="affs befs cifs coda cramfs dlm ecryptfs hfs hfsplus jfs jffs2 minix nilfs2 ocfs2 reiserfs romfs squashfs sysv ubifs ufs"
Pablo Greco ceb317
Pablo Greco ceb317
netprots="6lowpan appletalk atm ax25 batman-adv bluetooth can dsa ieee802154 l2tp mac80211 mac802154 mpls netrom nfc rds rfkill rose sctp smc wireless"
Pablo Greco ceb317
Pablo Greco ceb317
drmdrvs="amd ast bridge gma500 i2c i915 mgag200 nouveau panel radeon"
Pablo Greco ceb317
Pablo Greco ceb317
singlemods="ntb_netdev iscsi_ibft iscsi_boot_sysfs megaraid pmcraid qedi qla1280 9pnet_rdma rpcrdma nvmet-rdma nvme-rdma hid-picolcd hid-prodikeys hwpoison-inject target_core_user sbp_target cxgbit  chcr parport_serial regmap-sdw regmap-sdw-mbq arizona-micsupp hid-asus iTCO_wdt rnbd-client rnbd-server mlx5_vdpa spi-altera-dfl"
Pablo Greco ceb317
Pablo Greco ceb317
# Grab the arch-specific filter list overrides
Pablo Greco ceb317
source ./filter-$2.sh
Pablo Greco ceb317
Pablo Greco ceb317
filter_dir() {
Pablo Greco ceb317
	filelist=$1
Pablo Greco ceb317
	dir=$2
Pablo Greco ceb317
Pablo Greco ceb317
	grep -v -e "${dir}/" ${filelist} > ${filelist}.tmp
Pablo Greco ceb317
Pablo Greco ceb317
	if [ $? -ne 0 ]
Pablo Greco ceb317
	then
Pablo Greco ceb317
		echo "Couldn't remove ${dir}.  Skipping."
Pablo Greco ceb317
	else
Pablo Greco ceb317
		grep -e "${dir}/" ${filelist} >> k-d.list
Pablo Greco ceb317
		mv ${filelist}.tmp $filelist
Pablo Greco ceb317
	fi
Pablo Greco ceb317
	
Pablo Greco ceb317
	return 0
Pablo Greco ceb317
}
Pablo Greco ceb317
Pablo Greco ceb317
filter_ko() {
Pablo Greco ceb317
	filelist=$1
Pablo Greco ceb317
	mod=$2
Pablo Greco ceb317
Pablo Greco ceb317
	grep -v -e "${mod}.ko" ${filelist} > ${filelist}.tmp
Pablo Greco ceb317
Pablo Greco ceb317
	if [ $? -ne 0 ]
Pablo Greco ceb317
	then
Pablo Greco ceb317
		echo "Couldn't remove ${mod}.ko  Skipping."
Pablo Greco ceb317
	else
Pablo Greco ceb317
		grep -e "${mod}.ko" ${filelist} >> k-d.list
Pablo Greco ceb317
		mv ${filelist}.tmp $filelist
Pablo Greco ceb317
	fi
Pablo Greco ceb317
	
Pablo Greco ceb317
	return 0
Pablo Greco ceb317
}
Pablo Greco ceb317
Pablo Greco ceb317
# Filter the drivers/ subsystems
Pablo Greco ceb317
for subsys in ${driverdirs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/${subsys}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Filter the networking drivers
Pablo Greco ceb317
for netdrv in ${netdrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/net/${netdrv}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Filter the char drivers
Pablo Greco ceb317
for char in ${chardrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/char/${char}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Filter the ethernet drivers
Pablo Greco ceb317
for eth in ${ethdrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/net/ethernet/${eth}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# SCSI
Pablo Greco ceb317
for scsi in ${scsidrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/scsi/${scsi}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Input
Pablo Greco ceb317
for input in ${inputdrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/input/${input}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# hid
Pablo Greco ceb317
for hid in ${hiddrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/hid/${hid}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# USB
Pablo Greco ceb317
for usb in ${usbdrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/usb/${usb}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Filesystems
Pablo Greco ceb317
for fs in ${fsdrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 fs/${fs}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Network protocols
Pablo Greco ceb317
for prot in ${netprots}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 kernel/net/${prot}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# DRM
Pablo Greco ceb317
for drm in ${drmdrvs}
Pablo Greco ceb317
do
Pablo Greco ceb317
	filter_dir $1 drivers/gpu/drm/${drm}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Just kill sound.
Pablo Greco ceb317
filter_dir $1 kernel/sound
Pablo Greco ceb317
filter_dir $1 kernel/drivers/soundwire
Pablo Greco ceb317
Pablo Greco ceb317
# Now go through and filter any single .ko files that might have deps on the
Pablo Greco ceb317
# things we filtered above
Pablo Greco ceb317
for mod in ${singlemods}
Pablo Greco ceb317
do
Pablo Greco ceb317
        filter_ko $1 ${mod}
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Now process the override list to bring those modules back into core
Pablo Greco ceb317
for mod in ${overrides}
Pablo Greco ceb317
do
Pablo Greco ceb317
	grep -v -e "/${mod}.ko" k-d.list > k-d.list.tmp
Pablo Greco ceb317
	if [ $? -ne 0 ]
Pablo Greco ceb317
        then
Pablo Greco ceb317
                echo "Couldn't save ${mod}.ko  Skipping."
Pablo Greco ceb317
        else
Pablo Greco ceb317
                grep -e "/${mod}.ko" k-d.list >> $filelist
Pablo Greco ceb317
                mv k-d.list.tmp k-d.list
Pablo Greco ceb317
        fi
Pablo Greco ceb317
Pablo Greco ceb317
done
Pablo Greco ceb317
Pablo Greco ceb317
# Go through our generated drivers list and remove the .ko files.  We'll
Pablo Greco ceb317
# restore them later.
Pablo Greco ceb317
for mod in `cat k-d.list`
Pablo Greco ceb317
do
Pablo Greco ceb317
	rm -rf $mod
Pablo Greco ceb317
done