Lines Matching refs:dev

25 static void unregister_vfs(PCIDevice *dev);
27 void pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset, in pcie_sriov_pf_init() argument
32 uint8_t *cfg = dev->config + offset; in pcie_sriov_pf_init()
35 pcie_add_capability(dev, PCI_EXT_CAP_ID_SRIOV, 1, in pcie_sriov_pf_init()
37 dev->exp.sriov_cap = offset; in pcie_sriov_pf_init()
38 dev->exp.sriov_pf.num_vfs = 0; in pcie_sriov_pf_init()
39 dev->exp.sriov_pf.vfname = g_strdup(vfname); in pcie_sriov_pf_init()
40 dev->exp.sriov_pf.vf = NULL; in pcie_sriov_pf_init()
65 wmask = dev->wmask + offset; in pcie_sriov_pf_init()
71 qdev_prop_set_bit(&dev->qdev, "multifunction", true); in pcie_sriov_pf_init()
74 void pcie_sriov_pf_exit(PCIDevice *dev) in pcie_sriov_pf_exit() argument
76 unregister_vfs(dev); in pcie_sriov_pf_exit()
77 g_free((char *)dev->exp.sriov_pf.vfname); in pcie_sriov_pf_exit()
78 dev->exp.sriov_pf.vfname = NULL; in pcie_sriov_pf_exit()
81 void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num, in pcie_sriov_pf_init_vf_bar() argument
86 uint16_t sriov_cap = dev->exp.sriov_cap; in pcie_sriov_pf_init_vf_bar()
96 pci_set_long(dev->config + addr, type); in pcie_sriov_pf_init_vf_bar()
99 pci_set_quad(dev->wmask + addr, wmask); in pcie_sriov_pf_init_vf_bar()
100 pci_set_quad(dev->cmask + addr, ~0ULL); in pcie_sriov_pf_init_vf_bar()
102 pci_set_long(dev->wmask + addr, wmask & 0xffffffff); in pcie_sriov_pf_init_vf_bar()
103 pci_set_long(dev->cmask + addr, 0xffffffff); in pcie_sriov_pf_init_vf_bar()
105 dev->exp.sriov_pf.vf_bar_type[region_num] = type; in pcie_sriov_pf_init_vf_bar()
108 void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num, in pcie_sriov_vf_register_bar() argument
112 PCIBus *bus = pci_get_bus(dev); in pcie_sriov_vf_register_bar()
116 assert(pci_is_vf(dev)); /* PFs must use pci_register_bar */ in pcie_sriov_vf_register_bar()
119 type = dev->exp.sriov_vf.pf->exp.sriov_pf.vf_bar_type[region_num]; in pcie_sriov_vf_register_bar()
128 r = &dev->io_regions[region_num]; in pcie_sriov_vf_register_bar()
137 r->addr = pci_bar_address(dev, region_num, r->type, r->size); in pcie_sriov_vf_register_bar()
147 PCIDevice *dev = pci_new(devfn, name); in register_vf() local
148 dev->exp.sriov_vf.pf = pf; in register_vf()
149 dev->exp.sriov_vf.vf_number = vf_num; in register_vf()
153 qdev_realize(&dev->qdev, &bus->qbus, &local_err); in register_vf()
160 pci_config_set_vendor_id(dev->config, 0xffff); in register_vf()
161 pci_config_set_device_id(dev->config, 0xffff); in register_vf()
163 return dev; in register_vf()
166 static void register_vfs(PCIDevice *dev) in register_vfs() argument
170 uint16_t sriov_cap = dev->exp.sriov_cap; in register_vfs()
172 pci_get_word(dev->config + sriov_cap + PCI_SRIOV_VF_OFFSET); in register_vfs()
174 pci_get_word(dev->config + sriov_cap + PCI_SRIOV_VF_STRIDE); in register_vfs()
175 int32_t devfn = dev->devfn + vf_offset; in register_vfs()
178 num_vfs = pci_get_word(dev->config + sriov_cap + PCI_SRIOV_NUM_VF); in register_vfs()
179 if (num_vfs > pci_get_word(dev->config + sriov_cap + PCI_SRIOV_TOTAL_VF)) { in register_vfs()
183 dev->exp.sriov_pf.vf = g_new(PCIDevice *, num_vfs); in register_vfs()
185 trace_sriov_register_vfs(dev->name, PCI_SLOT(dev->devfn), in register_vfs()
186 PCI_FUNC(dev->devfn), num_vfs); in register_vfs()
188 dev->exp.sriov_pf.vf[i] = register_vf(dev, devfn, in register_vfs()
189 dev->exp.sriov_pf.vfname, i); in register_vfs()
190 if (!dev->exp.sriov_pf.vf[i]) { in register_vfs()
196 dev->exp.sriov_pf.num_vfs = num_vfs; in register_vfs()
199 static void unregister_vfs(PCIDevice *dev) in unregister_vfs() argument
201 uint16_t num_vfs = dev->exp.sriov_pf.num_vfs; in unregister_vfs()
204 trace_sriov_unregister_vfs(dev->name, PCI_SLOT(dev->devfn), in unregister_vfs()
205 PCI_FUNC(dev->devfn), num_vfs); in unregister_vfs()
208 PCIDevice *vf = dev->exp.sriov_pf.vf[i]; in unregister_vfs()
215 g_free(dev->exp.sriov_pf.vf); in unregister_vfs()
216 dev->exp.sriov_pf.vf = NULL; in unregister_vfs()
217 dev->exp.sriov_pf.num_vfs = 0; in unregister_vfs()
220 void pcie_sriov_config_write(PCIDevice *dev, uint32_t address, in pcie_sriov_config_write() argument
224 uint16_t sriov_cap = dev->exp.sriov_cap; in pcie_sriov_config_write()
234 trace_sriov_config_write(dev->name, PCI_SLOT(dev->devfn), in pcie_sriov_config_write()
235 PCI_FUNC(dev->devfn), off, val, len); in pcie_sriov_config_write()
238 if (dev->exp.sriov_pf.num_vfs) { in pcie_sriov_config_write()
240 unregister_vfs(dev); in pcie_sriov_config_write()
244 register_vfs(dev); in pcie_sriov_config_write()
252 void pcie_sriov_pf_reset(PCIDevice *dev) in pcie_sriov_pf_reset() argument
254 uint16_t sriov_cap = dev->exp.sriov_cap; in pcie_sriov_pf_reset()
259 pci_set_word(dev->config + sriov_cap + PCI_SRIOV_CTRL, 0); in pcie_sriov_pf_reset()
260 unregister_vfs(dev); in pcie_sriov_pf_reset()
262 pci_set_word(dev->config + sriov_cap + PCI_SRIOV_NUM_VF, 0); in pcie_sriov_pf_reset()
268 pci_set_word(dev->config + sriov_cap + PCI_SRIOV_SYS_PGSIZE, 0x1); in pcie_sriov_pf_reset()
271 pci_set_quad(dev->config + sriov_cap + PCI_SRIOV_BAR + i * 4, in pcie_sriov_pf_reset()
272 dev->exp.sriov_pf.vf_bar_type[i]); in pcie_sriov_pf_reset()
277 void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize) in pcie_sriov_pf_add_sup_pgsize() argument
279 uint8_t *cfg = dev->config + dev->exp.sriov_cap; in pcie_sriov_pf_add_sup_pgsize()
280 uint8_t *wmask = dev->wmask + dev->exp.sriov_cap; in pcie_sriov_pf_add_sup_pgsize()
295 uint16_t pcie_sriov_vf_number(PCIDevice *dev) in pcie_sriov_vf_number() argument
297 assert(pci_is_vf(dev)); in pcie_sriov_vf_number()
298 return dev->exp.sriov_vf.vf_number; in pcie_sriov_vf_number()
301 PCIDevice *pcie_sriov_get_pf(PCIDevice *dev) in pcie_sriov_get_pf() argument
303 return dev->exp.sriov_vf.pf; in pcie_sriov_get_pf()
306 PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n) in pcie_sriov_get_vf_at_index() argument
308 assert(!pci_is_vf(dev)); in pcie_sriov_get_vf_at_index()
309 if (n < dev->exp.sriov_pf.num_vfs) { in pcie_sriov_get_vf_at_index()
310 return dev->exp.sriov_pf.vf[n]; in pcie_sriov_get_vf_at_index()
315 uint16_t pcie_sriov_num_vfs(PCIDevice *dev) in pcie_sriov_num_vfs() argument
317 return dev->exp.sriov_pf.num_vfs; in pcie_sriov_num_vfs()