18.11.08

Akses Memori PCI

(bagian akhir dari 7 artikel - ke artikel utama)

Untuk mengakses memori PCI milik sebuah devais, harus digunakan beberapa fungsi umum dan tidak disarankan untuk mengakses alamat memori secara langsung. Berbagai hardware mempunyai cara berbeda saat mengakses bus PCI. Jika digunakan fungsi umum, maka driver PCI yang dibuat akan dapat dijalankan di berbagai sistem linux (sehingga menjadi portabel)

Untuk membaca data dari bus PCI digunakan fungsi-fungsi berikut ini:


int pci_read_config_byte (struct pci_dev * dev , int where , u8 * val );
int pci_read_config_word(struct pci_dev *dev, int where, u16 *val);
int pci_read_config_dword(struct pci_dev *dev, int where, u32 *val);

sedangkan untuk menuliskan data digunakan fungsi-fungsi ini:
int pci_write_config_byte(struct pci_dev *dev, int where, u8 val);
int pci_write_config_word(struct pci_dev *dev, int where, u16 val);
int pci_write_config_dword(struct pci_dev *dev, int where, u32 val);

Fungsi-fungsi di atas memungkinkan penulisan data berukuran 8, 16 atau 32 bit ke lokasi tertentu yang ditempat devais PCI. Jika diinginkan mengakses lokasi memori suatu devais PCI yang belum diinisialisasi oleh inti Linux PCI, maka dapat digunakan fungsi-fungsi berikut ini (yang terdapat dalam kode inti pci_hotplug:


int pci_read_config_byte_nodev(struct pci_ops *ops, u8 bus, u8 device, u8 function, int where, u8 *val);
int pci_read_config_word_nodev(struct pci_ops *ops, u8 bus, u8 device, u8 function, int where, u16 *val);
int pci_read_config_dword_nodev(struct pci_ops *ops, u8 bus, u8 device, u8 function, int where, u32 *val);
int pci_write_config_byte_nodev(struct pci_ops *ops, u8 bus, u8 device, u8 function, int where, u8 val);
int pci_write_config_word_nodev(struct pci_ops *ops, u8 bus, u8 device, u8 function, int where, u16 val);
int pci_write_config_dword_nodev(struct pci_ops *ops, u8 bus, u8 device, u8 function, int where, u32 val);

Contoh cara membaca dan menulis memori PCI yang dilakukan melalui driver dapat dilihat pada driver USB OHCI driver pada berkas drivers/usb/host/usb-ohci.c:


pci_read_config_byte(dev, PCI_LATENCY_TIMER, &latency);
if (latency) {
pci_read_config_byte(dev, PCI_MAX_LAT, &limit);
if (limit && limit < latency) {
dbg("PCI latency reduced to max %d", limit);
pci_write_config_byte(dev, PCI_LATENCY_TIMER, limit);
ohci->pci_latency = limit;
} else {
/* it might already have been reduced */
ohci->pci_latency = latency;
}
}

Tidak ada komentar: