4 lanes pcie can't work well on TX2 carrier board with compiled kernel

Hi everyone,
i meet a problem about the pcie on TX2 carrier board.
Recently ,i bought a SSD PRO 970 and PCIE3.0 X4 to M.2 expansion card ,insert the the expansion card into J2 on TX2 carrier board.

1.First, i flash the TX2 with Jetpack3.3(JetPack-L4T-3.3-linux-x64_b39.run).After system boot up, a device node named “nvme0n1” existed in folder /dev.

I run “dmesg | grep pcie”,logs shown as following.
[ 0.143388] node /plugin-manager/fragment-500-pcie-config match with board >=3310-1000-500
[ 0.144122] node /plugin-manager/fragment-500-e3325-pcie match with board >=3310-1000-500
[ 0.273373] iommu: Adding device 10003000.pcie-controller to group 50
[ 6.440515] tegra-pcie 10003000.pcie-controller: 4x1, 1x1 configuration
[ 6.450084] tegra-pcie 10003000.pcie-controller: PCIE: Enable power rails
[ 6.458745] tegra-pcie 10003000.pcie-controller: probing port 0, using 4 lanes
[ 6.469667] tegra-pcie 10003000.pcie-controller: probing port 2, using 1 lanes
[ 6.902451] tegra-pcie 10003000.pcie-controller: link 2 down, retrying
[ 7.390456] tegra-pcie 10003000.pcie-controller: link 2 down, retrying
[ 7.806442] tegra-pcie 10003000.pcie-controller: link 2 down, retrying
[ 7.808457] tegra-pcie 10003000.pcie-controller: link 2 down, ignoring
[ 7.808784] tegra-pcie 10003000.pcie-controller: PCI host bridge to bus 0000:00
[ 7.809761] pcieport 0000:00:01.0: enabling device (0000 -> 0002)
[ 7.809841] pcieport 0000:00:01.0: Signaling PME through PCIe PME interrupt
[ 7.809848] pcie_pme 0000:00:01.0:pcie01: service driver pcie_pme loaded
[ 7.809935] aer 0000:00:01.0:pcie02: service driver aer loaded
[ 7.810280] tegra-pcie 10003000.pcie-controller: speed change : Gen-1 -> Gen-2

  1. second, i would compile the kernel source without any modification. Kernel source is downloaded from download center,version 28.2.1.

#export CROSS_COMPILE=aarch64-linux-gnu-
#export TEGRA_KERNEL_OUT=./kernel_out
#export ARCH=arm64
#mkdir $TEGRA_KERNEL_OUT
#make O=$TEGRA_KERNEL_OUT tegra18_defconfig
#make O=$TEGRA_KERNEL_OUT zImage

Then i got kernel image named “Image” in folder “kernel_out/arch/arm64/boot”, copy this image to “/boot” folder on TX2 filesystem. The “nvme0n1” node didn’t exist in /dev any more. I run “dmesg | grep pcie”,logs shown as following.
[ 0.143291] node /plugin-manager/fragment-500-pcie-config match with board >=3310-1000-500
[ 0.144023] node /plugin-manager/fragment-500-e3325-pcie match with board >=3310-1000-500
[ 0.268267] iommu: Adding device 10003000.pcie-controller to group 50

Then i try compile kernel modules ,copy all the modules into folder /lib/modules/4.4.38-tegra,but the same story.

#export CROSS_COMPILE=aarch64-linux-gnu-
#export TEGRA_KERNEL_OUT=./kernel_out
#export ARCH=arm64
#mkdir $TEGRA_KERNEL_OUT
#make O=$TEGRA_KERNEL_OUT modules
#make modules_install

Then i restore TX2 system . Copy kernel image “Linux_for_Tegra/kernel/Image” into /boot folder, and decompress kernel modules “Linux_for_Tegra/kernel/kernel_supplements.tbz2” into /lib/modules/4.4.38-tegra.
After system boot up,“nvme0n1” node existed in folder “/dev” again.

Is the default Kernel Image in jetpack3.3 different with compiled image from kernel source? Many thanks.

Did you set “CONFIG_LOCALVERSION” to “-tegra” of your “.config”?

CONFIG_LOCALVERSION="-tegra"

A kernel produces a version for the command “uname -r”. That version consists of the base kernel source version (e.g., “4.4.38”), followed by a suffix of CONFIG_LOCALVERSION. If you set this to “-tegra”, then “uname -r” becomes “4.4.38-tegra”.

Modules are searched for at:

/lib/modules/$(uname -r)/

The directory “/lib/modules/4.4.38-tegra/” is completely irrelevant if CONFIG_LOCALVERSION is missing.

Thank you. Yes, After command “uname -r”, i got “4.4.38”,rather than “4.4.38-tegra”.