Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement register mirroring #1119

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/device/rcp/ai/ai_controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ void read_ai_regs(void* opaque, uint32_t address, uint32_t* value)
ai->last_read = *value;
}
}
else
else if (reg < AI_REGS_COUNT)
{
*value = ai->regs[reg];
}
Expand Down Expand Up @@ -216,7 +216,10 @@ void write_ai_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask
return;
}

masked_write(&ai->regs[reg], value, mask);
if (reg < AI_REGS_COUNT)
{
masked_write(&ai->regs[reg], value, mask);
}
}

void ai_end_of_dma_event(void* opaque)
Expand Down
2 changes: 1 addition & 1 deletion src/device/rcp/ai/ai_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ struct ai_controller

static osal_inline uint32_t ai_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

void init_ai(struct ai_controller* ai,
Expand Down
2 changes: 1 addition & 1 deletion src/device/rcp/mi/mi_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ struct mi_controller

static osal_inline uint32_t mi_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0xf) >> 2;
}

void init_mi(struct mi_controller* mi, struct r4300_core* r4300);
Expand Down
8 changes: 6 additions & 2 deletions src/device/rcp/pi/pi_controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,8 @@ void read_pi_regs(void* opaque, uint32_t address, uint32_t* value)
struct pi_controller* pi = (struct pi_controller*)opaque;
uint32_t reg = pi_reg(address);

*value = pi->regs[reg];
if (reg < PI_REGS_COUNT)
*value = pi->regs[reg];

if (reg == PI_WR_LEN_REG || reg == PI_RD_LEN_REG)
*value = 0x7F;
Expand Down Expand Up @@ -209,7 +210,10 @@ void write_pi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask
return;
}

masked_write(&pi->regs[reg], value, mask);
if (reg < PI_REGS_COUNT)
{
masked_write(&pi->regs[reg], value, mask);
}
}

void pi_end_of_dma_event(void* opaque)
Expand Down
2 changes: 1 addition & 1 deletion src/device/rcp/pi/pi_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ struct pi_controller

static osal_inline uint32_t pi_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x3f) >> 2;
}


Expand Down
10 changes: 8 additions & 2 deletions src/device/rcp/rdp/rdp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,15 +128,21 @@ void read_dps_regs(void* opaque, uint32_t address, uint32_t* value)
struct rdp_core* dp = (struct rdp_core*)opaque;
uint32_t reg = dps_reg(address);

*value = dp->dps_regs[reg];
if (reg < DPS_REGS_COUNT)
{
*value = dp->dps_regs[reg];
}
}

void write_dps_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
{
struct rdp_core* dp = (struct rdp_core*)opaque;
uint32_t reg = dps_reg(address);

masked_write(&dp->dps_regs[reg], value, mask);
if (reg < DPS_REGS_COUNT)
{
masked_write(&dp->dps_regs[reg], value, mask);
}
}

void rdp_interrupt_event(void* opaque)
Expand Down
4 changes: 2 additions & 2 deletions src/device/rcp/rdp/rdp_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,12 @@ struct rdp_core

static osal_inline uint32_t dpc_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

static osal_inline uint32_t dps_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

void init_rdp(struct rdp_core* dp,
Expand Down
2 changes: 1 addition & 1 deletion src/device/rcp/ri/ri_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ struct ri_controller

static osal_inline uint32_t ri_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

static osal_inline uint16_t ri_address_to_id_field(uint32_t address)
Expand Down
7 changes: 4 additions & 3 deletions src/device/rcp/rsp/rsp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,11 +304,11 @@ void read_rsp_regs2(void* opaque, uint32_t address, uint32_t* value)
struct rsp_core* sp = (struct rsp_core*)opaque;
uint32_t reg = rsp_reg2(address);

*value = sp->regs2[reg];
if (reg < SP_REGS2_COUNT)
*value = sp->regs2[reg];

if (reg == SP_PC_REG)
*value &= 0xffc;

}

void write_rsp_regs2(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand All @@ -319,7 +319,8 @@ void write_rsp_regs2(void* opaque, uint32_t address, uint32_t value, uint32_t ma
if (reg == SP_PC_REG)
mask &= 0xffc;

masked_write(&sp->regs2[reg], value, mask);
if (reg < SP_REGS2_COUNT)
masked_write(&sp->regs2[reg], value, mask);
}

void do_SP_Task(struct rsp_core* sp)
Expand Down
4 changes: 2 additions & 2 deletions src/device/rcp/rsp/rsp_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,12 @@ static osal_inline uint32_t rsp_mem_address(uint32_t address)

static osal_inline uint32_t rsp_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

static osal_inline uint32_t rsp_reg2(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}

void init_rsp(struct rsp_core* sp,
Expand Down
5 changes: 4 additions & 1 deletion src/device/rcp/si/si_controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,10 @@ void read_si_regs(void* opaque, uint32_t address, uint32_t* value)
struct si_controller* si = (struct si_controller*)opaque;
uint32_t reg = si_reg(address);

*value = si->regs[reg];
if (reg < SI_REGS_COUNT)
{
*value = si->regs[reg];
}
}

void write_si_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand Down
2 changes: 1 addition & 1 deletion src/device/rcp/si/si_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ struct si_controller

static osal_inline uint32_t si_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x1f) >> 2;
}


Expand Down
10 changes: 8 additions & 2 deletions src/device/rcp/vi/vi_controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,10 @@ void read_vi_regs(void* opaque, uint32_t address, uint32_t* value)
vi->regs[VI_CURRENT_REG] = (vi->regs[VI_CURRENT_REG] & (~1)) | vi->field;
}

*value = vi->regs[reg];
if (reg < VI_REGS_COUNT)
{
*value = vi->regs[reg];
}
}

void write_vi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
Expand Down Expand Up @@ -151,7 +154,10 @@ void write_vi_regs(void* opaque, uint32_t address, uint32_t value, uint32_t mask
return;
}

masked_write(&vi->regs[reg], value, mask);
if (reg < VI_REGS_COUNT)
{
masked_write(&vi->regs[reg], value, mask);
}
}

void vi_vertical_interrupt_event(void* opaque)
Expand Down
2 changes: 1 addition & 1 deletion src/device/rcp/vi/vi_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ struct vi_controller

static osal_inline uint32_t vi_reg(uint32_t address)
{
return (address & 0xffff) >> 2;
return (address & 0x3f) >> 2;
}


Expand Down
10 changes: 9 additions & 1 deletion src/device/rdram/rdram.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,11 @@ void read_rdram_regs(void* opaque, uint32_t address, uint32_t* value)
return;
}

*value = rdram->regs[module][reg];
if (reg < RDRAM_REGS_COUNT) {
*value = rdram->regs[module][reg];
} else {
*value = 0;
}

/* some bits are inverted when read */
if (reg == RDRAM_MODE_REG) {
Expand All @@ -188,6 +192,10 @@ void write_rdram_regs(void* opaque, uint32_t address, uint32_t value, uint32_t m
size_t module;
size_t modules = get_modules_count(rdram);

if (reg >= RDRAM_REGS_COUNT) {
return;
}

/* HACK: Detect when current Control calibration is about to start,
* so we can set corrupted rdram_dram handler
*/
Expand Down