sysbus: always allow explicit_ofw_unit_address() to override address generation
Some SysBusDevices either use sysbus_init_mmio() without sysbus_mmio_map() or the first MMIO memory region doesn't represent the bus address, causing a firmware device path with an invalid address to be generated. SysBusDeviceClass does provide a virtual explicit_ofw_unit_address() method that can be used to override this process, but it was originally intended only as as a fallback option meaning that any existing MMIO memory regions still take priority whilst determining the firmware device address. There is currently only one user of explicit_ofw_unit_address() and that is the PCI expander bridge (PXB) device which has no MMIO/PIO resources defined. This enables us to allow explicit_ofw_unit_address() to take priority without affecting backwards compatibility, allowing the address to be customised as required. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20180805112850.26063-2-mark.cave-ayland@ilande.co.uk> Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
		
							parent
							
								
									3aeaac8fa2
								
							
						
					
					
						commit
						be64d7776b
					
				| @ -293,16 +293,8 @@ static char *sysbus_get_fw_dev_path(DeviceState *dev) | ||||
| { | ||||
|     SysBusDevice *s = SYS_BUS_DEVICE(dev); | ||||
|     SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(s); | ||||
|     /* for the explicit unit address fallback case: */ | ||||
|     char *addr, *fw_dev_path; | ||||
| 
 | ||||
|     if (s->num_mmio) { | ||||
|         return g_strdup_printf("%s@" TARGET_FMT_plx, qdev_fw_name(dev), | ||||
|                                s->mmio[0].addr); | ||||
|     } | ||||
|     if (s->num_pio) { | ||||
|         return g_strdup_printf("%s@i%04x", qdev_fw_name(dev), s->pio[0]); | ||||
|     } | ||||
|     if (sbc->explicit_ofw_unit_address) { | ||||
|         addr = sbc->explicit_ofw_unit_address(s); | ||||
|         if (addr) { | ||||
| @ -311,6 +303,13 @@ static char *sysbus_get_fw_dev_path(DeviceState *dev) | ||||
|             return fw_dev_path; | ||||
|         } | ||||
|     } | ||||
|     if (s->num_mmio) { | ||||
|         return g_strdup_printf("%s@" TARGET_FMT_plx, qdev_fw_name(dev), | ||||
|                                s->mmio[0].addr); | ||||
|     } | ||||
|     if (s->num_pio) { | ||||
|         return g_strdup_printf("%s@i%04x", qdev_fw_name(dev), s->pio[0]); | ||||
|     } | ||||
|     return g_strdup(qdev_fw_name(dev)); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Mark Cave-Ayland
						Mark Cave-Ayland