PB173 - Ovladače jádra - Linux X. DMA Jiri Slabý Fakulta informatiky Masarykova univerzita 26. 11. 2013 Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 1 / 12 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) Sekce 1 Přímý přístup do paměti (DMA) Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 3/ 12 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/02 26.11.2013 4/ 12 Princip DMA Princip O Alokace (speciální) paměti O Pro TX. vyplnění daty (paket, zvuk, data na disk,...) O Předání ukazatele do zařízení O Odstartování přenosu v zařízení O Přerušení či jiná signalizace konce přenosu od zařízení O Pro RX. práce s příchozími daty (paket, data z disku,...) Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 5/ 12 DMA v Linuxu Alokace API alokace • linux/dma-mapping.h, Documentation/DMA-* • dma_alloc_coherent, dma_free_coherent void *dma_alloc_coherent(stmct 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_handle - DMA adresa (návratová hodnota) - pro zařízení • návratová hodnota - virtuální adresa - pro nás Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 6/ 12 DMA v Linuxu Příklad int my_do_DMA(struct device *dev) { dma_addr_t phys; char * virt; virt = dma_alloc_coherent(dev, 100, &phys, GFP_KERNEL); if (! virt ) return -ENOMEM; memset(virt, 0, 100); my_HW_set_addr(dev, phys); my_H W_start_transfer(dev); while (my_HW_working(dev)) /* polling */ msleep(100); pr_info("%s\n", virt); dma_free_coherent(dev, 100, virt, phys); return 0; Úkol: alokujte a uvolněte pomocí dma_* 1 stránku paměti (v ovladači EDU z předminulá) Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 7/ 12 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)) • Zapnutí „spravování sběrnice" • Tj. zařízení umí samo iniciovat přenosy apod. • pci_set_master(pdev) int my_probe(struct pci_dev *pdev, ...) { dma_addr_t phys; void * virt; ... /* enable etc. here */ ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(27)); pci_set_master(pdev); virt = dma_alloc_coherent(&pdev->dev, 100, &phys, GFP_KERNEL); Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 8/ 12 EDU a DMA • Zvládá 32bitové adresy • DMA řadič napojený na PCI sběrnici a lokální paměť v EDU • Lokální paměť na adrese 0x40000 9 Velikost 4096 B • Generuje přerušení 8 (Oxioo) 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 set_dma_mask a set_master) Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 9/ 12 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 0x0084 4B R/W dst Destination address 0x0088 4B R/W count Transfer count 0x008c 4B R/W cmd Command register • cmd registr • Zapisuje se po nastavení ostatních registrů • Zapisuje se jednou s kombinací bitů • Bit 0: run (transfer now) • 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/02 26.11.2013 10/ 12 Úkol Práce s DMA na EDU O Naalokovat stránku DMA prostoru © 10 B inicializovat textovým řetězcem O Přenést 10 B do lokální paměti EDU na adresu 0x40000 • Nastavit všechny 4 registry • Bez přerušení (bez rqint) • Počkat na nulovou hodnotu bitu run (na dokončení přenosu) O Přenést 10 B z EDU na DMA stránku + 10 • Vznikne za sebou 2 x stejný řetězec 0 Vypište DMA stránku + 10 Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 11 / 12 Úkol DMA s přerušením (část domácího) O Rozšířit předchozí o přerušení • Přidat ještě jeden přenos z EDU na DMA + 20 • Přenos bude s rqint 0 Obsloužit přerušení • ACK přerušení • Iniciovat tasklet O V taskletu vypsat obsah DMA paměti + 20 O DMA stránku vystavit přes mmap POZOR na prezenci a správnou posloupnost zabíjení taskletu, zákazu přerušení, dealokace atd. Jiri Slabý (Fakulta informatiky, MU) PB173/02 26.11.2013 12/ 12