ppc/ppc405: QOM'ify OCM
The OCM controller is currently modeled as a simple DCR device with a couple of memory regions. Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Signed-off-by: Cédric Le Goater <clg@kaod.org> [balaton: ppc4xx_dcr_register changes] Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Message-Id: <ecb93d2d5993bb7a970365744c7d342d4abcb017.1660746880.git.balaton@eik.bme.hu> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
		
							parent
							
								
									269fbb5b8a
								
							
						
					
					
						commit
						2847eb4089
					
				@ -63,6 +63,21 @@ struct ppc4xx_bd_info_t {
 | 
				
			|||||||
    uint32_t bi_iic_fast[2];
 | 
					    uint32_t bi_iic_fast[2];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* On Chip Memory */
 | 
				
			||||||
 | 
					#define TYPE_PPC405_OCM "ppc405-ocm"
 | 
				
			||||||
 | 
					OBJECT_DECLARE_SIMPLE_TYPE(Ppc405OcmState, PPC405_OCM);
 | 
				
			||||||
 | 
					struct Ppc405OcmState {
 | 
				
			||||||
 | 
					    Ppc4xxDcrDeviceState parent_obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MemoryRegion ram;
 | 
				
			||||||
 | 
					    MemoryRegion isarc_ram;
 | 
				
			||||||
 | 
					    MemoryRegion dsarc_ram;
 | 
				
			||||||
 | 
					    uint32_t isarc;
 | 
				
			||||||
 | 
					    uint32_t isacntl;
 | 
				
			||||||
 | 
					    uint32_t dsarc;
 | 
				
			||||||
 | 
					    uint32_t dsacntl;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* General purpose timers */
 | 
					/* General purpose timers */
 | 
				
			||||||
#define TYPE_PPC405_GPT "ppc405-gpt"
 | 
					#define TYPE_PPC405_GPT "ppc405-gpt"
 | 
				
			||||||
OBJECT_DECLARE_SIMPLE_TYPE(Ppc405GptState, PPC405_GPT);
 | 
					OBJECT_DECLARE_SIMPLE_TYPE(Ppc405GptState, PPC405_GPT);
 | 
				
			||||||
@ -136,6 +151,7 @@ struct Ppc405SoCState {
 | 
				
			|||||||
    DeviceState *uic;
 | 
					    DeviceState *uic;
 | 
				
			||||||
    Ppc405CpcState cpc;
 | 
					    Ppc405CpcState cpc;
 | 
				
			||||||
    Ppc405GptState gpt;
 | 
					    Ppc405GptState gpt;
 | 
				
			||||||
 | 
					    Ppc405OcmState ocm;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PowerPC 405 core */
 | 
					/* PowerPC 405 core */
 | 
				
			||||||
 | 
				
			|||||||
@ -773,20 +773,9 @@ enum {
 | 
				
			|||||||
    OCM0_DSACNTL = 0x01B,
 | 
					    OCM0_DSACNTL = 0x01B,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ppc405_ocm_t ppc405_ocm_t;
 | 
					static void ocm_update_mappings(Ppc405OcmState *ocm,
 | 
				
			||||||
struct ppc405_ocm_t {
 | 
					                                uint32_t isarc, uint32_t isacntl,
 | 
				
			||||||
    MemoryRegion ram;
 | 
					                                uint32_t dsarc, uint32_t dsacntl)
 | 
				
			||||||
    MemoryRegion isarc_ram;
 | 
					 | 
				
			||||||
    MemoryRegion dsarc_ram;
 | 
					 | 
				
			||||||
    uint32_t isarc;
 | 
					 | 
				
			||||||
    uint32_t isacntl;
 | 
					 | 
				
			||||||
    uint32_t dsarc;
 | 
					 | 
				
			||||||
    uint32_t dsacntl;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void ocm_update_mappings (ppc405_ocm_t *ocm,
 | 
					 | 
				
			||||||
                                 uint32_t isarc, uint32_t isacntl,
 | 
					 | 
				
			||||||
                                 uint32_t dsarc, uint32_t dsacntl)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    trace_ocm_update_mappings(isarc, isacntl, dsarc, dsacntl, ocm->isarc,
 | 
					    trace_ocm_update_mappings(isarc, isacntl, dsarc, dsacntl, ocm->isarc,
 | 
				
			||||||
                              ocm->isacntl, ocm->dsarc, ocm->dsacntl);
 | 
					                              ocm->isacntl, ocm->dsarc, ocm->dsacntl);
 | 
				
			||||||
@ -828,12 +817,11 @@ static void ocm_update_mappings (ppc405_ocm_t *ocm,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint32_t dcr_read_ocm (void *opaque, int dcrn)
 | 
					static uint32_t dcr_read_ocm(void *opaque, int dcrn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ppc405_ocm_t *ocm;
 | 
					    Ppc405OcmState *ocm = opaque;
 | 
				
			||||||
    uint32_t ret;
 | 
					    uint32_t ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ocm = opaque;
 | 
					 | 
				
			||||||
    switch (dcrn) {
 | 
					    switch (dcrn) {
 | 
				
			||||||
    case OCM0_ISARC:
 | 
					    case OCM0_ISARC:
 | 
				
			||||||
        ret = ocm->isarc;
 | 
					        ret = ocm->isarc;
 | 
				
			||||||
@ -855,12 +843,11 @@ static uint32_t dcr_read_ocm (void *opaque, int dcrn)
 | 
				
			|||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dcr_write_ocm (void *opaque, int dcrn, uint32_t val)
 | 
					static void dcr_write_ocm(void *opaque, int dcrn, uint32_t val)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ppc405_ocm_t *ocm;
 | 
					    Ppc405OcmState *ocm = opaque;
 | 
				
			||||||
    uint32_t isarc, dsarc, isacntl, dsacntl;
 | 
					    uint32_t isarc, dsarc, isacntl, dsacntl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ocm = opaque;
 | 
					 | 
				
			||||||
    isarc = ocm->isarc;
 | 
					    isarc = ocm->isarc;
 | 
				
			||||||
    dsarc = ocm->dsarc;
 | 
					    dsarc = ocm->dsarc;
 | 
				
			||||||
    isacntl = ocm->isacntl;
 | 
					    isacntl = ocm->isacntl;
 | 
				
			||||||
@ -886,12 +873,11 @@ static void dcr_write_ocm (void *opaque, int dcrn, uint32_t val)
 | 
				
			|||||||
    ocm->dsacntl = dsacntl;
 | 
					    ocm->dsacntl = dsacntl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ocm_reset (void *opaque)
 | 
					static void ppc405_ocm_reset(DeviceState *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ppc405_ocm_t *ocm;
 | 
					    Ppc405OcmState *ocm = PPC405_OCM(dev);
 | 
				
			||||||
    uint32_t isarc, dsarc, isacntl, dsacntl;
 | 
					    uint32_t isarc, dsarc, isacntl, dsacntl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ocm = opaque;
 | 
					 | 
				
			||||||
    isarc = 0x00000000;
 | 
					    isarc = 0x00000000;
 | 
				
			||||||
    isacntl = 0x00000000;
 | 
					    isacntl = 0x00000000;
 | 
				
			||||||
    dsarc = 0x00000000;
 | 
					    dsarc = 0x00000000;
 | 
				
			||||||
@ -903,25 +889,31 @@ static void ocm_reset (void *opaque)
 | 
				
			|||||||
    ocm->dsacntl = dsacntl;
 | 
					    ocm->dsacntl = dsacntl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ppc405_ocm_init(CPUPPCState *env)
 | 
					static void ppc405_ocm_realize(DeviceState *dev, Error **errp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ppc405_ocm_t *ocm;
 | 
					    Ppc405OcmState *ocm = PPC405_OCM(dev);
 | 
				
			||||||
 | 
					    Ppc4xxDcrDeviceState *dcr = PPC4xx_DCR_DEVICE(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ocm = g_new0(ppc405_ocm_t, 1);
 | 
					 | 
				
			||||||
    /* XXX: Size is 4096 or 0x04000000 */
 | 
					    /* XXX: Size is 4096 or 0x04000000 */
 | 
				
			||||||
    memory_region_init_ram(&ocm->isarc_ram, NULL, "ppc405.ocm", 4 * KiB,
 | 
					    memory_region_init_ram(&ocm->isarc_ram, OBJECT(ocm), "ppc405.ocm", 4 * KiB,
 | 
				
			||||||
                           &error_fatal);
 | 
					                           &error_fatal);
 | 
				
			||||||
    memory_region_init_alias(&ocm->dsarc_ram, NULL, "ppc405.dsarc",
 | 
					    memory_region_init_alias(&ocm->dsarc_ram, OBJECT(ocm), "ppc405.dsarc",
 | 
				
			||||||
                             &ocm->isarc_ram, 0, 4 * KiB);
 | 
					                             &ocm->isarc_ram, 0, 4 * KiB);
 | 
				
			||||||
    qemu_register_reset(&ocm_reset, ocm);
 | 
					
 | 
				
			||||||
    ppc_dcr_register(env, OCM0_ISARC,
 | 
					    ppc4xx_dcr_register(dcr, OCM0_ISARC, ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
				
			||||||
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
					    ppc4xx_dcr_register(dcr, OCM0_ISACNTL, ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
				
			||||||
    ppc_dcr_register(env, OCM0_ISACNTL,
 | 
					    ppc4xx_dcr_register(dcr, OCM0_DSARC, ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
				
			||||||
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
					    ppc4xx_dcr_register(dcr, OCM0_DSACNTL, ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
				
			||||||
    ppc_dcr_register(env, OCM0_DSARC,
 | 
					}
 | 
				
			||||||
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
					
 | 
				
			||||||
    ppc_dcr_register(env, OCM0_DSACNTL,
 | 
					static void ppc405_ocm_class_init(ObjectClass *oc, void *data)
 | 
				
			||||||
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
 | 
					{
 | 
				
			||||||
 | 
					    DeviceClass *dc = DEVICE_CLASS(oc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dc->realize = ppc405_ocm_realize;
 | 
				
			||||||
 | 
					    dc->reset = ppc405_ocm_reset;
 | 
				
			||||||
 | 
					    /* Reason: only works as function of a ppc4xx SoC */
 | 
				
			||||||
 | 
					    dc->user_creatable = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*****************************************************************************/
 | 
					/*****************************************************************************/
 | 
				
			||||||
@ -1420,6 +1412,8 @@ static void ppc405_soc_instance_init(Object *obj)
 | 
				
			|||||||
    object_property_add_alias(obj, "sys-clk", OBJECT(&s->cpc), "sys-clk");
 | 
					    object_property_add_alias(obj, "sys-clk", OBJECT(&s->cpc), "sys-clk");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object_initialize_child(obj, "gpt", &s->gpt, TYPE_PPC405_GPT);
 | 
					    object_initialize_child(obj, "gpt", &s->gpt, TYPE_PPC405_GPT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    object_initialize_child(obj, "ocm", &s->ocm, TYPE_PPC405_OCM);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ppc405_reset(void *opaque)
 | 
					static void ppc405_reset(void *opaque)
 | 
				
			||||||
@ -1516,7 +1510,9 @@ static void ppc405_soc_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* OCM */
 | 
					    /* OCM */
 | 
				
			||||||
    ppc405_ocm_init(env);
 | 
					    if (!ppc4xx_dcr_realize(PPC4xx_DCR_DEVICE(&s->ocm), &s->cpu, errp)) {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* GPT */
 | 
					    /* GPT */
 | 
				
			||||||
    sbd = SYS_BUS_DEVICE(&s->gpt);
 | 
					    sbd = SYS_BUS_DEVICE(&s->gpt);
 | 
				
			||||||
@ -1559,6 +1555,11 @@ static void ppc405_soc_class_init(ObjectClass *oc, void *data)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static const TypeInfo ppc405_types[] = {
 | 
					static const TypeInfo ppc405_types[] = {
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        .name           = TYPE_PPC405_OCM,
 | 
				
			||||||
 | 
					        .parent         = TYPE_PPC4xx_DCR_DEVICE,
 | 
				
			||||||
 | 
					        .instance_size  = sizeof(Ppc405OcmState),
 | 
				
			||||||
 | 
					        .class_init     = ppc405_ocm_class_init,
 | 
				
			||||||
 | 
					    }, {
 | 
				
			||||||
        .name           = TYPE_PPC405_GPT,
 | 
					        .name           = TYPE_PPC405_GPT,
 | 
				
			||||||
        .parent         = TYPE_SYS_BUS_DEVICE,
 | 
					        .parent         = TYPE_SYS_BUS_DEVICE,
 | 
				
			||||||
        .instance_size  = sizeof(Ppc405GptState),
 | 
					        .instance_size  = sizeof(Ppc405GptState),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user