add new function to determin if a device supports MMIO
This commit is contained in:
parent
3725b1f6d0
commit
ad291c5294
2 changed files with 16 additions and 3 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue