Lines Matching +full:configuration +full:- +full:space

1 // SPDX-License-Identifier: GPL-2.0
3 * PCI Backend - Functions for creating a virtual configuration space for
7 * restrict changes to certain PCI Configuration registers:
47 const struct config_field *field = entry->field; in DEFINE_PCI_CONFIG()
51 switch (field->size) { in DEFINE_PCI_CONFIG()
53 if (field->u.b.read) in DEFINE_PCI_CONFIG()
54 ret = field->u.b.read(dev, offset, (u8 *) value, in DEFINE_PCI_CONFIG()
55 entry->data); in DEFINE_PCI_CONFIG()
58 if (field->u.w.read) in DEFINE_PCI_CONFIG()
59 ret = field->u.w.read(dev, offset, (u16 *) value, in DEFINE_PCI_CONFIG()
60 entry->data); in DEFINE_PCI_CONFIG()
63 if (field->u.dw.read) in DEFINE_PCI_CONFIG()
64 ret = field->u.dw.read(dev, offset, value, entry->data); in DEFINE_PCI_CONFIG()
75 const struct config_field *field = entry->field; in conf_space_write()
77 switch (field->size) { in conf_space_write()
79 if (field->u.b.write) in conf_space_write()
80 ret = field->u.b.write(dev, offset, (u8) value, in conf_space_write()
81 entry->data); in conf_space_write()
84 if (field->u.w.write) in conf_space_write()
85 ret = field->u.w.write(dev, offset, (u16) value, in conf_space_write()
86 entry->data); in conf_space_write()
89 if (field->u.dw.write) in conf_space_write()
90 ret = field->u.dw.write(dev, offset, value, in conf_space_write()
91 entry->data); in conf_space_write()
109 /* Validate request (no un-aligned requests) */ in valid_request()
122 new_val_mask >>= (offset * -8); in merge_value()
123 new_val >>= (offset * -8); in merge_value()
159 dev_dbg(&dev->dev, "read %d bytes at 0x%x\n", size, offset); in xen_pcibk_config_read()
179 list_for_each_entry(cfg_entry, &dev_data->config_fields, list) { in xen_pcibk_config_read()
180 field = cfg_entry->field; in xen_pcibk_config_read()
183 field_end = OFFSET(cfg_entry) + field->size; in xen_pcibk_config_read()
192 get_mask(field->size), in xen_pcibk_config_read()
193 field_start - offset); in xen_pcibk_config_read()
198 dev_dbg(&dev->dev, "read %d bytes at 0x%x = %x\n", size, offset, value); in xen_pcibk_config_read()
213 dev_dbg(&dev->dev, "write request %d bytes at 0x%x = %x\n", in xen_pcibk_config_write()
219 list_for_each_entry(cfg_entry, &dev_data->config_fields, list) { in xen_pcibk_config_write()
220 field = cfg_entry->field; in xen_pcibk_config_write()
223 field_end = OFFSET(cfg_entry) + field->size; in xen_pcibk_config_write()
232 offset - field_start); in xen_pcibk_config_write()
249 * read-only. The permissive flag changes this behavior so in xen_pcibk_config_write()
251 * This means that some fields may still be read-only because in xen_pcibk_config_write()
254 if (dev_data->permissive || xen_pcibk_permissive) { in xen_pcibk_config_write()
269 } else if (!dev_data->warned_on_write) { in xen_pcibk_config_write()
270 dev_data->warned_on_write = 1; in xen_pcibk_config_write()
271 dev_warn(&dev->dev, "Driver tried to write to a " in xen_pcibk_config_write()
272 "read-only configuration space field at offset" in xen_pcibk_config_write()
276 "2) report problems to the xen-devel " in xen_pcibk_config_write()
292 * Do not trust dev->msi(x)_enabled here, as enabling could be done in xen_pcibk_get_interrupt_type()
295 if (dev->msi_cap) { in xen_pcibk_get_interrupt_type()
297 dev->msi_cap + PCI_MSI_FLAGS, in xen_pcibk_get_interrupt_type()
304 if (dev->msix_cap) { in xen_pcibk_get_interrupt_type()
306 dev->msix_cap + PCI_MSIX_FLAGS, in xen_pcibk_get_interrupt_type()
315 * PCIe spec says device cannot use INTx if MSI/MSI-X is enabled, in xen_pcibk_get_interrupt_type()
335 dev_dbg(&dev->dev, "free-ing dynamically allocated virtual " in xen_pcibk_config_free_dyn_fields()
336 "configuration space fields\n"); in xen_pcibk_config_free_dyn_fields()
340 list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) { in xen_pcibk_config_free_dyn_fields()
341 field = cfg_entry->field; in xen_pcibk_config_free_dyn_fields()
343 if (field->clean) { in xen_pcibk_config_free_dyn_fields()
344 field->clean((struct config_field *)field); in xen_pcibk_config_free_dyn_fields()
346 kfree(cfg_entry->data); in xen_pcibk_config_free_dyn_fields()
348 list_del(&cfg_entry->list); in xen_pcibk_config_free_dyn_fields()
361 dev_dbg(&dev->dev, "resetting virtual configuration space\n"); in xen_pcibk_config_reset_dev()
365 list_for_each_entry(cfg_entry, &dev_data->config_fields, list) { in xen_pcibk_config_reset_dev()
366 field = cfg_entry->field; in xen_pcibk_config_reset_dev()
368 if (field->reset) in xen_pcibk_config_reset_dev()
369 field->reset(dev, OFFSET(cfg_entry), cfg_entry->data); in xen_pcibk_config_reset_dev()
379 dev_dbg(&dev->dev, "free-ing virtual configuration space fields\n"); in xen_pcibk_config_free_dev()
383 list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) { in xen_pcibk_config_free_dev()
384 list_del(&cfg_entry->list); in xen_pcibk_config_free_dev()
386 field = cfg_entry->field; in xen_pcibk_config_free_dev()
388 if (field->release) in xen_pcibk_config_free_dev()
389 field->release(dev, OFFSET(cfg_entry), cfg_entry->data); in xen_pcibk_config_free_dev()
406 err = -ENOMEM; in xen_pcibk_config_add_field_offset()
410 cfg_entry->data = NULL; in xen_pcibk_config_add_field_offset()
411 cfg_entry->field = field; in xen_pcibk_config_add_field_offset()
412 cfg_entry->base_offset = base_offset; in xen_pcibk_config_add_field_offset()
419 if (field->init) { in xen_pcibk_config_add_field_offset()
420 tmp = field->init(dev, OFFSET(cfg_entry)); in xen_pcibk_config_add_field_offset()
427 cfg_entry->data = tmp; in xen_pcibk_config_add_field_offset()
430 dev_dbg(&dev->dev, "added config field at offset 0x%02x\n", in xen_pcibk_config_add_field_offset()
432 list_add_tail(&cfg_entry->list, &dev_data->config_fields); in xen_pcibk_config_add_field_offset()
441 /* This sets up the device's virtual configuration space to keep track of
450 dev_dbg(&dev->dev, "initializing virtual configuration space\n"); in xen_pcibk_config_init_dev()
452 INIT_LIST_HEAD(&dev_data->config_fields); in xen_pcibk_config_init_dev()