Skip to content

ACPI and Device Tree expose incomplete CPU topology information on CIX Sky1 / CD8180 #43

Description

@coffnix

This issue is reproducible on both kernel 6.19.14 and 7.0.14. Reported also on Sky1-Linux/linux-sky1#33

Summary

There are two different issues depending on the boot method:

  1. ACPI boot
    • CPU topology is detected correctly.
    • CPU frequencies are reported correctly.
    • L1, L2, and L3 cache information is missing from both lscpu and hwloc.
  2. Device Tree (DTB) boot
    • L1, L2, and L3 cache information is exposed correctly.
    • CPU frequency information becomes incorrect and shows bogus values.

It seems that neither boot method currently exposes all CPU topology information correctly.

Hardware

  • Board: Orange Pi 6 Plus
  • SoC: CIX Sky1 / CD8180 (CD8160 compatible branding)
  • CPU: 8x Cortex-A720 + 4x Cortex-A520
  • Firmware: SystemReady ACPI firmware
  • Kernel: 6.19.14

Expected CPU frequencies

According to the board specifications, the CPU frequencies should be approximately:

  • Cortex-A720 cluster: up to 2.6 GHz
  • Cortex-A520 cluster: up to 1.8 GHz

These frequencies are reported correctly when booting with ACPI

Problem 1: ACPI mode

lscpu and hwloc do not report cache hierarchy information.

Expected:

  • L1d cache
  • L1i cache
  • L2 cache
  • L3 cache

Actual:

Cache information is missing entirely.

This also affects tools such as hwloc-ls and lstopo, which cannot build the proper cache topology.

Problem 2: Device Tree mode

When booting using a DTB file, cache information becomes available and is reported correctly.

However, CPU frequencies become incorrect and show unrealistic values.

Example:

Expected:

  • Cortex-A720: 2.6 GHz
  • Cortex-A520: 1.8 GHz

Actual:

  • Cortex-A720: 1.5 GHz
  • Cortex-A520: 1.8 GHz

Reproduction

ACPI boot

lscpu
lstopo
hwloc-info

Device Tree boot

lscpu
lstopo
hwloc-info

Question

It looks like the cache hierarchy information exists in the Device Tree but is not exposed properly through ACPI, while the CPU frequency information behaves in the opposite way.

Could this be caused by:

  • incomplete PPTT (Processor Properties Topology Table) information in ACPI?
  • missing cache nodes in the ACPI tables?
  • incorrect OPP or cpufreq information in the Device Tree?
  • missing cache descriptors in firmware?

In short, the cache topology information exposed by the kernel appears to be broken. The /sys/devices/system/cpu/cpu*/cache/ hierarchy does not provide any size values, which causes tools such as hwloc to report all caches as 0KB. Additionally, the reported sharing information is incorrect, as L1 data, L1 instruction and L2 caches are shown as being shared by all 12 CPUs (0-11), which is architecturally impossible for this SoC. This strongly suggests a problem in the ACPI PPTT tables or in the kernel’s cache topology parsing for the CIX platform, rather than an issue in hwloc itself. Same issue on kernel 7.0.14. Look:

The issue is reproducible on both 6.19.14 and 7.0.14 and does not appear to be a regression in a specific kernel version.

opi6plus ~ # for c in /sys/devices/system/cpu/cpu0/cache/index*; do
    echo "===== $c ====="
    cat "$c/level" "$c/type" "$c/size" "$c/shared_cpu_list" 2>/dev/null
done
===== /sys/devices/system/cpu/cpu0/cache/index0 =====
1
Data
0-11
===== /sys/devices/system/cpu/cpu0/cache/index1 =====
1
Instruction
0-11
===== /sys/devices/system/cpu/cpu0/cache/index2 =====
2
Unified
0-11
===== /sys/devices/system/cpu/cpu0/cache/index3 =====
3
Unified
0-1,6-11
opi6plus ~ # for cpu in /sys/devices/system/cpu/cpu*/cache/index*; do
    printf '%s: ' "$cpu"
    cat "$cpu/level" "$cpu/type" "$cpu/size" "$cpu/shared_cpu_list" 2>/dev/null | paste -sd ' '
