[OpenBIOS] [PATCH] ppc: Implement NVRAM support for PReP
Artyom Tarasenko
atar4qemu at gmail.com
Fri Aug 30 11:29:10 CEST 2013
Hi Mark,
On Wed, Aug 28, 2013 at 9:47 PM, Mark Cave-Ayland
<mark.cave-ayland at ilande.co.uk> wrote:
> On 27/08/13 11:10, Artyom Tarasenko wrote:
>
>> Hi Mark,
>>
>> On Mon, Aug 26, 2013 at 11:05 PM, Mark Cave-Ayland
>> <mark.cave-ayland at ilande.co.uk> wrote:
>>>
>>> On 24/08/13 23:06, Andreas Färber wrote:
>>>
>>>> Signed-off-by: Andreas Färber<andreas.faerber at web.de>
>>>> ---
>>>> arch/ppc/qemu/qemu.c | 18 ++++++++++--
>>>> config/examples/ppc64_config.xml | 1 +
>>>> config/examples/ppc_config.xml | 1 +
>>>> drivers/build.xml | 1 +
>>>> drivers/m48t59.c | 60
>>>> ++++++++++++++++++++++++++++++++++++++++
>>>> include/drivers/drivers.h | 3 ++
>>>> 6 files changed, 81 insertions(+), 3 deletions(-)
>>>> create mode 100644 drivers/m48t59.c
>>>>
>>>> diff --git a/arch/ppc/qemu/qemu.c b/arch/ppc/qemu/qemu.c
>>>> index 381affb..1e3994c 100644
>>>> --- a/arch/ppc/qemu/qemu.c
>>>> +++ b/arch/ppc/qemu/qemu.c
>>>> @@ -80,9 +80,13 @@ printk( const char *fmt, ... )
>>>> int arch_nvram_size(void)
>>>> {
>>>> if (is_apple()) {
>>>> +#ifdef CONFIG_DRIVER_MACIO
>>>> return macio_get_nvram_size();
>>>> +#endif
>>>> } else {
>>>> - // not implemented
>>>> +#ifdef CONFIG_DRIVER_M48T59
>>>> + return m48t59_nvram_size();
>>>> +#endif
>>>> }
>>>> return 0;
>>>> }
>>>> @@ -90,17 +94,25 @@ int arch_nvram_size(void)
>>>> void arch_nvram_put(char *buf)
>>>> {
>>>> if (is_apple()) {
>>>> +#ifdef CONFIG_DRIVER_MACIO
>>>> macio_nvram_put(buf);
>>>> +#endif
>>>> } else {
>>>> - // not implemented
>>>> +#ifdef CONFIG_DRIVER_M48T59
>>>> + m48t59_nvram_put(buf);
>>>> +#endif
>>>> }
>>>> }
>>>>
>>>> void arch_nvram_get(char *buf)
>>>> {
>>>> if (is_apple()) {
>>>> +#ifdef CONFIG_DRIVER_MACIO
>>>> macio_nvram_get(buf);
>>>> +#endif
>>>> } else {
>>>> - // not implemented
>>>> +#ifdef CONFIG_DRIVER_M48T59
>>>> + m48t59_nvram_get(buf);
>>>> +#endif
>>>> }
>>>> }
>>>> diff --git a/config/examples/ppc64_config.xml
>>>> b/config/examples/ppc64_config.xml
>>>> index 5f79c21..04343b4 100644
>>>> --- a/config/examples/ppc64_config.xml
>>>> +++ b/config/examples/ppc64_config.xml
>>>> @@ -75,3 +75,4 @@
>>>> <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/>
>>>> <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/>
>>>> <option name="CONFIG_FW_CFG_ADDR" type="integer"
>>>> value="0xf0000510"/>
>>>> +<option name="CONFIG_DRIVER_M48T59" type="boolean" value="false"/>
>>>> diff --git a/config/examples/ppc_config.xml
>>>> b/config/examples/ppc_config.xml
>>>> index 5bb789f..2229f00 100644
>>>> --- a/config/examples/ppc_config.xml
>>>> +++ b/config/examples/ppc_config.xml
>>>> @@ -78,3 +78,4 @@
>>>> <option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/>
>>>> <option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/>
>>>> <option name="CONFIG_FW_CFG_ADDR" type="integer"
>>>> value="0xf0000510"/>
>>>> +<option name="CONFIG_DRIVER_M48T59" type="boolean" value="true"/>
>>>> diff --git a/drivers/build.xml b/drivers/build.xml
>>>> index edec6b5..bcb21ae 100644
>>>> --- a/drivers/build.xml
>>>> +++ b/drivers/build.xml
>>>> @@ -22,6 +22,7 @@
>>>> <object source="pc_serial.c" condition="DRIVER_PC_SERIAL"/>
>>>> <object source="escc.c" condition="DRIVER_ESCC"/>
>>>> <object source="fw_cfg.c" condition="DRIVER_FW_CFG"/>
>>>> +<object source="m48t59.c" condition="DRIVER_M48T59"/>
>>>> </library>
>>>>
>>>> <dictionary name="openbios" target="forth">
>>>> diff --git a/drivers/m48t59.c b/drivers/m48t59.c
>>>> new file mode 100644
>>>> index 0000000..cd9e9f6
>>>> --- /dev/null
>>>> +++ b/drivers/m48t59.c
>>>> @@ -0,0 +1,60 @@
>>>> +/*
>>>> + * OpenBIOS PReP m48t59 driver
>>>> + *
>>>> + * Copyright (c) 2013 Andreas Färber
>>>> + */
>>>> +
>>>> +#include "config.h"
>>>> +
>>>> +#include "drivers/drivers.h"
>>>> +#include "asm/io.h"
>>>> +
>>>> +#define PREP_NVRAM_SIZE 0x2000
>>>> +#define PREP_NVRAM_ADDR_LO 0x74
>>>> +#define PREP_NVRAM_ADDR_HI 0x75
>>>> +#define PREP_NVRAM_DATA 0x77
>>>> +
>>>> +static uint8_t m48t59_nvram_read_byte(uint16_t offset)
>>>> +{
>>>> + outb(offset& 0xff, PREP_NVRAM_ADDR_LO);
>>>>
>>>> + outb(offset>> 8, PREP_NVRAM_ADDR_HI);
>>>> + return inb(PREP_NVRAM_DATA);
>>>> +}
>>>> +
>>>> +static void m48t59_nvram_read(uint16_t offset, char *buf, unsigned int
>>>> len)
>>>> +{
>>>> + unsigned int i;
>>>> + for (i = 0; i< len; i++) {
>>>> + buf[i] = m48t59_nvram_read_byte(offset);
>>>> + }
>>>> +}
>>>> +
>>>> +static void m48t59_nvram_write_byte(uint16_t offset, uint8_t value)
>>>> +{
>>>> + outb(offset& 0xff, PREP_NVRAM_ADDR_LO);
>>>>
>>>> + outb(offset>> 8, PREP_NVRAM_ADDR_HI);
>>>> + outb(value, PREP_NVRAM_DATA);
>>>> +}
>>>> +
>>>> +static void m48t59_nvram_write(uint16_t offset, const char *buf,
>>>> unsigned
>>>> int len)
>>>> +{
>>>> + unsigned int i;
>>>> + for (i = 0; i< len; i++) {
>>>> + m48t59_nvram_write_byte(offset, buf[i]);
>>>> + }
>>>> +}
>>>> +
>>>> +int m48t59_nvram_size(void)
>>>> +{
>>>> + return PREP_NVRAM_SIZE;
>>>> +}
>>>> +
>>>> +void m48t59_nvram_put(char *buf)
>>>> +{
>>>> + m48t59_nvram_write(0, buf, PREP_NVRAM_SIZE);
>>>> +}
>>>> +
>>>> +void m48t59_nvram_get(char *buf)
>>>> +{
>>>> + m48t59_nvram_read(0, buf, PREP_NVRAM_SIZE);
>>>> +}
>>>> diff --git a/include/drivers/drivers.h b/include/drivers/drivers.h
>>>> index 47d730f..73da6a2 100644
>>>> --- a/include/drivers/drivers.h
>>>> +++ b/include/drivers/drivers.h
>>>> @@ -125,6 +125,9 @@ unsigned char keyboard_readdata(void);
>>>> int macio_get_nvram_size(void);
>>>> void macio_nvram_put(char *buf);
>>>> void macio_nvram_get(char *buf);
>>>> +int m48t59_nvram_size(void);
>>>> +void m48t59_nvram_put(char *buf);
>>>> +void m48t59_nvram_get(char *buf);
>>>>
>>>> /* drivers/timer.c */
>>>> void setup_timers(void);
>>>
>>>
>>>
>>> The basic patch looks good, although I have a feeling that the m48t59 is
>>> the
>>> same NVRAM chip used by SPARC64 so there could be some changes required
>>> to
>>> support both. Artyom, any thoughts?
>>
>>
>> The m48t59 wired differently on sun4u machines. PReP seems to use PIO,
>> whereas sun4u uses MMIO for accessing the chip. (It is possible that
>> both modes are supported on sun4u, but only MMIO is exposed to user
>> via OBP, but I couldn't find any documentation which would prove or
>> deny that).
>>
>> No objections to this patch from my side.
>
>
> Thanks Artyom.
>
> Given that m48t59 could potentially be used across different architectures,
> on further inspection I'd prefer something a bit more generic and a bit less
> PReP-specific.
Oh. I missed that the file is located directly at drivers/ .You are
right, it has to be a bit more generic.
The NVRAM_SIZE must be the same accross different architectures, but
ADDR_LO ADDR_HI and NVRAM_DATA are definitely not.
> As a compromise, how about renaming the PREP_NVRAM_* constants to
> M48T59_NVRAM_* and moving them to a .h file somewhere under
> include/arch/ppc? Then at least if someone tries to re-use the driver in a
> different architecture, it will fail to compile which will serve as a
> reminder that some alterations to the interface will be required.
>
>
> ATB,
>
> Mark.
--
Regards,
Artyom Tarasenko
linux/sparc and solaris/sparc under qemu blog:
http://tyom.blogspot.com/search/label/qemu
More information about the OpenBIOS
mailing list