| /* |
| * This file is part of the coreboot project. |
| * |
| * Copyright (C) 2016 Google Inc |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; version 2 of the License. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #include <stdio.h> |
| #include <pci/pci.h> |
| #include "pci-userspace.h" |
| |
| #define DEBUG_PCI 1 |
| |
| static struct pci_access *pacc; |
| |
| int pci_initialize(void) |
| { |
| struct pci_dev *dev; |
| |
| pacc = pci_alloc(); |
| |
| pci_init(pacc); |
| pci_scan_bus(pacc); |
| for (dev = pacc->devices; dev; dev = dev->next) { |
| pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES); |
| } |
| return 0; |
| } |
| |
| int pci_exit(void) |
| { |
| pci_cleanup(pacc); |
| return 0; |
| } |
| |
| u8 pci_read_config8(struct device *dev, unsigned int where) |
| { |
| struct pci_dev *d; |
| if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func))) |
| return pci_read_byte(d, where); |
| #ifdef DEBUG_PCI |
| printf("PCI: device not found while read byte (%x:%x.%x)\n", |
| dev->busno, dev->slot, dev->func); |
| #endif |
| return 0; |
| } |
| |
| u16 pci_read_config16(struct device *dev, unsigned int where) |
| { |
| struct pci_dev *d; |
| if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func))) |
| return pci_read_word(d, where); |
| #ifdef DEBUG_PCI |
| printf("PCI: device not found while read word (%x:%x.%x)\n", |
| dev->busno, dev->slot, dev->func); |
| #endif |
| return 0; |
| } |
| |
| u32 pci_read_config32(struct device *dev, unsigned int where) |
| { |
| struct pci_dev *d; |
| if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func))) |
| return pci_read_long(d, where); |
| #ifdef DEBUG_PCI |
| printf("PCI: device not found while read dword (%x:%x.%x)\n", |
| dev->busno, dev->slot, dev->func); |
| #endif |
| return 0; |
| } |
| |
| void pci_write_config8(struct device *dev, unsigned int where, u8 val) |
| { |
| struct pci_dev *d; |
| if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func))) |
| pci_write_byte(d, where, val); |
| #ifdef DEBUG_PCI |
| else |
| printf("PCI: device not found while write byte (%x:%x.%x)\n", |
| dev->busno, dev->slot, dev->func); |
| #endif |
| } |
| |
| void pci_write_config16(struct device *dev, unsigned int where, u16 val) |
| { |
| struct pci_dev *d; |
| if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func))) |
| pci_write_word(d, where, val); |
| #ifdef DEBUG_PCI |
| else |
| printf("PCI: device not found while write word (%x:%x.%x)\n", |
| dev->busno, dev->slot, dev->func); |
| #endif |
| } |
| |
| void pci_write_config32(struct device *dev, unsigned int where, u32 val) |
| { |
| struct pci_dev *d; |
| if ((d = pci_get_dev(pacc, 0, dev->busno, dev->slot, dev->func))) |
| pci_write_long(d, where, val); |
| #ifdef DEBUG_PCI |
| else |
| printf("PCI: device not found while write dword (%x:%x.%x)\n", |
| dev->busno, dev->slot, dev->func); |
| #endif |
| } |