PCIe & DMA
TEKNİK REHBER PCIe & DMA DONANIM 2026

PCIe Temelleri
Topoloji & Protokol

PCI Express mimarisini katman katman öğren — fiziksel serdes'ten transaction layer protokolüne, LTSSM state machine'den lspci analizine.

00 PCIe nedir? — PCI'dan PCIe'ye evrim

PCI Express (PCIe), paralel PCI veri yolunun yerini alan seri, nokta-nokta, yüksek hızlı bir ara bağlantı standardıdır. 2003'ten bu yana PC ve gömülü sistemlerin temel I/O omurgasıdır.

Klasik PCI'nın sınırları

Paralel veri yolu: PCI, 32 veya 64 bit paralel veri hattı kullanırdı. Sinyal hızı arttıkça çizgiler arası gecikmeler (skew) kritik hale geldi ve maksimum frekansı 66 MHz ile sınırladı. Tüm cihazlar aynı paylaşımlı veri yolunu kullandığından tek seferde yalnızca bir transfer gerçekleşebilirdi. Kablo uzunluğu: elektriksel gereksinimler, paralel hattın fiziksel uzunluğunu kısıtladı. Bant genişliği: 64-bit/66 MHz PCI, 533 MB/s'e ulaşabiliyordu — bu, AGP ve modern ekran kartları için yetersizdi.

PCIe tasarım ilkeleri

PCIe, paralel veri yolunun yerini alırken eski PCI yazılım modelini korudu. Sürücüler değişmeden çalışmaya devam etti; yalnızca fiziksel ve link katmanları yenilendi.

  ┌─────────────────────────────────────────────────────────┐
  │               PCIe Tasarım Kararları                    │
  ├─────────────────┬───────────────────────────────────────┤
  │ Seri diferansiyel│ Her lane: TX+ TX- / RX+ RX-          │
  │ çift             │ Diferansiyel sinyal → gürültü bağışıklığı│
  ├─────────────────┼───────────────────────────────────────┤
  │ Nokta-nokta      │ Paylaşımlı veri yolu yok → her cihaz│
  │ bağlantı         │ tam bant genişliğini kendisi kullanır│
  ├─────────────────┼───────────────────────────────────────┤
  │ Çift yönlü       │ TX ve RX ayrı → aynı anda gönder-al │
  │ (full-duplex)    │ (half-duplex PCI'ın iki katı)        │
  ├─────────────────┼───────────────────────────────────────┤
  │ Ölçeklenebilir   │ x1, x2, x4, x8, x16 lane — bant     │
  │ lane sayısı      │ genişliği ihtiyaca göre ayarlanır    │
  └─────────────────┴───────────────────────────────────────┘
    

PCI → PCIe geçişinin avantajları

ÖzellikPCI (64-bit/66 MHz)PCIe Gen3 x16Kazanım
Bant genişliği533 MB/s~16 GB/s~30×
TopolojiPaylaşımlı veri yoluNokta-noktaÇakışma yok
YönHalf-duplexFull-duplex2× efektif BW
Kablo uzunluğu~20 cm (board)Metrelerce (kablo)Daha esnek
Sinyal hattı32/64 paralel2 (diferansiyel çift)EMI azaldı
Hot-plugSınırlıTam destekÜretim ortamı

Bu bölümde

  • PCI: paylaşımlı paralel veri yolu; 66 MHz'de skew sorunu, 533 MB/s tavan
  • PCIe: seri diferansiyel çift, nokta-nokta, full-duplex — yazılım uyumluluğu korundu
  • x1'den x16'ya lane sayısı, bant genişliğini doğrusal artırır
  • PCIe Gen3 x16: ~16 GB/s — modern GPU ve NVMe SSD için temel

01 Fiziksel katman — lane, serdes, encoding

PCIe fiziksel katmanı, diferansiyel sinyal çiftlerini, serdes bloklarını ve bit akışı kodlamasını kapsar. Her nesil daha yüksek sembol hızı ve daha verimli kodlama kullanır.

Lane ve serdes yapısı

  Her PCIe Lane:
  ┌────────────┐    ┌──────────┐    ┌────────────┐
  │  TX Logic  │───▶│ Serdes   │───▶│  TX+ / TX- │──▶ (kablo/board trace)
  └────────────┘    │  (PLL +  │    └────────────┘
                    │Serializer)│
  ┌────────────┐    │          │    ┌────────────┐
  │  RX Logic  │◀───│ Deserializer │◀│  RX+ / RX- │◀── (karşı taraftan)
  └────────────┘    └──────────┘    └────────────┘

  x4 link = 4 ayrı lane (her biri bağımsız TX+RX çifti)
    

Serdes (Serializer/Deserializer): paralel veri bitlerini seri bit akışına çevirir (TX) ve seri akışı paralel veriye dönüştürür (RX). PLL (Phase-Locked Loop), saat sinyalini veri akışından kurtarır (CDR — Clock/Data Recovery).

Encoding: 8b/10b vs 128b/130b

Kodlama, DC dengeyi ve bit senkronizasyonunu sağlar. Gen1 ve Gen2, 8b/10b kullandı: her 8 bit veri için 10 bit gönderilir — %20 overhead. Gen3'ten itibaren 128b/130b: her 128 bit veri için 130 bit — yalnızca %1,5 overhead.

NesilSembol HızıEncodingx1 BW (tek yön)x16 BW (çift yön)
Gen12,5 GT/s8b/10b250 MB/s8 GB/s
Gen25,0 GT/s8b/10b500 MB/s16 GB/s
Gen38,0 GT/s128b/130b~985 MB/s~32 GB/s
Gen416,0 GT/s128b/130b~2 GB/s~64 GB/s
Gen532,0 GT/s128b/130b~4 GB/s~128 GB/s
Gen664,0 GT/sFLIT/CRC~8 GB/s~256 GB/s

Diferansiyel sinyal ve sinyal bütünlüğü

Diferansiyel çift: TX+ ve TX- zıt fazda sinyal taşır. Alıcı, iki sinyal arasındaki farkı (diferansiyel voltaj) ölçer. Ortak mod gürültüsü her iki hatta eşit etkilediğinden fark sabit kalır — üstün EMI bağışıklığı. Gömülü tasarımda PCB trace eşleştirmesi kritiktir: uzunluk, empedans (85Ω diferansiyel) ve via sayısı dikkatle yönetilmeli.

Bu bölümde

  • Her lane: TX+/TX- ve RX+/RX- diferansiyel çift; serdes ile seri/paralel dönüşüm
  • 8b/10b (Gen1/2): %20 overhead, DC denge; 128b/130b (Gen3+): yalnızca %1.5 overhead
  • Gen1: 2.5 GT/s, Gen3: 8 GT/s, Gen5: 32 GT/s — her nesil ~2× sembol hızı
  • Diferansiyel sinyal: ortak mod gürültüsü iptal — yüksek hız EMI toleransı

02 Link katmanı — DLLP, ACK/NAK, flow control

Data Link Layer (DLL), fiziksel katmanın üzerinde güvenilir TLP iletimi sağlar. ACK/NAK protokolü, sequence numarası ve yeniden gönderim (retry buffer) mekanizmaları burada çalışır.

DLLP (Data Link Layer Packet)

DLLP'ler, link katmanının kendi yönetim paketleridir — TLP'lerden bağımsız olarak gönderilir. Başlıca DLLP türleri:

Ack DLLPKarşı tarafın TLP'yi başarıyla aldığını bildirir; sequence number içerir
Nak DLLPTLP alımında hata; gönderici retry buffer'dan yeniden gönderir
InitFC1/InitFC2Flow control credit başlangıç değişimi (link başlatma sırasında)
UpdateFCAlıcı buffer'ı boşaldıkça credit iade eder
PM_Enter_L1Güç yönetimi: link'i L1 durumuna geçiş isteği

ACK/NAK mekanizması ve retry buffer

  Gönderici                              Alıcı
  ──────────                             ──────
  TLP(seq=5) ──────────────────────────▶ CRC kontrol
  Retry buffer'da tut                    ├─ OK  → Ack(5) gönder
                                         └─ Hata → Nak(5) gönder
                      Ack(5) ◀───────────
  seq=5'i buffer'dan sil

  Nak(5) gelirse:
  seq=5'i retry buffer'dan tekrar gönder
    

Flow Control Credits

PCIe, receiver buffer taşmasını önlemek için kredi tabanlı flow control kullanır. Alıcı, her sanal kanal için üç credit türünü bildirir:

Credit TürüAçıklamaBirim
Posted Header (PH)Posted yazma TLP header'ıHeader başına 1
Posted Data (PD)Posted yazma TLP verisi4-bayt birim
Non-Posted Header (NPH)Read request, config RWHeader başına 1
Completion Header (CPLH)Read completion headerHeader başına 1
Completion Data (CPLD)Read completion verisi4-bayt birim

Gönderici, kredisi bitmeden yeni TLP gönderemez. Alıcı buffer'ından veri okundukça UpdateFC DLLP ile kredi iade edilir.

Bu bölümde

  • DLLP: link katmanı yönetim paketi — Ack, Nak, FC update, PM geçiş
  • Her TLP'ye sequence numarası atanır; gönderici retry buffer'da tutar, Ack gelince siler
  • Nak gelirse retry buffer'dan tekrar gönderim yapılır — donanım düzeyinde güvenilirlik
  • Flow control: kredi tükenmeden TLP gönderilemez; buffer taşması imkânsız

03 Transaction katmanı — TLP türleri

Transaction Layer Packet (TLP), PCIe'nin en üst katman paketidir. Bellek okuma/yazma, konfigürasyon erişimi ve mesajlar bu katmanda paketlenir.

TLP genel yapısı

  ┌──────────────────────────────────────────────────────┐
  │  TLP Header (3 veya 4 DWord = 12 veya 16 bayt)       │
  │  ┌──────────┬──────────┬────────────┬──────────────┐ │
  │  │  Fmt/Type│  Length  │  Requester │  Tag         │ │
  │  │ (format+ │ (10-bit) │  ID (BDF)  │ (8-bit)      │ │
  │  │  tip)    │          │            │              │ │
  │  └──────────┴──────────┴────────────┴──────────────┘ │
  │  + Address (32 veya 64 bit)                           │
  ├──────────────────────────────────────────────────────┤
  │  Data Payload (0–4096 bayt, 4-bayt hizalı)           │
  ├──────────────────────────────────────────────────────┤
  │  ECRC (opsiyonel, 4 bayt)                            │
  └──────────────────────────────────────────────────────┘
    

TLP türleri

TLP TürüFmtAçıklamaYanıt
Memory Read (MRd)No-dataBellek adresinden okuma isteğiCompletion with Data
Memory Write (MWr)With-dataBellek adresine yazma (posted)Yok (posted)
Config Read (CfgRd0/1)No-dataConfig space'den okumaCompletion with Data
Config Write (CfgWr0/1)With-dataConfig space'e yazmaCompletion (no data)
IO Read (IORd)No-dataI/O adres uzayından okumaCompletion with Data
IO Write (IOWr)With-dataI/O adres uzayına yazmaCompletion
Completion (Cpl/CplD)±dataNon-posted isteğin yanıtı
Message (Msg)±dataINTx, PME, kural dışı durum bildirimOpsiyonel

Posted vs Non-Posted işlemler

Posted: gönderici yanıt beklemez; Memory Write ve Mesajlar posted'dır. Gecikme gizlenir — performans avantajı. Non-Posted: gönderici Completion TLP bekler; Memory/Config/IO Read, Config Write non-posted'dır. Completion Timeout süre aşımı hata olarak raporlanır.

Tag mekanizması

Her non-posted isteğe 8-bit Tag atanır (Gen5+'te 10-bit). Requestor, aynı anda en fazla 256 bekleyen isteği takip edebilir. Completion TLP, aynı Tag'i taşır — böylece hangi isteğin yanıtı olduğu anlaşılır.

Bu bölümde

  • TLP: Header (12/16 bayt) + Payload (0–4096 bayt) + opsiyonel ECRC
  • MWr: posted (yanıt yok, düşük gecikme); MRd: non-posted (Completion bekler)
  • Config TLP'ler: BIOS/OS başlangıcında BAR ve diğer kayıtları yapılandırmak için
  • Tag: gönderici, bekleyen non-posted isteklerini Tag ile eşleştirir

04 Topoloji — RC, Switch, Endpoint, BDF

PCIe sistemi, Root Complex üzerinden dallanan bir ağaç topolojisinde çalışır. Her cihaz, Bus:Device:Function (BDF) adresiyle benzersiz tanımlanır.

PCIe Bileşenleri

  CPU
   │
  ┌┴─────────────────────────────────────────────────┐
  │         Root Complex (RC)                        │
  │  ┌─────────────┐  ┌─────────────┐               │
  │  │ Root Port 0  │  │ Root Port 1  │  ...         │
  └──┼─────────────┼──┼─────────────┼───────────────┘
     │             │  │             │
     │             │  ▼             ▼
     ▼         ┌───┴──────┐    [Endpoint: GPU]
  [Endpoint:   │  Switch   │    Bus 1, Dev 0, Fn 0
   NVMe SSD]   │ Upstream  │
   Bus 1        │  Port     │
   Dev 0        └┬──────┬──┘
   Fn 0          │      │
               ┌─┴──┐  ┌┴───┐
               │DP0 │  │DP1 │  (Downstream Ports)
               └─┬──┘  └─┬──┘
                 │        │
           [NIC, Bus 2] [FPGA, Bus 3]
    

BDF Adres Uzayı

Bus: 8-bit, 0–255 (toplam 256 bus). Device: 5-bit, 0–31 (bus başına 32 cihaz). Function: 3-bit, 0–7 (cihaz başına 8 işlev — multi-function device). Tam adres 16-bit: [Bus 8] [Device 5] [Function 3]. PCIe config space 4 KB'dır; her BDF için ayrı config space.

BileşenTürüAçıklama
Root Complex (RC)CPU tarafı köprüCPU'yu PCIe ağacına bağlar; genellikle SoC/Chipset içinde
Root PortRC'nin çıkış portlarıHer root port bağımsız PCIe link; trafik burst'lerini yönetir
Switch (Upstream Port)YönlendiriciBir upstream + N downstream port; fan-out sağlar
Endpoint (EP)Hedef cihazNIC, GPU, NVMe, FPGA vb.; Type 0 config header kullanır
BridgePCI-PCIe köprüsüEski PCI kartları PCIe ortamına bağlar; Type 1 header

Bu bölümde

  • Root Complex: CPU-PCIe köprüsü; her root port bağımsız link ve bandwidth
  • Switch: fan-out sağlar; upstream–downstream port yönlendirme
  • BDF: 16-bit adres; lspci çıktısında "XX:YY.Z" formatında görünür
  • Endpoint: Type 0 config header; BAR, interrupt, DMA mask buradan yapılandırılır

05 Config space — BAR, Capability list, AER

Her PCIe cihazı 4 KB config space barındırır. OS bu alanı okuyarak kaynakları keşfeder ve yapılandırır. BAR'lar MMIO/IO bölgelerini, Capability listesi ise gelişmiş özellikleri tanımlar.

Type 0 Config Header (Endpoint)

Config Space — Type 0 Header layout (ilk 64 bayt)
Offset  Boyut  Alan
0x00    2      Vendor ID
0x02    2      Device ID
0x04    2      Command register
0x06    2      Status register
0x08    1      Revision ID
0x09    3      Class Code (Base, Sub, Interface)
0x0C    1      Cache Line Size
0x0D    1      Latency Timer
0x0E    1      Header Type (0x00 = Type 0, 0x01 = Type 1)
0x0F    1      BIST
0x10    4      BAR0  (Base Address Register 0)
0x14    4      BAR1
0x18    4      BAR2
0x1C    4      BAR3
0x20    4      BAR4
0x24    4      BAR5
0x28    4      CardBus CIS Pointer
0x2C    2      Subsystem Vendor ID
0x2E    2      Subsystem ID
0x30    4      Expansion ROM Base Address
0x34    1      Capabilities Pointer  ← extended cap listesinin başlangıcı
0x3C    1      Interrupt Line
0x3D    1      Interrupt Pin (0x01=INTA ... 0x04=INTD)
0x3E    1      Min Grant
0x3F    1      Max Latency

BAR — Base Address Register

BAR, cihazın MMIO veya IO alanını tanımlar. OS, BAR'a önce tüm bitleri 1 yazar, sonra okur — boyutu bu şekilde öğrenir. Ardından geçerli bir fiziksel adres atar.

bash — BAR okuma (setpci)
# Belirli bir cihazın BAR0 değerini oku (örnek: 01:00.0)
setpci -s 01:00.0 BASE_ADDRESS_0

# lspci ile BAR detaylarını gör
lspci -v -s 01:00.0
# Region 0: Memory at f7000000 (64-bit, prefetchable) [size=16M]
# Region 2: I/O ports at e000 [size=256]

# BAR türleri: bit[0]=0 → MMIO, bit[0]=1 → IO
# MMIO bit[2:1]: 00=32-bit, 10=64-bit
# MMIO bit[3]: 1=prefetchable

Capability List

Power Management (Cap 0x01)D0/D1/D2/D3hot/D3cold güç durumları; PME wake
MSI (Cap 0x05)Message Signaled Interrupt; 1–32 vektör; address+data formatı
PCIe (Cap 0x10)PCIe-spesifik: DevCtl, LnkSta, DevSta; MPS, MRRS ayarları
MSI-X (Cap 0x11)MSI genişlemesi; 2048 vektöre kadar; BAR-mapped tablo
AER (Extended, 0x001)Advanced Error Reporting; correctable/uncorrectable hata kaydı
SR-IOV (Extended, 0x010)Single Root I/O Virtualization; Virtual Function oluşturma

Bu bölümde

  • Type 0 header: 64 bayt — Vendor/Device ID, Command/Status, 6 BAR, Cap pointer
  • BAR boyutu keşfi: önce 0xFFFFFFFF yaz, geri oku, maskeyle boyutu hesapla
  • Capability list: offset 0x34'ten başlayan bağlı liste; her cap ID + next pointer
  • AER: donanım hataları kernel log'a yazar; dmesg'de "PCIe Bus Error" olarak görünür

06 Link training — LTSSM state machine

PCIe link, her iki taraftaki LTSSM (Link Training and Status State Machine) tarafından müzakere edilir. Hız, lane sayısı ve equalization bu süreçte belirlenir.

LTSSM durumları

  ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────┐
  │  Detect   │───▶│  Polling │───▶│  Config  │───▶│  L0  │
  │(receiver  │    │(bit lock │    │(lane/    │    │(aktif│
  │ detection)│    │ symbol   │    │ speed    │    │ veri │
  └──────────┘    │ lock)    │    │ müzakere)│    │ ilet.)│
                  └──────────┘    └──────────┘    └──┬───┘
                                                      │
                       ┌──────────────────────────────┤
                       │                              │
                  ┌────▼────┐                   ┌─────▼────┐
                  │  L0s    │                   │    L1    │
                  │(Standby │                   │(düşük    │
                  │ kısa)   │                   │ güç)     │
                  └────┬────┘                   └─────┬────┘
                       │                              │
                  ┌────▼────────────────────────────▼─┐
                  │             Recovery               │
                  │  (hız yükselt, equ. yenile, L0'a  │
                  │   dön veya L1'e geç)               │
                  └────────────────────────────────────┘
    

Temel LTSSM durumları

DurumAçıklama
DetectKarşı tarafta alıcı var mı? Empedans ölçümü
PollingBit senkronizasyonu, ordered set hizalama, symbol lock
ConfigurationLane sayısı, link numarası, lane numarası müzakeresi
L0Normal aktif durumu; TLP ve DLLP iletimi burada yapılır
RecoveryHız değişikliği veya equalization için geçici; L0'a döner
L0sKısa bekleme modu; L0'a hızlı dönüş (ASPM L0s)
L1Derin bekleme; PLL kapatılabilir; daha uzun dönüş süresi
L2/L3Güç kaldırma; link sıfırlanır; büyük gecikmeyle dönüş

Link equalization (Gen3+)

Gen3 ve sonrasında, yüksek frekanslı sinyallerin board trace üzerindeki kaybını telafi etmek için equalization zorunlu hale geldi. TX tarafı pre/post-emphasis, RX tarafı CTLE (Continuous Time Linear Equalizer) ve DFE (Decision Feedback Equalizer) kullanır. Recovery durumunda, EQ fazlarından geçilerek optimal ayar bulunur.

Bu bölümde

  • LTSSM: her iki taraf bağımsız state machine; Detect→Polling→Config→L0 başlatma akışı
  • L0: aktif veri iletimi; L0s/L1: ASPM güç tasarrufu; L2/L3: güç kaldırma
  • Recovery: hız yükseltme veya link hatasından kurtulma; L0'a dönüş sağlar
  • Equalization (Gen3+): TX emphasis + RX CTLE/DFE; board tasarımında kritik

07 Linux'ta PCIe görünümü — lspci, /sys/bus/pci

Linux, PCIe cihazlarını sysfs üzerinden kullanıcı alanına sunar. lspci ve setpci araçları, config space okumayı ve PCIe ağacını görselleştirmeyi kolaylaştırır.

lspci temel kullanım

bash — lspci komutları
# Tüm PCIe cihazları listele
lspci
# 00:00.0 Host bridge: Intel Corporation ...
# 01:00.0 Non-Volatile memory controller: Samsung ...
# 02:00.0 Ethernet controller: Realtek ...

# Ağaç görünümü (topoloji)
lspci -tv

# Belirli cihaz detayları (verbose)
lspci -vvv -s 01:00.0

# Tüm cihazların ayrıntılı çıktısı
lspci -vvv 2>/dev/null | less

# Belirli class koduna göre filtrele (0x010802 = NVMe)
lspci -d ::0108

# Kernel sürücü bilgisi
lspci -k -s 01:00.0
# 01:00.0 Non-Volatile memory controller: ...
#         Kernel driver in use: nvme
#         Kernel modules: nvme

/sys/bus/pci dizin yapısı

bash — sysfs PCIe erişimi
# PCIe cihaz dizini
ls /sys/bus/pci/devices/
# 0000:00:00.0  0000:01:00.0  0000:02:00.0 ...

# Cihaz bilgilerini oku
cat /sys/bus/pci/devices/0000:01:00.0/vendor
# 0x144d  (Samsung)

cat /sys/bus/pci/devices/0000:01:00.0/device
# 0xa808

cat /sys/bus/pci/devices/0000:01:00.0/class
# 0x010802  (NVMe)

# Config space'i ham okuma (ilk 64 bayt)
xxd /sys/bus/pci/devices/0000:01:00.0/config | head -4

# Bağlı sürücü
readlink /sys/bus/pci/devices/0000:01:00.0/driver
# ../../../../bus/pci/drivers/nvme

# Bağlı cihazları sürücüden bul
ls /sys/bus/pci/drivers/nvme/

AER (Advanced Error Reporting) mesajları

bash — PCIe AER hata izleme
# dmesg'de PCIe hatalarını izle
dmesg | grep -i "pcie\|aer\|correctable\|uncorrectable"

# Örnek AER mesajları:
# pcieport 0000:00:1d.0: AER: Corrected error received: 0000:01:00.0
# nvme 0000:01:00.0: AER: aer_status: 0x00002001, aer_mask: 0x00000000
# nvme 0000:01:00.0:   [ 0] RxErr

# Sürekli izleme (rasdaemon ile)
sudo rasdaemon -r
ras-mc-ctl --errors

Bu bölümde

  • lspci -tv: PCIe topolojisini ağaç olarak gösterir; hangi switch hangi EP'yi barındırıyor
  • lspci -vvv: BAR, capability listesi, link durumu, hız ve genişlik bilgisi
  • /sys/bus/pci/devices/XXXX:XX:XX.X/: vendor, device, class, config, driver
  • AER: correctable (RxErr, BadTLP) ve uncorrectable (MalformedTLP, ACS Violation) ayrımı

08 Pratik: PCIe ağacını analiz etme ve Raspberry Pi CM4 M.2 HAT

lspci ile gerçek sistemde PCIe ağacını analiz et. Raspberry Pi CM4'ün PCIe Gen2 x1 arayüzü ve M.2 HAT üzerinden NVMe SSD bağlantısını adım adım incele.

Masaüstü sistemde PCIe ağaç analizi

bash — kapsamlı PCIe analiz betiği
#!/bin/bash
# pcie_audit.sh — PCIe ağacı ve link durumu özeti

echo "=== PCIe Topolojisi ==="
lspci -tv

echo ""
echo "=== Tüm PCIe Cihazlar (Link hızı dahil) ==="
lspci -vvv 2>/dev/null | awk '
  /^[0-9a-f]/{dev=$0; next}
  /LnkSta:/{print dev; print "  "$0}
'

echo ""
echo "=== NVMe Cihazları ==="
lspci -d ::0108 -vv 2>/dev/null | grep -E "^[0-9]|LnkSta|LnkCap"

echo ""
echo "=== Ağ Kartları ==="
lspci -d ::0200 -vv 2>/dev/null | grep -E "^[0-9]|LnkSta"

echo ""
echo "=== Hata Sayaçları ==="
for dev in /sys/bus/pci/devices/*/; do
    aer="$dev/aer_dev_correctable"
    if [ -f "$aer" ]; then
        total=$(awk '{sum+=$2} END{print sum}' "$aer" 2>/dev/null)
        if [ "${total:-0}" -gt 0 ]; then
            echo "HATA: $dev"
            cat "$aer"
        fi
    fi
done

Raspberry Pi CM4 — PCIe Gen2 x1

Compute Module 4, BCM2711 SoC'unda tek bir PCIe Gen2 x1 lane barındırır. Bu lane, M.2 HAT üzerinden dışarı çıkartılarak NVMe SSD bağlanmasına olanak tanır.

bash — CM4 PCIe ve NVMe kurulum
# /boot/config.txt ayarları (CM4 için PCIe etkinleştirme)
# dtparam=pciex1                 — PCIe x1 arayüzü etkinleştir
# dtparam=pciex1_gen=3           — Gen3 denemesi (bazı SSD'ler çalışır)

# PCIe durumunu doğrula
lspci
# 0000:00:00.0 PCI bridge: Broadcom Inc. BCM2711 PCIe Bridge
# 0000:01:00.0 Non-Volatile memory controller: WD Blue SN570

# Link hızını kontrol et
sudo lspci -vvv -s 01:00.0 | grep -E "LnkSta|LnkCap"
# LnkCap: Port #0, Speed 8GT/s, Width x4, ASPM L1, Exit Latency L1 <4us
# LnkSta: Speed 5GT/s (downgraded), Width x1 (downgraded)
# → CM4, Gen2 x1 — SSD Gen3 x4 desteklese de downgraded olur

# NVMe disk bilgisi
sudo nvme id-ctrl /dev/nvme0 | head -20

# Hızlı bant genişliği testi
dd if=/dev/nvme0n1 of=/dev/null bs=1M count=1024 status=progress
# 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.14 s, 502 MB/s
# → PCIe Gen2 x1 teorik: ~400 MB/s okuma — CM4 için tipik sonuç

Bandwidth hesaplama

Hesaplama — PCIe bant genişliği formülü
# Gen2 x1 (CM4):
# Sembol hızı: 5 GT/s
# Encoding: 8b/10b → %80 verimlilik
# BW = 5 GT/s × 1 lane × 0.8 = 4 Gbit/s = 500 MB/s (tek yön)

# Gen3 x4 (tipik NVMe slot):
# Sembol hızı: 8 GT/s
# Encoding: 128b/130b → ~%98.5 verimlilik
# BW = 8 GT/s × 4 lane × 0.985 = 31.5 Gbit/s ≈ 3.9 GB/s (tek yön)

# Protocol overhead (~15-20%) hesaba katılınca:
# Gen2 x1: ~400 MB/s gerçekçi
# Gen3 x4: ~3.2 GB/s gerçekçi

Bu bölümde

  • lspci -tv: ağaç görünümü; bridge → downstream portlar → endpoint zinciri
  • LnkSta "downgraded": SSD Gen3 x4 olsa da CM4 PCIe x1 Gen2'ye indirgenir
  • CM4 gerçekçi okuma: ~400-500 MB/s; Gen2 x1 teorik tavan 500 MB/s
  • dtparam=pciex1_gen=3 ile bazı SSD'lerde Gen3 denenebilir — sinyal kalitesine bağlı