Lines Matching +full:read +full:- +full:out

1 // SPDX-License-Identifier: GPL-2.0
3 * PCI Backend - Functions for creating a virtual configuration space for
34 DEFINE_PCI_CONFIG(read, byte, u8 *) in DEFINE_PCI_CONFIG() argument
35 DEFINE_PCI_CONFIG(read, word, u16 *) in DEFINE_PCI_CONFIG()
36 DEFINE_PCI_CONFIG(read, dword, u32 *) in DEFINE_PCI_CONFIG()
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()
155 /* if read fails for any reason, return 0 in xen_pcibk_config_read()
159 dev_dbg(&dev->dev, "read %d bytes at 0x%x\n", size, offset); in xen_pcibk_config_read()
163 goto out; 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()
189 goto out; in xen_pcibk_config_read()
192 get_mask(field->size), in xen_pcibk_config_read()
193 field_start - offset); in xen_pcibk_config_read()
197 out: 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()
298 * Do not trust dev->msi(x)_enabled here, as enabling could be done in xen_pcibk_get_interrupt_type()
301 if (dev->msi_cap) { in xen_pcibk_get_interrupt_type()
303 dev->msi_cap + PCI_MSI_FLAGS, in xen_pcibk_get_interrupt_type()
310 if (dev->msix_cap) { in xen_pcibk_get_interrupt_type()
312 dev->msix_cap + PCI_MSIX_FLAGS, in xen_pcibk_get_interrupt_type()
328 dev_dbg(&dev->dev, "free-ing dynamically allocated virtual " in xen_pcibk_config_free_dyn_fields()
333 list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) { in xen_pcibk_config_free_dyn_fields()
334 field = cfg_entry->field; in xen_pcibk_config_free_dyn_fields()
336 if (field->clean) { in xen_pcibk_config_free_dyn_fields()
337 field->clean((struct config_field *)field); in xen_pcibk_config_free_dyn_fields()
339 kfree(cfg_entry->data); in xen_pcibk_config_free_dyn_fields()
341 list_del(&cfg_entry->list); in xen_pcibk_config_free_dyn_fields()
354 dev_dbg(&dev->dev, "resetting virtual configuration space\n"); in xen_pcibk_config_reset_dev()
358 list_for_each_entry(cfg_entry, &dev_data->config_fields, list) { in xen_pcibk_config_reset_dev()
359 field = cfg_entry->field; in xen_pcibk_config_reset_dev()
361 if (field->reset) in xen_pcibk_config_reset_dev()
362 field->reset(dev, OFFSET(cfg_entry), cfg_entry->data); in xen_pcibk_config_reset_dev()
372 dev_dbg(&dev->dev, "free-ing virtual configuration space fields\n"); in xen_pcibk_config_free_dev()
376 list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) { in xen_pcibk_config_free_dev()
377 list_del(&cfg_entry->list); in xen_pcibk_config_free_dev()
379 field = cfg_entry->field; in xen_pcibk_config_free_dev()
381 if (field->release) in xen_pcibk_config_free_dev()
382 field->release(dev, OFFSET(cfg_entry), cfg_entry->data); in xen_pcibk_config_free_dev()
399 err = -ENOMEM; in xen_pcibk_config_add_field_offset()
400 goto out; in xen_pcibk_config_add_field_offset()
403 cfg_entry->data = NULL; in xen_pcibk_config_add_field_offset()
404 cfg_entry->field = field; in xen_pcibk_config_add_field_offset()
405 cfg_entry->base_offset = base_offset; in xen_pcibk_config_add_field_offset()
410 goto out; in xen_pcibk_config_add_field_offset()
412 if (field->init) { in xen_pcibk_config_add_field_offset()
413 tmp = field->init(dev, OFFSET(cfg_entry)); in xen_pcibk_config_add_field_offset()
417 goto out; in xen_pcibk_config_add_field_offset()
420 cfg_entry->data = tmp; in xen_pcibk_config_add_field_offset()
423 dev_dbg(&dev->dev, "added config field at offset 0x%02x\n", in xen_pcibk_config_add_field_offset()
425 list_add_tail(&cfg_entry->list, &dev_data->config_fields); in xen_pcibk_config_add_field_offset()
427 out: in xen_pcibk_config_add_field_offset()
443 dev_dbg(&dev->dev, "initializing virtual configuration space\n"); in xen_pcibk_config_init_dev()
445 INIT_LIST_HEAD(&dev_data->config_fields); in xen_pcibk_config_init_dev()
449 goto out; in xen_pcibk_config_init_dev()
453 goto out; in xen_pcibk_config_init_dev()
457 out: in xen_pcibk_config_init_dev()