done
/sys/devices/system/cpu/cpu0/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu0/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu0/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu0/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu10/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu10/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu10/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu10/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu11/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu11/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu11/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu11/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu1/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu1/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu1/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu1/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu2/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu2/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu2/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu3/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu3/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu3/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu4/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu4/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu4/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu5/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu5/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu5/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu6/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu6/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu6/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu6/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu7/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu7/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu7/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu7/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu8/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu8/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu8/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu8/cache/index3: 3 Unified 0-1,6-11
/sys/devices/system/cpu/cpu9/cache/index0: 1 Data 0-11
/sys/devices/system/cpu/cpu9/cache/index1: 1 Instruction 0-11
/sys/devices/system/cpu/cpu9/cache/index2: 2 Unified 0-11
/sys/devices/system/cpu/cpu9/cache/index3: 3 Unified 0-1,6-11

Kernel built from vanilla-sources using the latest cix-linux-main patchset plus PR #27 and PR #37.

opi6plus ~ # cat compile-kernel-cix-patches.sh
#!/bin/bash

### opi 6 plus

cd /usr/src ; rm -rf /usr/src/cix-linux-main ;  git clone https://github.com/cixtech/cix-linux-main.git

cd /usr/src/linux

# bug on 7.0.14 and new patch - after commit 759efc0 - https://github.com/cixtech/cix-linux-main/pull/37
cd /usr/src/cix-linux-main/patches-7.0/
sed -i 's/if (IS_ERR(n_phandles))/if (n_phandles < 0)/' /usr/src/cix-linux-main/patches-7.0/0033-regulator-add-acpi-support.patch

rm 0061-DPTSW-24991-usb-fix-SError-during-poweroff-by-releas.patch
rm 0062-DPTSW-25423-usb-cdns3-sky1-disabled-IRQ-before-disab.patch
wget https://raw.githubusercontent.com/npmccallum/cix-linux-main/9ace918767af39e90d42d00e6ce22a2d770bfbd0/patches-7.0/0061-usb-cdns3-cdnsp-sky1-tear-down-host-on-shutdown.patch

# new patch on 7.0.14 - after commit 759efc0 - https://github.com/cixtech/cix-linux-main/pull/27
wget https://raw.githubusercontent.com/perlowja/cix-linux-main/ebf4c22a950cdc3e21f05cbf657e1b3309945360/patches-7.0/2005-uapi-armchina_aipu-update-structs-to-sdk-26q1-r2p1.patch

cd /usr/src/linux
for p in ../cix-linux-main/patches-7.0/*.patch; do patch -p1 < "$p"; done
cp /usr/src/cix-linux-main/config/config-7.0.defconfig .config

scripts/config --disable DRM_NOUVEAU
scripts/config --disable OCTEONTX2_PF
scripts/config --disable OCTEONTX2_VF
scripts/config --disable OCTEONTX2_AF
make olddefconfig

make -j"$(nproc)" Image
if [ "$?" -ne 0 ];then echo 'ERRO' ;exit 1 ;fi

make -j"$(nproc)" modules
if [ "$?" -ne 0 ];then echo 'ERRO' ;exit 1 ;fi

make -j"$(nproc)" dtbs
if [ "$?" -ne 0 ];then echo 'ERRO' ;exit 1 ;fi

cd /usr/src/linux
export NEW="$(make kernelrelease)"
cp /usr/src/linux/arch/arm64/boot/dts/cix/sky1-xcp.dtb /boot/efi/sky1-orangepi-6-plus-${NEW}.dtb
cp arch/arm64/boot/Image /boot/vmlinuz-${NEW}
cp arch/arm64/boot/Image /boot/efi/vmlinuz-${NEW}
cp System.map /boot/System.map-${NEW}
cp .config /boot/config-${NEW}
make modules_install
depmod -a "${NEW}"
ls /lib/modules/"${NEW}" >/dev/null || exit 1
dracut /boot/initramfs-${NEW}.img ${NEW}
cp /boot/initramfs-${NEW}.img /boot/efi/initramfs-${NEW}.img
cd

The problem appears to be split between firmware interfaces:

• ACPI mode provides correct CPU frequencies but exposes an incomplete or broken cache topology.
• Device Tree mode provides correct cache topology but exposes incorrect CPU frequency information.

At the moment there is no boot method that provides both pieces of information correctly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions