mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
hw/misc: Add nr_regs and cold_reset_values to NPCM GCR
These 2 values are different between NPCM7XX and NPCM8XX GCRs. So we add them to the class and assign different values to them. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Hao Wu <wuhaotsh@google.com> Message-id: 20250219184609.1839281-7-wuhaotsh@google.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
c99064e637
commit
8ca2021b9d
2 changed files with 27 additions and 13 deletions
|
@ -66,10 +66,9 @@ enum NPCM7xxGCRRegisters {
|
||||||
NPCM7XX_GCR_SCRPAD = 0x013c / sizeof(uint32_t),
|
NPCM7XX_GCR_SCRPAD = 0x013c / sizeof(uint32_t),
|
||||||
NPCM7XX_GCR_USB1PHYCTL,
|
NPCM7XX_GCR_USB1PHYCTL,
|
||||||
NPCM7XX_GCR_USB2PHYCTL,
|
NPCM7XX_GCR_USB2PHYCTL,
|
||||||
NPCM7XX_GCR_REGS_END,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32_t cold_reset_values[NPCM7XX_GCR_NR_REGS] = {
|
static const uint32_t npcm7xx_cold_reset_values[NPCM7XX_GCR_NR_REGS] = {
|
||||||
[NPCM7XX_GCR_PDID] = 0x04a92750, /* Poleg A1 */
|
[NPCM7XX_GCR_PDID] = 0x04a92750, /* Poleg A1 */
|
||||||
[NPCM7XX_GCR_MISCPE] = 0x0000ffff,
|
[NPCM7XX_GCR_MISCPE] = 0x0000ffff,
|
||||||
[NPCM7XX_GCR_SPSWC] = 0x00000003,
|
[NPCM7XX_GCR_SPSWC] = 0x00000003,
|
||||||
|
@ -88,8 +87,9 @@ static uint64_t npcm_gcr_read(void *opaque, hwaddr offset, unsigned size)
|
||||||
{
|
{
|
||||||
uint32_t reg = offset / sizeof(uint32_t);
|
uint32_t reg = offset / sizeof(uint32_t);
|
||||||
NPCMGCRState *s = opaque;
|
NPCMGCRState *s = opaque;
|
||||||
|
NPCMGCRClass *c = NPCM_GCR_GET_CLASS(s);
|
||||||
|
|
||||||
if (reg >= NPCM7XX_GCR_NR_REGS) {
|
if (reg >= c->nr_regs) {
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
"%s: offset 0x%04" HWADDR_PRIx " out of range\n",
|
"%s: offset 0x%04" HWADDR_PRIx " out of range\n",
|
||||||
__func__, offset);
|
__func__, offset);
|
||||||
|
@ -106,11 +106,12 @@ static void npcm_gcr_write(void *opaque, hwaddr offset,
|
||||||
{
|
{
|
||||||
uint32_t reg = offset / sizeof(uint32_t);
|
uint32_t reg = offset / sizeof(uint32_t);
|
||||||
NPCMGCRState *s = opaque;
|
NPCMGCRState *s = opaque;
|
||||||
|
NPCMGCRClass *c = NPCM_GCR_GET_CLASS(s);
|
||||||
uint32_t value = v;
|
uint32_t value = v;
|
||||||
|
|
||||||
trace_npcm_gcr_write(offset, value);
|
trace_npcm_gcr_write(offset, v);
|
||||||
|
|
||||||
if (reg >= NPCM7XX_GCR_NR_REGS) {
|
if (reg >= c->nr_regs) {
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
"%s: offset 0x%04" HWADDR_PRIx " out of range\n",
|
"%s: offset 0x%04" HWADDR_PRIx " out of range\n",
|
||||||
__func__, offset);
|
__func__, offset);
|
||||||
|
@ -156,10 +157,12 @@ static const struct MemoryRegionOps npcm_gcr_ops = {
|
||||||
static void npcm7xx_gcr_enter_reset(Object *obj, ResetType type)
|
static void npcm7xx_gcr_enter_reset(Object *obj, ResetType type)
|
||||||
{
|
{
|
||||||
NPCMGCRState *s = NPCM_GCR(obj);
|
NPCMGCRState *s = NPCM_GCR(obj);
|
||||||
|
NPCMGCRClass *c = NPCM_GCR_GET_CLASS(obj);
|
||||||
|
|
||||||
QEMU_BUILD_BUG_ON(sizeof(s->regs) != sizeof(cold_reset_values));
|
g_assert(sizeof(s->regs) >= sizeof(c->cold_reset_values));
|
||||||
|
g_assert(sizeof(s->regs) >= c->nr_regs * sizeof(uint32_t));
|
||||||
memcpy(s->regs, cold_reset_values, sizeof(s->regs));
|
memcpy(s->regs, c->cold_reset_values, c->nr_regs * sizeof(uint32_t));
|
||||||
|
/* These 3 registers are at the same location in both 7xx and 8xx. */
|
||||||
s->regs[NPCM7XX_GCR_PWRON] = s->reset_pwron;
|
s->regs[NPCM7XX_GCR_PWRON] = s->reset_pwron;
|
||||||
s->regs[NPCM7XX_GCR_MDLR] = s->reset_mdlr;
|
s->regs[NPCM7XX_GCR_MDLR] = s->reset_mdlr;
|
||||||
s->regs[NPCM7XX_GCR_INTCR3] = s->reset_intcr3;
|
s->regs[NPCM7XX_GCR_INTCR3] = s->reset_intcr3;
|
||||||
|
@ -224,7 +227,7 @@ static const VMStateDescription vmstate_npcm_gcr = {
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 1,
|
||||||
.fields = (const VMStateField[]) {
|
.fields = (const VMStateField[]) {
|
||||||
VMSTATE_UINT32_ARRAY(regs, NPCMGCRState, NPCM7XX_GCR_NR_REGS),
|
VMSTATE_UINT32_ARRAY(regs, NPCMGCRState, NPCM_GCR_MAX_NR_REGS),
|
||||||
VMSTATE_END_OF_LIST(),
|
VMSTATE_END_OF_LIST(),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -238,7 +241,6 @@ static void npcm_gcr_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
|
||||||
QEMU_BUILD_BUG_ON(NPCM7XX_GCR_REGS_END > NPCM7XX_GCR_NR_REGS);
|
|
||||||
dc->realize = npcm_gcr_realize;
|
dc->realize = npcm_gcr_realize;
|
||||||
dc->vmsd = &vmstate_npcm_gcr;
|
dc->vmsd = &vmstate_npcm_gcr;
|
||||||
|
|
||||||
|
@ -247,13 +249,15 @@ static void npcm_gcr_class_init(ObjectClass *klass, void *data)
|
||||||
|
|
||||||
static void npcm7xx_gcr_class_init(ObjectClass *klass, void *data)
|
static void npcm7xx_gcr_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
|
NPCMGCRClass *c = NPCM_GCR_CLASS(klass);
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||||
|
|
||||||
QEMU_BUILD_BUG_ON(NPCM7XX_GCR_REGS_END != NPCM7XX_GCR_NR_REGS);
|
|
||||||
dc->desc = "NPCM7xx System Global Control Registers";
|
dc->desc = "NPCM7xx System Global Control Registers";
|
||||||
rc->phases.enter = npcm7xx_gcr_enter_reset;
|
rc->phases.enter = npcm7xx_gcr_enter_reset;
|
||||||
|
|
||||||
|
c->nr_regs = NPCM7XX_GCR_NR_REGS;
|
||||||
|
c->cold_reset_values = npcm7xx_cold_reset_values;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo npcm_gcr_info[] = {
|
static const TypeInfo npcm_gcr_info[] = {
|
||||||
|
@ -262,6 +266,7 @@ static const TypeInfo npcm_gcr_info[] = {
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
.instance_size = sizeof(NPCMGCRState),
|
.instance_size = sizeof(NPCMGCRState),
|
||||||
.instance_init = npcm_gcr_init,
|
.instance_init = npcm_gcr_init,
|
||||||
|
.class_size = sizeof(NPCMGCRClass),
|
||||||
.class_init = npcm_gcr_class_init,
|
.class_init = npcm_gcr_class_init,
|
||||||
.abstract = true,
|
.abstract = true,
|
||||||
},
|
},
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
|
#include "qom/object.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NPCM7XX PWRON STRAP bit fields
|
* NPCM7XX PWRON STRAP bit fields
|
||||||
|
@ -53,6 +54,7 @@
|
||||||
* Number of registers in our device state structure. Don't change this without
|
* Number of registers in our device state structure. Don't change this without
|
||||||
* incrementing the version_id in the vmstate.
|
* incrementing the version_id in the vmstate.
|
||||||
*/
|
*/
|
||||||
|
#define NPCM_GCR_MAX_NR_REGS NPCM7XX_GCR_NR_REGS
|
||||||
#define NPCM7XX_GCR_NR_REGS (0x148 / sizeof(uint32_t))
|
#define NPCM7XX_GCR_NR_REGS (0x148 / sizeof(uint32_t))
|
||||||
|
|
||||||
typedef struct NPCMGCRState {
|
typedef struct NPCMGCRState {
|
||||||
|
@ -60,15 +62,22 @@ typedef struct NPCMGCRState {
|
||||||
|
|
||||||
MemoryRegion iomem;
|
MemoryRegion iomem;
|
||||||
|
|
||||||
uint32_t regs[NPCM7XX_GCR_NR_REGS];
|
uint32_t regs[NPCM_GCR_MAX_NR_REGS];
|
||||||
|
|
||||||
uint32_t reset_pwron;
|
uint32_t reset_pwron;
|
||||||
uint32_t reset_mdlr;
|
uint32_t reset_mdlr;
|
||||||
uint32_t reset_intcr3;
|
uint32_t reset_intcr3;
|
||||||
} NPCMGCRState;
|
} NPCMGCRState;
|
||||||
|
|
||||||
|
typedef struct NPCMGCRClass {
|
||||||
|
SysBusDeviceClass parent;
|
||||||
|
|
||||||
|
size_t nr_regs;
|
||||||
|
const uint32_t *cold_reset_values;
|
||||||
|
} NPCMGCRClass;
|
||||||
|
|
||||||
#define TYPE_NPCM_GCR "npcm-gcr"
|
#define TYPE_NPCM_GCR "npcm-gcr"
|
||||||
#define TYPE_NPCM7XX_GCR "npcm7xx-gcr"
|
#define TYPE_NPCM7XX_GCR "npcm7xx-gcr"
|
||||||
OBJECT_DECLARE_SIMPLE_TYPE(NPCMGCRState, NPCM_GCR)
|
OBJECT_DECLARE_TYPE(NPCMGCRState, NPCMGCRClass, NPCM_GCR)
|
||||||
|
|
||||||
#endif /* NPCM_GCR_H */
|
#endif /* NPCM_GCR_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue