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_USB1PHYCTL,
|
||||
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_MISCPE] = 0x0000ffff,
|
||||
[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);
|
||||
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,
|
||||
"%s: offset 0x%04" HWADDR_PRIx " out of range\n",
|
||||
__func__, offset);
|
||||
|
@ -106,11 +106,12 @@ static void npcm_gcr_write(void *opaque, hwaddr offset,
|
|||
{
|
||||
uint32_t reg = offset / sizeof(uint32_t);
|
||||
NPCMGCRState *s = opaque;
|
||||
NPCMGCRClass *c = NPCM_GCR_GET_CLASS(s);
|
||||
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,
|
||||
"%s: offset 0x%04" HWADDR_PRIx " out of range\n",
|
||||
__func__, offset);
|
||||
|
@ -156,10 +157,12 @@ static const struct MemoryRegionOps npcm_gcr_ops = {
|
|||
static void npcm7xx_gcr_enter_reset(Object *obj, ResetType type)
|
||||
{
|
||||
NPCMGCRState *s = NPCM_GCR(obj);
|
||||
NPCMGCRClass *c = NPCM_GCR_GET_CLASS(obj);
|
||||
|
||||
QEMU_BUILD_BUG_ON(sizeof(s->regs) != sizeof(cold_reset_values));
|
||||
|
||||
memcpy(s->regs, cold_reset_values, sizeof(s->regs));
|
||||
g_assert(sizeof(s->regs) >= sizeof(c->cold_reset_values));
|
||||
g_assert(sizeof(s->regs) >= c->nr_regs * sizeof(uint32_t));
|
||||
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_MDLR] = s->reset_mdlr;
|
||||
s->regs[NPCM7XX_GCR_INTCR3] = s->reset_intcr3;
|
||||
|
@ -224,7 +227,7 @@ static const VMStateDescription vmstate_npcm_gcr = {
|
|||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.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(),
|
||||
},
|
||||
};
|
||||
|
@ -238,7 +241,6 @@ static void npcm_gcr_class_init(ObjectClass *klass, void *data)
|
|||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
QEMU_BUILD_BUG_ON(NPCM7XX_GCR_REGS_END > NPCM7XX_GCR_NR_REGS);
|
||||
dc->realize = npcm_gcr_realize;
|
||||
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)
|
||||
{
|
||||
NPCMGCRClass *c = NPCM_GCR_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_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";
|
||||
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[] = {
|
||||
|
@ -262,6 +266,7 @@ static const TypeInfo npcm_gcr_info[] = {
|
|||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(NPCMGCRState),
|
||||
.instance_init = npcm_gcr_init,
|
||||
.class_size = sizeof(NPCMGCRClass),
|
||||
.class_init = npcm_gcr_class_init,
|
||||
.abstract = true,
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue