|
|
|
@ -74,15 +74,47 @@ struct pci_iommu_ops pci_sun4v_iommu_ops = { |
|
|
|
|
static int pci_sun4v_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, |
|
|
|
|
int where, int size, u32 *value) |
|
|
|
|
{ |
|
|
|
|
/* XXX Implement me! XXX */ |
|
|
|
|
return 0; |
|
|
|
|
struct pci_pbm_info *pbm = bus_dev->sysdata; |
|
|
|
|
unsigned long devhandle = pbm->devhandle; |
|
|
|
|
unsigned int bus = bus_dev->number; |
|
|
|
|
unsigned int device = PCI_SLOT(devfn); |
|
|
|
|
unsigned int func = PCI_FUNC(devfn); |
|
|
|
|
unsigned long ret; |
|
|
|
|
|
|
|
|
|
ret = pci_sun4v_config_get(devhandle, |
|
|
|
|
HV_PCI_DEVICE_BUILD(bus, device, func), |
|
|
|
|
where, size); |
|
|
|
|
switch (size) { |
|
|
|
|
case 1: |
|
|
|
|
*value = ret & 0xff; |
|
|
|
|
break; |
|
|
|
|
case 2: |
|
|
|
|
*value = ret & 0xffff; |
|
|
|
|
break; |
|
|
|
|
case 4: |
|
|
|
|
*value = ret & 0xffffffff; |
|
|
|
|
break; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return PCIBIOS_SUCCESSFUL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int pci_sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, |
|
|
|
|
int where, int size, u32 value) |
|
|
|
|
{ |
|
|
|
|
/* XXX Implement me! XXX */ |
|
|
|
|
return 0; |
|
|
|
|
struct pci_pbm_info *pbm = bus_dev->sysdata; |
|
|
|
|
unsigned long devhandle = pbm->devhandle; |
|
|
|
|
unsigned int bus = bus_dev->number; |
|
|
|
|
unsigned int device = PCI_SLOT(devfn); |
|
|
|
|
unsigned int func = PCI_FUNC(devfn); |
|
|
|
|
unsigned long ret; |
|
|
|
|
|
|
|
|
|
ret = pci_sun4v_config_put(devhandle, |
|
|
|
|
HV_PCI_DEVICE_BUILD(bus, device, func), |
|
|
|
|
where, size, value); |
|
|
|
|
|
|
|
|
|
return PCIBIOS_SUCCESSFUL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct pci_ops pci_sun4v_ops = { |
|
|
|
|