diff --git a/README.md b/README.md index b71b4042..e76bad6f 100644 --- a/README.md +++ b/README.md @@ -271,6 +271,7 @@ This table lists additional build or install options: | __COMPONENT__ | __OPTION__ | __TOOLS__ | |----------------|:----------------:|:-------------------------------:| | dracut | `HAVE_DRACUT` | zdev | +| initramfs-tools| `HAVE_INITRAMFS` | zdev | The s390-tools build process uses "pkg-config" if available and hard-coded compiler and linker options otherwise. diff --git a/zdev/Makefile b/zdev/Makefile index 01f8959c..2fc997c2 100644 --- a/zdev/Makefile +++ b/zdev/Makefile @@ -8,6 +8,7 @@ install: all $(MAKE) -C src install $(MAKE) -C man install $(MAKE) -C dracut install + $(MAKE) -C initramfs install clean: $(MAKE) -C src clean diff --git a/zdev/initramfs/Makefile b/zdev/initramfs/Makefile new file mode 100644 index 00000000..8630cdaa --- /dev/null +++ b/zdev/initramfs/Makefile @@ -0,0 +1,22 @@ +# Common definitions +include ../../common.mak + +INITRAMFSDIR := /usr/share/initramfs-tools +HOOKDIR := $(INITRAMFSDIR)/hooks +INITTOP := $(INITRAMFSDIR)/scripts/init-top + +# HAVE_INITRAMFS +# +# This install time parameter determines whether the zdev initramfs support is +# installed (HAVE_INITRAMFS=1) or not (default). When installed, the module +# performs the following functions when mkinitramfs is run: +# +# - install a boot-time hook to apply firmware-provided configuration data +# to the system +# +ifeq ($(HAVE_INITRAMFS),1) +install: + $(INSTALL) -m 755 -d $(DESTDIR)/$(HOOKDIR) $(DESTDIR)/$(INITTOP) + $(INSTALL) -m 755 hooks/zdev $(DESTDIR)/$(HOOKDIR) + $(INSTALL) -m 755 scripts/init-top/zdev $(DESTDIR)/$(INITTOP) +endif diff --git a/zdev/initramfs/hooks/zdev b/zdev/initramfs/hooks/zdev new file mode 100644 index 00000000..234e5bb0 --- /dev/null +++ b/zdev/initramfs/hooks/zdev @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Copyright IBM Corp. 2016, 2017 +# +# s390-tools is free software; you can redistribute it and/or modify +# it under the terms of the MIT license. See LICENSE for details. +# +# hooks/zdev +# This hook script adds files required to apply firmware-provided I/O +# configuration data during boot. +# + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in + prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions + +# Add modules for all device types supported by chzdev (required for +# auto-configuration) +zdev_modules="lcs qeth qeth_l2 qeth_l3 dasd_mod dasd_eckd_mod dasd_fba_mod dasd_diag_mod zfcp" + +for x in $zdev_modules ; do + manual_add_modules ${x} +done + +copy_exec /sbin/chzdev +copy_exec /sbin/lszdev +copy_exec /sbin/vmcp diff --git a/zdev/initramfs/scripts/init-top/zdev b/zdev/initramfs/scripts/init-top/zdev new file mode 100644 index 00000000..6f89d80b --- /dev/null +++ b/zdev/initramfs/scripts/init-top/zdev @@ -0,0 +1,67 @@ +#!/bin/sh +# +# Copyright IBM Corp. 2017 +# +# s390-tools is free software; you can redistribute it and/or modify +# it under the terms of the MIT license. See LICENSE for details. +# +# scripts/init-top/zdev +# Parse the kernel command line for rd.zdev kernel parameters. These +# parameters are evaluated and used to configure z Systems specific devices. +# +# Format: +# rd.zdev=no-auto +# +# where +# +# no-auto: Indicates that firmware-provided I/O configuration data +# should not be applied. +# + +PREREQ="udev" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +prereqs) + prereqs + exit 0 + ;; +esac + +. /scripts/functions + +zdev_fw_file="/sys/firmware/sclp_sd/config/data" +zdev_base_args="--force --yes --no-root-update --no-settle --auto-conf --quiet" + +if [ -e "$zdev_fw_file" ] ; then + zdev_auto=1 +else + zdev_auto=0 +fi + +for x in $(cat /proc/cmdline); do + case ${x} in + rd.zdev=*) + zdev_arg=${x#*=} + if [ "$zdev_arg" = "no-auto" ] ; then + zdev_auto=0 + fi + ;; + esac +done + +if [ $zdev_auto -eq 1 ] ; then + log_begin_msg "Starting firmware auto-configuration" + chzdev --import "$zdev_fw_file" $zdev_base_args + log_end_msg + + # Repeat cold-plug after creating udev rules + udevadm control --reload + udevadm trigger --type=subsystems --action=add + udevadm trigger --action=add + udevadm settle || true +fi