mesh: improve exception register emulation.

This commit is contained in:
Maxim Poliakovski 2024-04-21 22:56:08 +02:00
parent e722ef3e8a
commit 3aad040f28
2 changed files with 14 additions and 18 deletions

View File

@ -33,8 +33,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
using namespace MeshScsi;
int MeshController::device_postinit()
{
int MeshController::device_postinit() {
this->bus_obj = dynamic_cast<ScsiBus*>(gMachineObj->get_comp_by_name("ScsiMesh"));
this->int_ctrl = dynamic_cast<InterruptCtrl*>(
@ -44,11 +43,11 @@ int MeshController::device_postinit()
return 0;
}
void MeshController::reset(bool is_hard_reset)
{
void MeshController::reset(bool is_hard_reset) {
this->cur_cmd = SeqCmd::NoOperation;
this->fifo_cnt = 0;
this->int_mask = 0;
this->exception = 0;
this->xfer_count = 0;
this->src_id = 7;
@ -58,8 +57,7 @@ void MeshController::reset(bool is_hard_reset)
}
}
uint8_t MeshController::read(uint8_t reg_offset)
{
uint8_t MeshController::read(uint8_t reg_offset) {
switch(reg_offset) {
case MeshReg::XferCount0:
return this->xfer_count & 0xFFU;
@ -74,7 +72,7 @@ uint8_t MeshController::read(uint8_t reg_offset)
case MeshReg::FIFOCount:
return this->fifo_cnt;
case MeshReg::Exception:
return 0;
return this->exception;
case MeshReg::Error:
return 0;
case MeshReg::IntMask:
@ -94,8 +92,7 @@ uint8_t MeshController::read(uint8_t reg_offset)
return 0;
}
void MeshController::write(uint8_t reg_offset, uint8_t value)
{
void MeshController::write(uint8_t reg_offset, uint8_t value) {
uint16_t new_stat;
switch(reg_offset) {
@ -141,19 +138,20 @@ void MeshController::write(uint8_t reg_offset, uint8_t value)
}
}
void MeshController::perform_command(const uint8_t cmd)
{
void MeshController::perform_command(const uint8_t cmd) {
this->cur_cmd = cmd;
this->int_stat &= ~INT_CMD_DONE;
switch (this->cur_cmd & 0xF) {
case SeqCmd::Arbitrate:
this->exception &= EXC_ARB_LOST;
this->bus_obj->release_ctrl_lines(this->src_id);
this->cur_state = SeqState::BUS_FREE;
this->sequencer();
break;
case SeqCmd::Select:
this->exception &= EXC_SEL_TIMEOUT;
this->cur_state = SeqState::SEL_BEGIN;
this->sequencer();
break;
@ -162,7 +160,7 @@ void MeshController::perform_command(const uint8_t cmd)
this->int_stat |= INT_CMD_DONE;
break;
case SeqCmd::EnaReselect:
LOG_F(INFO, "MESH: EnaReselect stub invoked");
LOG_F(9, "MESH: EnaReselect stub invoked");
this->int_stat |= INT_CMD_DONE;
break;
case SeqCmd::DisReselect:
@ -182,8 +180,7 @@ void MeshController::perform_command(const uint8_t cmd)
}
}
void MeshController::seq_defer_state(uint64_t delay_ns)
{
void MeshController::seq_defer_state(uint64_t delay_ns) {
seq_timer_id = TimerManager::get_instance()->add_oneshot_timer(
delay_ns,
[this]() {
@ -254,8 +251,7 @@ void MeshController::sequencer()
}
}
void MeshController::update_irq()
{
void MeshController::update_irq() {
uint8_t new_irq = !!(this->int_stat & this->int_mask);
if (new_irq != this->irq) {
this->irq = new_irq;

View File

@ -157,7 +157,7 @@ protected:
private:
uint8_t chip_id;
uint8_t int_mask;
uint8_t int_mask = 0;
uint8_t int_stat = 0;
uint8_t sync_params;
uint8_t src_id;
@ -165,7 +165,7 @@ private:
uint8_t cur_cmd;
uint8_t error;
uint8_t fifo_cnt;
uint8_t exception;
uint8_t exception = 0;
uint32_t xfer_count;
ScsiBus* bus_obj;