linux/Documentation
Sizhe Liu 2b8a2e5d42 perf hisi-ptt: Fix PTT trace TLP header parsing
TLP Headers traced by HiSilicon PCIe tune and trace device (PTT) in
4DW format are shown in the document as below:
bits [31:30] [ 29:25 ][24][23][22][21][    20:11   ][    10:0    ]
     |-----|---------|---|---|---|---|-------------|-------------|
DW0  [ Fmt ][  Type  ][T9][T8][TH][SO][   Length   ][    Time    ]
DW1  [                     Header DW1                            ]
DW2  [                     Header DW2                            ]
DW3  [                     Header DW3                            ]

Problem:
The DW0 bit field layout of the hisi_ptt_4dw union does not match the
actual bit ordering in little-endian memory, causing incorrect field
decoding.

Test on Kunpeng 930 SOC, generating data flow with `iperf` commands:
- server side:
    iperf -s
- client side:
    iperf -c $ip_addr -t 30

Trace the TLP headers with hisi_ptt on server side at the same time:
  perf record -e hisi_ptt12_0/type=4,filter=0x05101,direction=2,format=0/ \
  --max-size 50M -o perf.data &
The trace aims to capture completion TLPs, learn more in the document:
  https://docs.kernel.org/trace/hisi-ptt.html

Decode perf.data with hisi_ptt decoder:
  perf report -D

The hisi_ptt decoder produces the following result:
[...perf headers and other information]
. ... HISI PTT data: size 8388608 bytes
.  00000000: 68 87 20 94                                 Format 3 Type 1a T9 0 T8 1 TH 1 SO 1 Length 10 Time 4a1
.  00000004: 40 00 00 00                                 Header DW1
.  00000008: 40 00 01 51                                 Header DW2
.  0000000c: 00 00 00 00                                 Header DW3
[...other hisi_ptt TLP headers]

According to PCIe r5.0 sec 2.2.1, the Fmt & Type of Cpl/CplD is supposed
to be 8b'00001010' / 8b'01001010'
However, the Format & Type decoder analyzing result is 8b'01111010'.
It does not match field encodings of any TLP.

Correct decoder result should be:
[...perf headers and other information]
. ... HISI PTT data: size 8388608 bytes
.  00000000: 94 20 87 68                                 Format 2 Type a T9 0 T8 0 TH 0 SO 1 Length 10 Time 768
.  00000004: 00 00 00 40                                 Header DW1
.  00000008: 51 01 00 40                                 Header DW2
.  0000000c: 00 00 00 00                                 Header DW3
[...other hisi_ptt TLP headers]

To solve the problem:
1. Drop the union and C bitfield struct, store the raw DW value in
a plain uint32_t, and extract the fields with FIELD_GET() against
GENMASK/BIT masks declared in the header so they can be reused by
other translation units. The masks are portable across endianness and
compilers.

2. Print all DW hex values in big-endian byte order for readability,
matching the bit field layout shown in the 4DW format diagram.

3. Read the DW value with get_unaligned_le32() instead of an unaligned
pointer cast, avoiding both strict-aliasing violations and
alignment hazards on hosts that do not support unaligned access.

Cc: stable@vger.kernel.org
Fixes: 5e91e57e68 ("perf auxtrace arm64: Add support for parsing HiSilicon PCIe Trace packet")
Reviewed-by: James Clark <james.clark@linaro.org>
Signed-off-by: Sizhe Liu <liusizhe5@huawei.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
2026-07-31 15:48:12 -07:00
..
ABI 12 hotfixes. 8 are cc:stable and the remainder address post-7.1 issues or 2026-07-20 13:04:47 -07:00
accel
accounting
admin-guide Docs/admin-guide/cgroup-v2: note blkcg_debug_stats gates io.latency stats 2026-07-07 12:26:23 -10:00
arch RISC-V updates for v7.2-rc3 2026-07-12 11:25:40 -07:00
block for-7.2/block-20260615 2026-06-16 13:02:47 +05:30
bpf Documentation/bpf: Refresh map_lru_hash_update.dot for rqspinlock 2026-06-07 18:46:13 -07:00
cdrom
core-api liveupdate: updates for 7.2-rc1 2026-06-21 09:46:14 -07:00
cpu-freq cpufreq: Use policy->min/max init as QoS request 2026-06-08 18:42:14 +02:00
crypto lib/crypto: docs: Improve introduction sentence 2026-07-09 11:06:05 -04:00
dev-tools linux_kselftest-next-7.2-rc1-second 2026-06-23 07:35:37 -07:00
devicetree MMC core: 2026-07-17 09:27:02 -07:00
doc-guide
driver-api A handful of late-arriving docs fixes, along with one document update 2026-06-25 09:09:38 -07:00
edac
fault-injection
fb
features LoongArch: Add THREAD_INFO_IN_TASK implementation 2026-06-25 13:03:47 +08:00
filesystems ksmbd: doc: update feature support status for durable handles and compression 2026-06-30 21:29:46 -05:00
firmware_class
firmware-guide docs: acpi: dsd: add Motorcomm yt8xxx PHY properties 2026-05-11 18:05:22 -07:00
fpga
gpu drm-next for 7.2-rc1 2026-06-17 10:21:00 +01:00
hid
hwmon docs: hwmon: ltc4283: fix malformed table docs build error 2026-06-29 08:47:44 -07:00
i2c
iio docs: iio: adc: ad4691: add driver documentation 2026-05-31 11:14:22 +01:00
images
infiniband docs: infiniband: correct name of option to enable the ib_uverbs module 2026-06-16 14:47:24 -03:00
input Input: userio - allow setting other id values 2026-06-01 21:49:14 -07:00
kbuild kconfig: add optional warnings for changed input values 2026-06-18 11:46:32 -07:00
kernel-hacking Documentation: adopt new coding style of type-aware kmalloc-family 2026-05-03 08:54:21 -06:00
leds LEDs for v7.2 2026-06-18 14:45:08 -07:00
litmus-tests
livepatch
locking Things have calmed down a bit on the docs front, with no earthshaking 2026-06-16 08:35:59 +05:30
maintainer docs: auto-generate maintainer entry profile links 2026-05-03 09:24:30 -06:00
mhi
misc-devices misc: Remove old APDS990x driver 2026-04-27 09:58:24 +01:00
mm A handful of late-arriving docs fixes, along with one document update 2026-06-25 09:09:38 -07:00
netlabel
netlink NFSD 7.2 Release Notes 2026-06-18 09:14:15 -07:00
networking vlan: defer real device state propagation to netdev_work 2026-06-25 10:18:40 -07:00
nvdimm
nvme
PCI Documentation: PCI: Fix typos 2026-04-27 09:47:42 -05:00
pcmcia
peci
power
process MAINTAINERS: update ndesaulniers 2026-07-06 15:49:29 -07:00
RCU Documentation: RCU: adopt new coding style of type-aware kmalloc-family 2026-05-03 08:55:13 -06:00
rust s390 updates for 7.2 merge window 2026-06-16 05:08:13 +05:30
scheduler sched_ext: Documentation: Fix ops table header reference 2026-07-07 12:23:33 -10:00
scsi scsi: st: Fix typo in documentation 2026-05-14 21:59:19 -04:00
security integrity-v7.2 2026-06-19 11:32:05 -07:00
sound Documentation: sound: tas675x: Fix temperature range and impedance documentation 2026-07-01 19:52:38 +01:00
sphinx docs: maintainers_include: keep the last entry at the end 2026-05-25 14:24:09 -06:00
sphinx-includes
sphinx-static docs: sphinx-static: fix typo "wich" -> "which" 2026-05-15 07:52:37 -06:00
spi Documentation: adopt new coding style of type-aware kmalloc-family 2026-05-03 08:54:21 -06:00
staging docs: staging: fix various typos and grammar issues 2026-04-27 04:00:29 -06:00
sunrpc/xdr Documentation: Add the RPC language description of NLM version 3 2026-06-09 16:32:59 -04:00
target
tee
timers
tools A handful of late-arriving docs fixes, along with one document update 2026-06-25 09:09:38 -07:00
trace perf hisi-ptt: Fix PTT trace TLP header parsing 2026-07-31 15:48:12 -07:00
translations MAINTAINERS: update ndesaulniers 2026-07-06 15:49:29 -07:00
usb
userspace-api Char/Misc/IIO/FPGA/GPIB/etc driver updates for 7.2-rc1 2026-06-22 12:20:21 -07:00
virt s390: 2026-06-25 10:21:13 -07:00
w1
watchdog Things have calmed down a bit on the docs front, with no earthshaking 2026-06-16 08:35:59 +05:30
wmi modpost: Handle malformed WMI GUID strings 2026-06-12 16:01:55 +03:00
.gitignore
.renames.txt Revert "drivers: net: 3com: 3c509: Remove this driver" 2026-05-21 08:28:56 -07:00
atomic_bitops.txt
atomic_t.txt
Changes
CodingStyle
conf.py
docutils.conf
index.rst
Kconfig
Makefile
memory-barriers.txt
SubmittingPatches
subsystem-apis.rst net: remove ISDN subsystem and Bluetooth CMTP 2026-04-23 10:24:02 -07:00