add new function to determin if a device supports MMIO

This commit is contained in:
Stefan Lankes 2014-12-13 17:53:42 +01:00
parent 3725b1f6d0
commit ad291c5294
2 changed files with 16 additions and 3 deletions

View file

@ -42,12 +42,17 @@ extern "C" {
#endif #endif
typedef struct { typedef struct {
uint32_t slot, bus;
uint32_t base[6]; uint32_t base[6];
uint32_t size[6]; uint32_t size[6];
uint32_t irq; uint8_t type[6];
uint8_t irq;
} pci_info_t; } pci_info_t;
/** @brief Initialize the PCI environment /** @brief Initialize the PCI environment
*
* return
* - 0 on success
*/ */
int pci_init(void); int pci_init(void);
@ -59,7 +64,7 @@ int pci_init(void);
* *
* @return * @return
* - 0 on success * - 0 on success
* - -EINVAL (-22) on failure * - -EINVAL on failure
*/ */
int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info); int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info);

View file

@ -98,7 +98,7 @@ static uint32_t pci_conf_read(uint32_t bus, uint32_t slot, uint32_t off)
return data; return data;
} }
static inline uint32_t pci_what_irq(uint32_t bus, uint32_t slot) static inline uint8_t pci_what_irq(uint32_t bus, uint32_t slot)
{ {
return pci_conf_read(bus, slot, PCI_CFIT) & 0xFF; return pci_conf_read(bus, slot, PCI_CFIT) & 0xFF;
} }
@ -108,6 +108,11 @@ static inline uint32_t pci_what_iobase(uint32_t bus, uint32_t slot, uint32_t nr)
return pci_conf_read(bus, slot, PCI_CBIO + nr*4) & 0xFFFFFFFC; return pci_conf_read(bus, slot, PCI_CBIO + nr*4) & 0xFFFFFFFC;
} }
static inline uint32_t pci_what_type(uint32_t bus, uint32_t slot, uint32_t nr)
{
return pci_conf_read(bus, slot, PCI_CBIO + nr*4) & 0x1;
}
static inline uint32_t pci_what_size(uint32_t bus, uint32_t slot, uint32_t nr) static inline uint32_t pci_what_size(uint32_t bus, uint32_t slot, uint32_t nr)
{ {
uint32_t tmp, ret; uint32_t tmp, ret;
@ -151,8 +156,11 @@ int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info
if (adapters[bus][slot] != -1) { if (adapters[bus][slot] != -1) {
if (((adapters[bus][slot] & 0xffff) == vendor_id) && if (((adapters[bus][slot] & 0xffff) == vendor_id) &&
(((adapters[bus][slot] & 0xffff0000) >> 16) == device_id)) { (((adapters[bus][slot] & 0xffff0000) >> 16) == device_id)) {
info->slot = slot;
info->bus = bus;
for(i=0; i<6; i++) { for(i=0; i<6; i++) {
info->base[i] = pci_what_iobase(bus, slot, i); info->base[i] = pci_what_iobase(bus, slot, i);
info->type[i] = pci_what_type(bus, slot, i);
info->size[i] = (info->base[i]) ? pci_what_size(bus, slot, i) : 0; info->size[i] = (info->base[i]) ? pci_what_size(bus, slot, i) : 0;
} }
info->irq = pci_what_irq(bus, slot); info->irq = pci_what_irq(bus, slot);