diff mbox

[PATCHv3,1/2] m48t59: introduce new base_year qdev property

Message ID 1423903949-14487-2-git-send-email-mark.cave-ayland@ilande.co.uk
State New
Headers show

Commit Message

Mark Cave-Ayland Feb. 14, 2015, 8:52 a.m. UTC
Currently the m48t59 device uses the hardware model in order to determine
whether the year value is offset from the hardware value. As this will
soon be required by the x59 model, create a qdev base_year property to
represent the base year and update the callers appropriately.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/ppc/ppc405_boards.c    |    2 +-
 hw/ppc/prep.c             |    2 +-
 hw/sparc/sun4m.c          |    2 +-
 hw/sparc64/sun4u.c        |    2 +-
 hw/timer/m48t59.c         |   27 +++++++++++++++------------
 include/hw/timer/m48t59.h |    5 +++--
 6 files changed, 22 insertions(+), 18 deletions(-)

Comments

Hervé Poussineau Feb. 14, 2015, 6:16 p.m. UTC | #1
Hi,

Le 14/02/2015 09:52, Mark Cave-Ayland a écrit :
> Currently the m48t59 device uses the hardware model in order to determine
> whether the year value is offset from the hardware value. As this will
> soon be required by the x59 model, create a qdev base_year property to
> represent the base year and update the callers appropriately.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>   hw/ppc/ppc405_boards.c    |    2 +-
>   hw/ppc/prep.c             |    2 +-
>   hw/sparc/sun4m.c          |    2 +-
>   hw/sparc64/sun4u.c        |    2 +-
>   hw/timer/m48t59.c         |   27 +++++++++++++++------------
>   include/hw/timer/m48t59.h |    5 +++--
>   6 files changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
> index 1dcea77..5019f20 100644
> --- a/hw/ppc/ppc405_boards.c
> +++ b/hw/ppc/ppc405_boards.c
> @@ -283,7 +283,7 @@ static void ref405ep_init(MachineState *machine)
>   #ifdef DEBUG_BOARD_INIT
>       printf("%s: register NVRAM\n", __func__);
>   #endif
> -    m48t59_init(NULL, 0xF0000000, 0, 8192, 8);
> +    m48t59_init(NULL, 0xF0000000, 0, 8192, 2000, 8);
>       /* Load kernel */
>       linux_boot = (kernel_filename != NULL);
>       if (linux_boot) {

Before this patch, m48t59 model 8 (ie m48t08) was handled with a base year of 1968 by default. Here, you're changing the behaviour. Is is expected, or did you meant 1968?

> [...]

> @@ -387,11 +388,7 @@ static void m48t59_write(M48t59State *NVRAM, uint32_t addr, uint32_t val)
>   	tmp = from_bcd(val);
>   	if (tmp >= 0 && tmp <= 99) {
>   	    get_time(NVRAM, &tm);
> -            if (NVRAM->model == 8) {
> -                tm.tm_year = from_bcd(val) + 68; // Base year is 1968
> -            } else {
> -                tm.tm_year = from_bcd(val);
> -            }
> +            tm.tm_year = from_bcd(val) + NVRAM->base_year - 1900;
>   	    set_time(NVRAM, &tm);
>   	}
>           break;

Here, 1968 was the default base year for m48t08 on writes.

> @@ -493,11 +490,7 @@ static uint32_t m48t59_read(M48t59State *NVRAM, uint32_t addr)
>       case 0x07FF:
>           /* year */
>           get_time(NVRAM, &tm);
> -        if (NVRAM->model == 8) {
> -            retval = to_bcd(tm.tm_year - 68); // Base year is 1968
> -        } else {
> -            retval = to_bcd(tm.tm_year);
> -        }
> +        retval = to_bcd((tm.tm_year + 1900 - NVRAM->base_year) % 100);
>           break;
>       default:
>           /* Check lock registers state */

Here, 1968 was the default base year for m48t08 on reads.

 >  [...]

> @@ -809,6 +805,7 @@ static void m48txx_isa_toggle_lock(Nvram *obj, int lock)
>   }
>
>   static Property m48t59_isa_properties[] = {
> +    DEFINE_PROP_INT32("base_year", M48txxISAState, state.base_year, 0),
>       DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74),
>       DEFINE_PROP_END_OF_LIST(),
>   };

It seems like tha QEMU way of naming properties is with an hyphen, not with an underscore. So you should use "base-year" instead of "base_year".

