2016-05-19 5 views
0

Je voudrais allouer de la mémoire pour un transfert dma entre un périphérique PCI et la RAM. J'utilise la fonction suivante pour allouer de la mémoire:Mémoire DMA (2 premiers Go)

pci_alloc_consistent 

Je veux allouer de la mémoire sous 2GB. Sinon, le périphérique pci échoue. Mais cette fonction fournit n'importe quelle adresse de mon RAM (4 Go). Y a-t-il une solution?

BR

Répondre

2

Vous pouvez appeler pci_set_coherent_dma_mask sur le struct pci_dev *, ou appelez de préférence dma_set_coherent_mask sur pcidev->dev pour définir le masque. La définition du masque sur DMA_BIT_MASK(31) limite les mappages cohérents aux 2 premiers GiB. Par souci de cohérence, vous pouvez également restreindre les mappages non cohérents en appelant le pci_set_dma_mask ou le dma_set_mask.

Un bon endroit pour appeler les fonctions ci-dessus provient de la fonction "sonde" du pilote PCI.

+0

Je pense que vous semblez trop technique, et quelque chose comme "le changement devrait être fait dans la partie PCI du pilote en question" devrait être ajouté. – 0andriy

+0

@AndyShevchenko, j'ai ajouté un paragraphe sur l'endroit où appeler les fonctions. Désolé de paraître "trop ​​technique". Je l'ai ciblé sur un public un peu technique - si le public écrit du code pour effectuer des transferts DMA, cela compte comme "un peu technique" dans mon livre! –

+0

Je ne sais pas combien de temps vous êtes ici à SO (a-ha, moins d'un an), mais d'après mon expérience, je pourrais dire qu'ici beaucoup de gens ont programmé pour la première fois dans l'environnement du noyau Linux. Et parfois c'est un fardeau pour obtenir cette personne ne sait pas beaucoup après quelques commentaires de ping-pong ... On dirait que SO a un manque de moteur de bonne supposition pour rechercher des doublons (ou du moins je ne sais pas) depuis trop d'entre eux ont souvent posé des questions similaires encore et encore. – 0andriy