mirror of
https://github.com/dingusdev/dingusppc.git
synced 2024-11-17 15:08:08 +00:00
bandit: more config space registers.
This commit is contained in:
parent
24ccdabedc
commit
f6e208267e
@ -73,6 +73,11 @@ Bandit::Bandit(int bridge_num, std::string name, int dev_id, int rev)
|
|||||||
// that correspond to the 32MB assigned PCI address space of this Bandit.
|
// that correspond to the 32MB assigned PCI address space of this Bandit.
|
||||||
// This initialization is implied by the device functionality.
|
// This initialization is implied by the device functionality.
|
||||||
this->addr_mask = 3 << ((bridge_num & 3) * 2);
|
this->addr_mask = 3 << ((bridge_num & 3) * 2);
|
||||||
|
|
||||||
|
// initial PCI number + chip mode: big endian, interrupts & VGA space disabled
|
||||||
|
this->mode_ctrl = ((bridge_num & 3) << 2) | 3;
|
||||||
|
|
||||||
|
this->rd_hold_off_cnt = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Bandit::pci_cfg_read(uint32_t reg_offs, uint32_t size)
|
uint32_t Bandit::pci_cfg_read(uint32_t reg_offs, uint32_t size)
|
||||||
@ -84,6 +89,10 @@ uint32_t Bandit::pci_cfg_read(uint32_t reg_offs, uint32_t size)
|
|||||||
switch (reg_offs) {
|
switch (reg_offs) {
|
||||||
case BANDIT_ADDR_MASK:
|
case BANDIT_ADDR_MASK:
|
||||||
return BYTESWAP_32(this->addr_mask);
|
return BYTESWAP_32(this->addr_mask);
|
||||||
|
case BANDIT_MODE_SELECT:
|
||||||
|
return BYTESWAP_32(this->mode_ctrl);
|
||||||
|
case BANDIT_ARBUS_RD_HOLD_OFF:
|
||||||
|
return BYTESWAP_32(this->rd_hold_off_cnt);
|
||||||
default:
|
default:
|
||||||
LOG_F(WARNING, "%s: reading from unimplemented config register at 0x%X",
|
LOG_F(WARNING, "%s: reading from unimplemented config register at 0x%X",
|
||||||
this->pci_name.c_str(), reg_offs);
|
this->pci_name.c_str(), reg_offs);
|
||||||
@ -99,11 +108,24 @@ void Bandit::pci_cfg_write(uint32_t reg_offs, uint32_t value, uint32_t size)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (size == 4) {
|
||||||
|
value = BYTESWAP_32(value);
|
||||||
|
} else {
|
||||||
|
LOG_F(WARNING, "%s: non-DWORD writes to the control registers not supported",
|
||||||
|
this->pci_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
switch (reg_offs) {
|
switch (reg_offs) {
|
||||||
case BANDIT_ADDR_MASK:
|
case BANDIT_ADDR_MASK:
|
||||||
this->addr_mask = BYTESWAP_32(value);
|
this->addr_mask = value;
|
||||||
this->verbose_address_space();
|
this->verbose_address_space();
|
||||||
break;
|
break;
|
||||||
|
case BANDIT_MODE_SELECT:
|
||||||
|
this->mode_ctrl = value;
|
||||||
|
break;
|
||||||
|
case BANDIT_ARBUS_RD_HOLD_OFF:
|
||||||
|
this->rd_hold_off_cnt = value & 0x1F;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_F(WARNING, "%s: writing to unimplemented config register at 0x%X",
|
LOG_F(WARNING, "%s: writing to unimplemented config register at 0x%X",
|
||||||
this->pci_name.c_str(), reg_offs);
|
this->pci_name.c_str(), reg_offs);
|
||||||
@ -251,6 +273,10 @@ void Bandit::verbose_address_space()
|
|||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
int bit_pos;
|
int bit_pos;
|
||||||
|
|
||||||
|
if (!this->addr_mask) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LOG_F(INFO, "%s address spaces:", this->pci_name.c_str());
|
LOG_F(INFO, "%s address spaces:", this->pci_name.c_str());
|
||||||
|
|
||||||
// verbose coarse aka 256MB memory regions
|
// verbose coarse aka 256MB memory regions
|
||||||
|
@ -45,6 +45,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
/** Bandit specific configuration registers. */
|
/** Bandit specific configuration registers. */
|
||||||
enum {
|
enum {
|
||||||
BANDIT_ADDR_MASK = 0x48,
|
BANDIT_ADDR_MASK = 0x48,
|
||||||
|
BANDIT_MODE_SELECT = 0x50,
|
||||||
|
BANDIT_ARBUS_RD_HOLD_OFF = 0x58,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** checks if one bit is set at time, return 0 if not */
|
/** checks if one bit is set at time, return 0 if not */
|
||||||
@ -77,6 +79,8 @@ private:
|
|||||||
uint32_t base_addr;
|
uint32_t base_addr;
|
||||||
uint32_t config_addr;
|
uint32_t config_addr;
|
||||||
uint32_t addr_mask;
|
uint32_t addr_mask;
|
||||||
|
uint32_t mode_ctrl; // controls various chip modes/features
|
||||||
|
uint32_t rd_hold_off_cnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Chaos is a custom ARBus-to-PCI bridge that provides a specialized
|
/** Chaos is a custom ARBus-to-PCI bridge that provides a specialized
|
||||||
|
Loading…
Reference in New Issue
Block a user