> @@ -852,6 +849,11 @@ static void m48txx_sysbus_toggle_lock(Nvram *obj, int lock)
>       m48t59_toggle_lock(&d->state, lock);
>   }
>
> +static Property m48t59_sysbus_properties[] = {
> +    DEFINE_PROP_INT32("base_year", M48txxSysBusState, state.base_year, 0),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +

Again here.

Regards,

Hervé
Mark Cave-Ayland Feb. 16, 2015, 10:35 p.m. UTC | #2
On 14/02/15 18:16, Hervé Poussineau wrote:

> Hi,
> 
> Le 14/02/2015 09:52, Mark Cave-Ayland a écrit :
>> Currently the m48t59 device uses the hardware model in order to determine
>> whether the year value is offset from the hardware value. As this will
>> soon be required by the x59 model, create a qdev base_year property to
>> represent the base year and update the callers appropriately.
>>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
>> ---
>>   hw/ppc/ppc405_boards.c    |    2 +-
>>   hw/ppc/prep.c             |    2 +-
>>   hw/sparc/sun4m.c          |    2 +-
>>   hw/sparc64/sun4u.c        |    2 +-
>>   hw/timer/m48t59.c         |   27 +++++++++++++++------------
>>   include/hw/timer/m48t59.h |    5 +++--
>>   6 files changed, 22 insertions(+), 18 deletions(-)
>>
>> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
>> index 1dcea77..5019f20 100644
>> --- a/hw/ppc/ppc405_boards.c
>> +++ b/hw/ppc/ppc405_boards.c
>> @@ -283,7 +283,7 @@ static void ref405ep_init(MachineState *machine)
>>   #ifdef DEBUG_BOARD_INIT
>>       printf("%s: register NVRAM\n", __func__);
>>   #endif
>> -    m48t59_init(NULL, 0xF0000000, 0, 8192, 8);
>> +    m48t59_init(NULL, 0xF0000000, 0, 8192, 2000, 8);
>>       /* Load kernel */
>>       linux_boot = (kernel_filename != NULL);
>>       if (linux_boot) {
> 
> Before this patch, m48t59 model 8 (ie m48t08) was handled with a base
> year of 1968 by default. Here, you're changing the behaviour. Is is
> expected, or did you meant 1968?

Yes, you are correct - looks like I made a mistake here when fixing up
the callers.

>> [...]
> 
>> @@ -387,11 +388,7 @@ static void m48t59_write(M48t59State *NVRAM,
>> uint32_t addr, uint32_t val)
>>       tmp = from_bcd(val);
>>       if (tmp >= 0 && tmp <= 99) {
>>           get_time(NVRAM, &tm);
>> -            if (NVRAM->model == 8) {
>> -                tm.tm_year = from_bcd(val) + 68; // Base year is 1968
>> -            } else {
>> -                tm.tm_year = from_bcd(val);
>> -            }
>> +            tm.tm_year = from_bcd(val) + NVRAM->base_year - 1900;
>>           set_time(NVRAM, &tm);
>>       }
>>           break;
> 
> Here, 1968 was the default base year for m48t08 on writes.
> 
>> @@ -493,11 +490,7 @@ static uint32_t m48t59_read(M48t59State *NVRAM,
>> uint32_t addr)
>>       case 0x07FF:
>>           /* year */
>>           get_time(NVRAM, &tm);
>> -        if (NVRAM->model == 8) {
>> -            retval = to_bcd(tm.tm_year - 68); // Base year is 1968
>> -        } else {
>> -            retval = to_bcd(tm.tm_year);
>> -        }
>> +        retval = to_bcd((tm.tm_year + 1900 - NVRAM->base_year) % 100);
>>           break;
>>       default:
>>           /* Check lock registers state */
> 
> Here, 1968 was the default base year for m48t08 on reads.
> 
>>  [...]
> 
>> @@ -809,6 +805,7 @@ static void m48txx_isa_toggle_lock(Nvram *obj, int
>> lock)
>>   }
>>
>>   static Property m48t59_isa_properties[] = {
>> +    DEFINE_PROP_INT32("base_year", M48txxISAState, state.base_year, 0),
>>       DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74),
>>       DEFINE_PROP_END_OF_LIST(),
>>   };
> 
> It seems like tha QEMU way of naming properties is with an hyphen, not
> with an underscore. So you should use "base-year" instead of "base_year".
> 
>> @@ -852,6 +849,11 @@ static void m48txx_sysbus_toggle_lock(Nvram *obj,
>> int lock)
>>       m48t59_toggle_lock(&d->state, lock);
>>   }
>>
>> +static Property m48t59_sysbus_properties[] = {
>> +    DEFINE_PROP_INT32("base_year", M48txxSysBusState,
>> state.base_year, 0),
>> +    DEFINE_PROP_END_OF_LIST(),
>> +};
>> +
> 
> Again here.

Okay. I'll fix this up and resend the series again. Thanks for taking
the time to review!


ATB,

Mark.
diff mbox

Patch

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index 1dcea77..5019f20 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -283,7 +283,7 @@  static void ref405ep_init(MachineState *machine)
 #ifdef DEBUG_BOARD_INIT
     printf("%s: register NVRAM\n", __func__);
 #endif
-    m48t59_init(NULL, 0xF0000000, 0, 8192, 8);
+    m48t59_init(NULL, 0xF0000000, 0, 8192, 2000, 8);
     /* Load kernel */
     linux_boot = (kernel_filename != NULL);
     if (linux_boot) {
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 9290846..7f52662 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -684,7 +684,7 @@  static void ppc_prep_init(MachineState *machine)
         pci_create_simple(pci_bus, -1, "pci-ohci");
     }
 
-    m48t59 = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59);
+    m48t59 = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 2000, 59);
     if (m48t59 == NULL)
         return;
     sysctrl->nvram = m48t59;
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 5ff7c5b..1368cb1 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1014,7 +1014,7 @@  static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
 
     lance_init(&nd_table[0], hwdef->le_base, ledma, ledma_irq);
 
-    nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x2000, 8);
+    nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x2000, 1968, 8);
 
     slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus);
 
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 5833484..f607f00 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -876,7 +876,7 @@  static void sun4uv_init(MemoryRegion *address_space_mem,
         fd[i] = drive_get(IF_FLOPPY, 0, i);
     }
     fdctrl_init_isa(isa_bus, fd);
-    nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59);
+    nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 2000, 59);
 
     initrd_size = 0;
     initrd_addr = 0;
diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 08f0d57..3d2d6ac 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -79,6 +79,7 @@  typedef struct M48t59State {
     qemu_irq IRQ;
     MemoryRegion iomem;
     uint32_t size;
+    int32_t base_year;
     /* RTC management */
     time_t   time_offset;
     time_t   stop_time;
@@ -387,11 +388,7 @@  static void m48t59_write(M48t59State *NVRAM, uint32_t addr, uint32_t val)
 	tmp = from_bcd(val);
 	if (tmp >= 0 && tmp <= 99) {
 	    get_time(NVRAM, &tm);
-            if (NVRAM->model == 8) {
-                tm.tm_year = from_bcd(val) + 68; // Base year is 1968
-            } else {
-                tm.tm_year = from_bcd(val);
-            }
+            tm.tm_year = from_bcd(val) + NVRAM->base_year - 1900;
 	    set_time(NVRAM, &tm);
 	}
         break;
@@ -493,11 +490,7 @@  static uint32_t m48t59_read(M48t59State *NVRAM, uint32_t addr)
     case 0x07FF:
         /* year */
         get_time(NVRAM, &tm);
-        if (NVRAM->model == 8) {
-            retval = to_bcd(tm.tm_year - 68); // Base year is 1968
-        } else {
-            retval = to_bcd(tm.tm_year);
-        }
+        retval = to_bcd((tm.tm_year + 1900 - NVRAM->base_year) % 100);
         break;
     default:
         /* Check lock registers state */
@@ -680,7 +673,8 @@  static const MemoryRegionOps m48t59_io_ops = {
 
 /* Initialisation routine */
 Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base,
-                   uint32_t io_base, uint16_t size, int model)
+                   uint32_t io_base, uint16_t size, int base_year,
+                   int model)
 {
     DeviceState *dev;
     SysBusDevice *s;
@@ -694,6 +688,7 @@  Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base,
         }
 
         dev = qdev_create(NULL, m48txx_info[i].sysbus_name);
+        qdev_prop_set_int32(dev, "base_year", base_year);
         qdev_init_nofail(dev);
         s = SYS_BUS_DEVICE(dev);
         sysbus_connect_irq(s, 0, IRQ);
@@ -713,7 +708,7 @@  Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base,
 }
 
 Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
-                       int model)
+                       int base_year, int model)
 {
     DeviceState *dev;
     int i;
@@ -727,6 +722,7 @@  Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
 
         dev = DEVICE(isa_create(bus, m48txx_info[i].isa_name));
         qdev_prop_set_uint32(dev, "iobase", io_base);
+        qdev_prop_set_int32(dev, "base_year", base_year);
         qdev_init_nofail(dev);
         return NVRAM(dev);
     }
@@ -809,6 +805,7 @@  static void m48txx_isa_toggle_lock(Nvram *obj, int lock)
 }
 
 static Property m48t59_isa_properties[] = {
+    DEFINE_PROP_INT32("base_year", M48txxISAState, state.base_year, 0),
     DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -852,6 +849,11 @@  static void m48txx_sysbus_toggle_lock(Nvram *obj, int lock)
     m48t59_toggle_lock(&d->state, lock);
 }
 
+static Property m48t59_sysbus_properties[] = {
+    DEFINE_PROP_INT32("base_year", M48txxSysBusState, state.base_year, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -860,6 +862,7 @@  static void m48txx_sysbus_class_init(ObjectClass *klass, void *data)
 
     k->init = m48t59_init1;
     dc->reset = m48t59_reset_sysbus;
+    dc->props = m48t59_sysbus_properties;
     nc->read = m48txx_sysbus_read;
     nc->write = m48txx_sysbus_write;
     nc->toggle_lock = m48txx_sysbus_toggle_lock;
diff --git a/include/hw/timer/m48t59.h b/include/hw/timer/m48t59.h
index cf80d20..3367923 100644
--- a/include/hw/timer/m48t59.h
+++ b/include/hw/timer/m48t59.h
@@ -26,8 +26,9 @@  typedef struct NvramClass {
 } NvramClass;
 
 Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
-                       int type);
+                       int base_year, int type);
 Nvram *m48t59_init(qemu_irq IRQ, hwaddr mem_base,
-                   uint32_t io_base, uint16_t size, int type);
+                   uint32_t io_base, uint16_t size, int base_year,
+                   int type);
 
 #endif /* !NVRAM_H */