parisc: Add qemu fw_cfg interface
Helge Deller
maintainerPATCH 1/1 parisc: Add qemu fw_cfg interface
When running on qemu, SeaBIOS-hppa stores the iomem address for the emulated fw_cfg port in PAGE0_>pad0[2/3]. Let the Linux driver auto-configure the fw_cfg interface with it, so that the fw_cfg info shows up in /sys/firmware/qemu_fw_cfg.
Signed-off-by Helge Deller <[email protected]>
arch/parisc/Kconfig +1 -0
@@ -376,6 +376,7 @@ config KEXEC_FILE endmenu +source "drivers/firmware/Kconfig" source "drivers/parisc/Kconfig"
arch/parisc/kernel/inventory.c +30 -0
@@ -19,6 +19,7 @@#include <linux/init.h> #include <linux/slab.h> #include <linux/mm.h> +#include <linux/platform_device.h> #include <asm/hardware.h> #include <asm/io.h> #include <asm/mmzone.h>
@@ -641,4 +642,33 @@ void __init do_device_inventory(void)if (pa_serialize_tlb_flushes)pr_info ("Merced bus found: Enable PxTLB serialization.\n" );#endif + +#if defined(CONFIG_FW_CFG_SYSFS ) +if (running_on_qemu) { +struct resource res[3 ] = {0 ,}; +unsigned int base; + + base = ((unsigned long long )PAGE0 ->pad0[2 ] <<32 ) + |PAGE0 ->pad0[3 ];/* SeaBIOS stored it here */ + + res[0 ].name ="fw_cfg" ; + res[0 ].start = base; + res[0 ].end = base +8 -1 ; + res[0 ].flags =IORESOURCE_MEM ; + + res[1 ].name ="ctrl" ; + res[1 ].start =0 ; + res[1 ].flags =IORESOURCE_REG ; + + res[2 ].name ="data" ; + res[2 ].start =4 ; + res[2 ].flags =IORESOURCE_REG ; + +if (base) { +pr_info ("Found qemu fw_cfg interface at %#08x\n" , base); +platform_device_register_simple ("fw_cfg" , +PLATFORM_DEVID_NONE , res,3 ); + } + } +#endif }
drivers/firmware/Kconfig +1 -1
@@ -187,7 +187,7 @@ config RASPBERRYPI_FIRMWARE config FW_CFG_SYSFS tristate "QEMU fw_cfg device support in sysfs" - depends on SYSFS && (ARM || ARM64 || PPC_PMAC || SPARC || X86) + depends on SYSFS && (ARM || ARM64 || PARISC || PPC_PMAC || SPARC || X86) depends on HAS_IOPORT_MAP default n help
drivers/firmware/qemu_fw_cfg.c +3 -0
@@ -215,6 +215,9 @@ static void fw_cfg_io_cleanup(void)# define FW_CFG_CTRL_OFF 0x08# define FW_CFG_DATA_OFF 0x00# define FW_CFG_DMA_OFF 0x10 +# elif defined(CONFIG_PARISC )/* parisc */ +# define FW_CFG_CTRL_OFF 0x00 +# define FW_CFG_DATA_OFF 0x04# elif (defined(CONFIG_PPC_PMAC ) || defined(CONFIG_SPARC32 ))/* ppc/mac,sun4m */ # define FW_CFG_CTRL_OFF 0x00# define FW_CFG_DATA_OFF 0x02