PB173 - Ovladače jádra - Linux x. a. Jiří Slabý ITI, Fakulta Informatiky 30. 11. 2010 J. Slabý (ITI) PB173/01 30. 11. 2010 1 /1 Paměť jinak II. LDD3 kap. 15 (zastaralá) a I. (minule): Mapování paměti jádra (mmap) • II. (dnes): Přímý přístup do paměti (DMA) J. Slabý (ITI) PB173/01 30.11.2010 2/1 DMA Přímý přístup do paměti a 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) Princip O Alokace (speciální) paměti O (TX: vyplnění daty) O Předání ukazatele zařízení O Start přenosu 0 Přerušení či jiná signalizace konce přenosu © (RX: přečtení dat) J. Slabý (ITI) PB173/01 30. 11. 2010 3/1 DMA v Linuxu API • linux/dma-mapping.h, Documentation/DMA-* • Alokace: dma_alloc_coherent, dma_f ree.coherent int my.do.DMA(struct device *dev) { dma.addr.t phys ; void * v i rt ; virt = dma-alloc-coherent (dev, 100, &phys , GFP.KERNEL) ; if (! virt ) return -ENCMEM; memset( virt , 0, 100) ; my.HW.set.addr(dev, phys); my.HW.start-transfer(dev) ; while (my_HW_working(dev)) schedule () ; printk (KERNJNFO "%s" , virt); return 0; J. Slabý (ITI) PB173/01 30. 11. 2010 4/1 DMA pro PCI Navíc • Nastavení masky adres • Ne všechna zařízení zvládnou adresovat celý fyzický rozsah • 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 * v i rt ; ret = pci.set.dma.mask(pdev , DMA.BIT.MASK(27)) ; if (ret) { /* bail out */ } pci-set.master (pdev) ; virt = dma.alloc.coherent(&pdev->dev, 100, &phys, GFP.KERNEL) ; } J. Slabý (ITI) PB173/01 30. 11. 2010 5/1 Combo a DMA • Zvládá 32-bitové adresy • DMA řadič napojený na LocalBus (1), PCI (2) a PowerPC (4) • Generuje přerušení 8 na kartě • cmd registr |A | NDstSrcR • Bit 0: run (transfer now) • Bits 1-3: source (BUS) • Bits 4-6: destination (BUS) • Bit 7: noint (do not generate interrupt after transaction) • Bit 31: ackint (acknowledge interrupt) 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 Tabulka: Specifikace baru 0 (pokračování z minula) J. Slabý (ITI) PB173/01 30. 11. 2010 6/1 Úkol Práce s DMA O Naalokovat stránku DMA prostoru O 10B nainicializovat textovým řetězcem 0 Přenést 10B na PowerPC sběrnici na adresu 0x40000 • Nastavit všechny 4 registry • Bez přerušení (nastavit noint) • Počkat na nulovou hodnotu bitu run (na dokončení přenosu) O Přenést 10B z PowerPC na DMA stránku + 10 • Vznikne za sebou 2 x stejný řetězec J. Slabý (ITI) PB173/01 30. 11. 2010 7/1 Úkol DMA s přerušením (domácí) O Rozšířit předchozí o přerušení • Přidat ještě jeden přenos z PowerPC na DMA + 20 • Přenos bude bez noint • Je třeba povolit 8. (0x100) přerušení na kartě Q Obsoužit přerušení • ACK přerušení a DMA a Iniciovat tasklet O V taskletu vypsat obsah DMA paměti + 20 O DMA stránku vystavit přes mmap Pozn.: pokud se zařízení zasekne (např. špatně nastaveným DMA), je nutné stroj vypnout a zapnout, reboot nepomůže J. Slabý (ITI) PB173/01 30. 11. 2010 8/1