[OpenBIOS] [PATCH] ppc: Implement NVRAM support for PReP

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Wed Aug 28 21:47:35 CEST 2013


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.

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.



More information about the OpenBIOS mailing list