Vendor/ODM DLKM Partition

Android 11 introduces the concept of the Generic Kernel Image and the vendor boot partition. The vendor boot partition stores kernel modules compatible with GKI, and is loaded by first stage init. Kernel Modules prior to Android 11’s release are also stored in vendor and ODM partitions, and are loaded by vendor processes.

For Android 11 or higher, the kernel and all kernel modules can be updated independently from the rest of the partitions. To enable updates for kernel modules stored in the vendor partition (without a vendor partition update), move all vendor partition modules to a new partition called Vendor DLKM (dynamically loadable kernel module). You can then update this partition independently. Similarly, you can move all kernel modules stored in the ODM partition to a new partition called ODM DLKM. This partition can be updated independently as well.

Partition location

vendor_dlkm and odm_dlkm partitions are located in the super partition as another dynamic partition.

vendor_dlkm contents in /vendor/lib/modules

  • Vendor kernel modules
  • modprobe config files
  • A modules.load file

odm_dlkm contents in /odm/lib/modules

  • ODM kernel modules
  • modprobe config files
  • A modules.load file

See Kernel Module Support for further details on kernel module config files.

Build support

Building vendor_dlkm and odm_dlkm is a similar process to building other dynamic partitions.

vendor_dlkm build example

Build vendor_dlkm as shown in the example below.

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

Replace <GROUP_NAME> with the appropriate name of the update group. The update group should be the group that the vendor partition is in.

For A/B and Virtual A/B devices, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Add the following entry for vendor_dlkm to fstab. Change flags according to the device. Use the CL Add vendor_dlkm to CF as an example.

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

odm_dlkm build example

Build odm_dlkm as shown in the example below.

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

For A/B and Virtual A/B devices, device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

Add the following entry for odm_dlkm to fstab. Change flags according to the device. Use the CL Add odm_dlkm to CF as an example.

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Copying kernel modules into a partition

To select the kernel modules you want to copy into the vendor_dlkm partition, list them in BOARD_VENDOR_KERNEL_MODULES.

If you want to override the contents of modules.load, you can specify it in BOARD_VENDOR_KERNEL_MODULES_LOAD.

At build time, modules listed in BOARD_VENDOR_KERNEL_MODULES are installed in $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules. A symbolic link is created at /vendor/lib/modules that leads to /vendor_dlkm/lib/modules.

Similarly, to select the kernel modules you want to copy into the odm_dlkm partition, list them in BOARD_ODM_KERNEL_MODULES. The platform build runs depmod on the modules and copies the depmod output files into the image. The build creates a modules.load file and stores it in the image. This file contains all of the modules listed in BOARD_ODM_KERNEL_MODULES.

If you want to override the contents of modules.load, you can specify it in BOARD_ODM_KERNEL_MODULES_LOAD.

At build time, modules listed in BOARD_ODM_KERNEL_MODULES will be installed in $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules. A symbolic link will be created at /odm/lib/modules that leads to /odm_dlkm/lib/modules.

Always use /vendor/lib/modules and /odm/lib/modules for vendor and ODM kernel modules.

Never use /vendor_dlkm/lib/modules. Devices without a vendor_dlkm partition install BOARD_VENDOR_KERNEL_MODULES to /vendor/lib/modules directly. This is problematic as /vendor_dlkm/lib/modules doesn't exist.

Never use /odm_dlkm/lib/modules. Devices without an odm_dlkm partition install BOARD_ODM_KERNEL_MODULES to /odm/lib/modules directly. This is problematic as /odm_dlkm/lib/modules doesn't exist.

Partition mounting and module loading

During first_stage_init, the vendor_dlkm and odm_dlkm partitions are mounted in the /vendor_dlkm and /odm_dlkm partitions, respectively. When this happens, symlinks at /vendor/lib/modules and /odm/lib/modules become available.

A vendor process (like a '.rc' script) can then load the kernel modules based on the order specified in modules.load. The vendor process can also load the modules at a later time, if necessary.

For documentation regarding the creation of a vendor-boot partition (which contains the vendor RAMDisk), refer to Kernel Module Support.