PB173 - Ovladače jádra - Linux XI. DMA Jiri Slabý Fakulta informatiky Masarykova univerzita 29. 11. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 1 /13 Paměť jinak II. LDD3 kap. 15 (zastaralá) Minule « Mapování paměti jádra (mmap) Q Přímý přístup do paměti (DMA) Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 2/13 Sekce 1 Přímý přístup do paměti (DMA) Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 3/13 DMA Přímý přístup do paměti • Prozatím jsme ze/do zařízení četli/zapisovali přes CPU • Tj. standardními operacemi s (přemapovanou) pamětí • Velké přenosy = velká zátěž CPU • Cykly, čekání na pomalou sběrnici atd. • Místo toho naprogramujeme HW, aby přenášel data sám • Nutná podpora HW (sběrnice - arbitrace, zařízení - přenosy) Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 4/13 Princip DMA Princip odesílání a příjmu O Alokace (speciální) paměti O Vyplnění daty (paket, zvuk, data na disk, ...) O Předání ukazatele do zařízení O Odstartování přenosu v zařízení Q Přerušení či jiná signalizace konce přenosu od zařízení O Práce s příchozími daty (paket, data z disku, ...) Q Uvolnění (speciální) paměti Jiri Slabý (Fakulta informatiky MU) PB 173/04 29. 11. 2016 5/13 DMA v Linuxu Alokace API alokace • linux/dma-mapping.h, Documentation/DMA-* • dma_alloc_coherent, dma_free_coherent void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp) • dev: zařízení, které bude k paměti přistupovat (null pokud neznáme) • size: velikost, jakou požadujeme • dma.handie: DMA adresa (návratová hodnota) - pro zařízení • Návratová hodnota: virtuální adresa - pro nás Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 6/13 DMA v Linuxu Příklad int my_do_DMA(struct device *dev) { dma_addr_t dma; char * virt; virt = dma_alloc_coherent(dev, 100, &dma, GFP_KERNEL); if (! virt) return -ENOMEM; memset(virt, 0, 100); my_HW_set_addr(dev, dma); my_HW_start_transfer(dev); while (my_HW_working(dev)) /* polling */ msleep(100); pr_info("%s\n", virt); dma_free_coherent(dev, 100, virt, dma); return 0; } Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 7/13 Úkol Alokace DMA paměti O Otevřete si ovladač EDU z předminulá Q V probe alokujte 1 stránku DMA paměti O Použijte PCI zařízení jako první parametr alokace O Vypište si virtuální, fyzickou a DMA adresu Q V remove ji uvolněte Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 8/13 DMA pro PCI Navíc • Nastavení masky adres Ne všechna zařízení zvládnou adresovat celý fyzický prostor • pci_set_dma_mask(pdev, DMA_BIT_MASK(27)) • pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(27)) • Zapnutí „spravování sběrnice" • Tj. zařízení umí samo iniciovat přenosy apod. • pci_set_master(pdev) Příklad Z probe ... /* pci_enable etc. here */ ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(27)); ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(27)); pci_set_m aster (pdev); virt = dma_alloc_coherent(&pdev->dev, 100, &dma, GFP_KERNEL); Jiri Slabý (Fakulta informatiky MU) PB173/04 29. 11. 2016 9/13 EDU a DMA Zvládá 28bitové adresy DMA řadič napojený na PCI sběrnici a lokální paměť v EDU • Lokální paměť na adrese 0x40000 • Velikost 4096 B o Generuje přerušení 8 (0x100) na kartě • Po dokončení přenosu • (Jen je-li vyžádáno před přenosem) Úkol: doplňte předešlou alokaci o nastavení masek na správnou hodnotu a zapnutí spravování sběrnice Jiri Slabý (Fakulta informatiky, MU) PB173/04 29. 11. 2016 10/13 EDU DMA registry Specifikace baru O (pokračování z předminulá) Offset Len R/W Contents Meaning 0x0080 4B R/W src Source address 0x0088 4B R/W dst Destination address 0x0090 4B R/W count Transfer count 0x0098 4B R/W cmd Command register cmd registr • Zapisuje se po nastavení ostatních registrů • Zapisuje se jednou, a to kombinací bitů Bit 0: run/status (start transfer now/is running?) • Bit 1: direction (0: from RAM to EDU, 1: from EDU to RAM) • Bit 2: rqint (generate an interrupt after the transaction) Jiri Slabý (Fakulta informatiky MU) PB173/04 29. 11. 2016 11 /13 Úkol Práce s DMA na EDU O 10 B své alokované DMA paměti inicializujte textovým řetězcem Q Přeneste 10 B do lokální paměti EDU na adresu 0x40000 Nastavte všechny 4 registry o Zdrojová adresa je vaše DMA adresa Cílová adresa je 0x40000 • Bez přerušení (bez rqint) • Počkejte na nulovou hodnotu bitu run (na dokončení přenosu) O Přeneste 10 B zpět z EDU na DMA stránku + 10 • Vznikne za sebou 2x stejný řetězec O Vypište DMA stránku + 10 Jiri Slabý (Fakulta informatiky MU) PB173/04 29. 11. 2016 12/13 Úkol DMA s přerušením (část domácího) O Rozšiřte předchozí o přerušení • Přidejte ještě jeden přenos z EDU na DMA + 20 • Přenos bude s rqint O Obslužte přerušení • ACK přerušení • Iniciujte tasklet O V taskletu vypište obsah DMA paměti + 20 O DMA stránku vystavte přes mmap POZOR • Na prezenci a správnou posloupnost zabíjení taskletu, zákazu přerušení, dealokace atd. • Na použití správné funkce pro převod na struct page/pf n pro mmap Jiri Slabý (Fakulta informatiky MU) PB173/04 29. 11. 2016 13/13