m48t59-isa.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. * QEMU M48T59 and M48T08 NVRAM emulation (ISA bus interface)
  3. *
  4. * Copyright (c) 2003-2005, 2007 Jocelyn Mayer
  5. * Copyright (c) 2013 Hervé Poussineau
  6. *
  7. * Permission is hereby granted, free of charge, to any person obtaining a copy
  8. * of this software and associated documentation files (the "Software"), to deal
  9. * in the Software without restriction, including without limitation the rights
  10. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. * copies of the Software, and to permit persons to whom the Software is
  12. * furnished to do so, subject to the following conditions:
  13. *
  14. * The above copyright notice and this permission notice shall be included in
  15. * all copies or substantial portions of the Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. * THE SOFTWARE.
  24. */
  25. #include "qemu/osdep.h"
  26. #include "hw/isa/isa.h"
  27. #include "hw/qdev-properties.h"
  28. #include "hw/rtc/m48t59.h"
  29. #include "m48t59-internal.h"
  30. #include "qemu/module.h"
  31. #define TYPE_M48TXX_ISA "isa-m48txx"
  32. #define M48TXX_ISA_GET_CLASS(obj) \
  33. OBJECT_GET_CLASS(M48txxISADeviceClass, (obj), TYPE_M48TXX_ISA)
  34. #define M48TXX_ISA_CLASS(klass) \
  35. OBJECT_CLASS_CHECK(M48txxISADeviceClass, (klass), TYPE_M48TXX_ISA)
  36. #define M48TXX_ISA(obj) \
  37. OBJECT_CHECK(M48txxISAState, (obj), TYPE_M48TXX_ISA)
  38. typedef struct M48txxISAState {
  39. ISADevice parent_obj;
  40. M48t59State state;
  41. uint32_t io_base;
  42. MemoryRegion io;
  43. } M48txxISAState;
  44. typedef struct M48txxISADeviceClass {
  45. ISADeviceClass parent_class;
  46. M48txxInfo info;
  47. } M48txxISADeviceClass;
  48. static M48txxInfo m48txx_isa_info[] = {
  49. {
  50. .bus_name = "isa-m48t59",
  51. .model = 59,
  52. .size = 0x2000,
  53. }
  54. };
  55. Nvram *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
  56. int base_year, int model)
  57. {
  58. DeviceState *dev;
  59. int i;
  60. for (i = 0; i < ARRAY_SIZE(m48txx_isa_info); i++) {
  61. if (m48txx_isa_info[i].size != size ||
  62. m48txx_isa_info[i].model != model) {
  63. continue;
  64. }
  65. dev = DEVICE(isa_create(bus, m48txx_isa_info[i].bus_name));
  66. qdev_prop_set_uint32(dev, "iobase", io_base);
  67. qdev_prop_set_int32(dev, "base-year", base_year);
  68. qdev_init_nofail(dev);
  69. return NVRAM(dev);
  70. }
  71. assert(false);
  72. return NULL;
  73. }
  74. static uint32_t m48txx_isa_read(Nvram *obj, uint32_t addr)
  75. {
  76. M48txxISAState *d = M48TXX_ISA(obj);
  77. return m48t59_read(&d->state, addr);
  78. }
  79. static void m48txx_isa_write(Nvram *obj, uint32_t addr, uint32_t val)
  80. {
  81. M48txxISAState *d = M48TXX_ISA(obj);
  82. m48t59_write(&d->state, addr, val);
  83. }
  84. static void m48txx_isa_toggle_lock(Nvram *obj, int lock)
  85. {
  86. M48txxISAState *d = M48TXX_ISA(obj);
  87. m48t59_toggle_lock(&d->state, lock);
  88. }
  89. static Property m48t59_isa_properties[] = {
  90. DEFINE_PROP_INT32("base-year", M48txxISAState, state.base_year, 0),
  91. DEFINE_PROP_UINT32("iobase", M48txxISAState, io_base, 0x74),
  92. DEFINE_PROP_END_OF_LIST(),
  93. };
  94. static void m48t59_reset_isa(DeviceState *d)
  95. {
  96. M48txxISAState *isa = M48TXX_ISA(d);
  97. M48t59State *NVRAM = &isa->state;
  98. m48t59_reset_common(NVRAM);
  99. }
  100. static void m48t59_isa_realize(DeviceState *dev, Error **errp)
  101. {
  102. M48txxISADeviceClass *u = M48TXX_ISA_GET_CLASS(dev);
  103. ISADevice *isadev = ISA_DEVICE(dev);
  104. M48txxISAState *d = M48TXX_ISA(dev);
  105. M48t59State *s = &d->state;
  106. s->model = u->info.model;
  107. s->size = u->info.size;
  108. isa_init_irq(isadev, &s->IRQ, 8);
  109. m48t59_realize_common(s, errp);
  110. memory_region_init_io(&d->io, OBJECT(dev), &m48t59_io_ops, s, "m48t59", 4);
  111. if (d->io_base != 0) {
  112. isa_register_ioport(isadev, &d->io, d->io_base);
  113. }
  114. }
  115. static void m48txx_isa_class_init(ObjectClass *klass, void *data)
  116. {
  117. DeviceClass *dc = DEVICE_CLASS(klass);
  118. NvramClass *nc = NVRAM_CLASS(klass);
  119. dc->realize = m48t59_isa_realize;
  120. dc->reset = m48t59_reset_isa;
  121. dc->props = m48t59_isa_properties;
  122. nc->read = m48txx_isa_read;
  123. nc->write = m48txx_isa_write;
  124. nc->toggle_lock = m48txx_isa_toggle_lock;
  125. }
  126. static void m48txx_isa_concrete_class_init(ObjectClass *klass, void *data)
  127. {
  128. M48txxISADeviceClass *u = M48TXX_ISA_CLASS(klass);
  129. M48txxInfo *info = data;
  130. u->info = *info;
  131. }
  132. static const TypeInfo m48txx_isa_type_info = {
  133. .name = TYPE_M48TXX_ISA,
  134. .parent = TYPE_ISA_DEVICE,
  135. .instance_size = sizeof(M48txxISAState),
  136. .abstract = true,
  137. .class_init = m48txx_isa_class_init,
  138. .interfaces = (InterfaceInfo[]) {
  139. { TYPE_NVRAM },
  140. { }
  141. }
  142. };
  143. static void m48t59_isa_register_types(void)
  144. {
  145. TypeInfo isa_type_info = {
  146. .parent = TYPE_M48TXX_ISA,
  147. .class_size = sizeof(M48txxISADeviceClass),
  148. .class_init = m48txx_isa_concrete_class_init,
  149. };
  150. int i;
  151. type_register_static(&m48txx_isa_type_info);
  152. for (i = 0; i < ARRAY_SIZE(m48txx_isa_info); i++) {
  153. isa_type_info.name = m48txx_isa_info[i].bus_name;
  154. isa_type_info.class_data = &m48txx_isa_info[i];
  155. type_register(&isa_type_info);
  156. }
  157. }
  158. type_init(m48t59_isa_register_types)