Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/pci/pciintel/pci.c

    re8d6ce2 r6dbc500  
    5757#include <ops/hw_res.h>
    5858#include <device/hw_res.h>
     59#include <ops/pio_window.h>
     60#include <device/pio_window.h>
    5961#include <ddi.h>
    6062#include <pci_dev_iface.h>
     
    141143}
    142144
     145static pio_window_t *pciintel_get_pio_window(ddf_fun_t *fnode)
     146{
     147        pci_fun_t *fun = pci_fun(fnode);
     148       
     149        if (fun == NULL)
     150                return NULL;
     151        return &fun->pio_window;
     152}
     153
     154
    143155static int pci_config_space_write_32(ddf_fun_t *fun, uint32_t address,
    144156    uint32_t data)
     
    198210        .get_resource_list = &pciintel_get_resources,
    199211        .enable_interrupt = &pciintel_enable_interrupt,
     212};
     213
     214static pio_window_ops_t pciintel_pio_window_ops = {
     215        .get_pio_window = &pciintel_get_pio_window
    200216};
    201217
     
    211227static ddf_dev_ops_t pci_fun_ops = {
    212228        .interfaces[HW_RES_DEV_IFACE] = &pciintel_hw_res_ops,
     229        .interfaces[PIO_WINDOW_DEV_IFACE] = &pciintel_pio_window_ops,
    213230        .interfaces[PCI_DEV_IFACE] = &pci_dev_ops
    214231};
     
    552569{
    553570        uint8_t irq = pci_conf_read_8(fun, PCI_BRIDGE_INT_LINE);
    554         if (irq != 0xff)
     571        uint8_t pin = pci_conf_read_8(fun, PCI_BRIDGE_INT_PIN);
     572
     573        if (pin != 0 && irq != 0xff)
    555574                pci_add_interrupt(fun, irq);
    556575}
     
    615634                        pci_read_bars(fun);
    616635                        pci_read_interrupt(fun);
     636
     637                        /* Propagate the PIO window to the function. */
     638                        fun->pio_window = bus->pio_win;
    617639                       
    618640                        ddf_fun_set_ops(fun->fnode, &pci_fun_ops);
     
    645667static int pci_dev_add(ddf_dev_t *dnode)
    646668{
     669        hw_resource_list_t hw_resources;
    647670        pci_bus_t *bus = NULL;
    648671        ddf_fun_t *ctl = NULL;
     
    670693                goto fail;
    671694        }
    672        
    673         hw_resource_list_t hw_resources;
     695
     696        rc = pio_window_get(sess, &bus->pio_win);
     697        if (rc != EOK) {
     698                ddf_msg(LVL_ERROR, "pci_dev_add failed to get PIO window "
     699                    "for the device.");
     700                goto fail;
     701        }
    674702       
    675703        rc = hw_res_get_resource_list(sess, &hw_resources);
     
    761789{
    762790        ddf_log_init(NAME);
    763         pci_fun_ops.interfaces[HW_RES_DEV_IFACE] = &pciintel_hw_res_ops;
    764         pci_fun_ops.interfaces[PCI_DEV_IFACE] = &pci_dev_ops;
    765791}
    766792
Note: See TracChangeset for help on using the changeset viewer.