mirror of https://github.com/xemu-project/xemu.git
hw/openpic.c: replace tabs by spaces
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
b4b784fe98
commit
060fbfe1d6
262
hw/openpic.c
262
hw/openpic.c
|
@ -219,20 +219,20 @@ typedef struct openpic_t {
|
||||||
int nb_cpus;
|
int nb_cpus;
|
||||||
/* Timer registers */
|
/* Timer registers */
|
||||||
struct {
|
struct {
|
||||||
uint32_t ticc; /* Global timer current count register */
|
uint32_t ticc; /* Global timer current count register */
|
||||||
uint32_t tibc; /* Global timer base count register */
|
uint32_t tibc; /* Global timer base count register */
|
||||||
} timers[MAX_TMR];
|
} timers[MAX_TMR];
|
||||||
#if MAX_DBL > 0
|
#if MAX_DBL > 0
|
||||||
/* Doorbell registers */
|
/* Doorbell registers */
|
||||||
uint32_t dar; /* Doorbell activate register */
|
uint32_t dar; /* Doorbell activate register */
|
||||||
struct {
|
struct {
|
||||||
uint32_t dmr; /* Doorbell messaging register */
|
uint32_t dmr; /* Doorbell messaging register */
|
||||||
} doorbells[MAX_DBL];
|
} doorbells[MAX_DBL];
|
||||||
#endif
|
#endif
|
||||||
#if MAX_MBX > 0
|
#if MAX_MBX > 0
|
||||||
/* Mailbox registers */
|
/* Mailbox registers */
|
||||||
struct {
|
struct {
|
||||||
uint32_t mbr; /* Mailbox register */
|
uint32_t mbr; /* Mailbox register */
|
||||||
} mailboxes[MAX_MAILBOXES];
|
} mailboxes[MAX_MAILBOXES];
|
||||||
#endif
|
#endif
|
||||||
/* IRQ out is used when in bypass mode (not implemented) */
|
/* IRQ out is used when in bypass mode (not implemented) */
|
||||||
|
@ -276,14 +276,14 @@ static void IRQ_check (openpic_t *opp, IRQ_queue_t *q)
|
||||||
next = -1;
|
next = -1;
|
||||||
priority = -1;
|
priority = -1;
|
||||||
for (i = 0; i < opp->max_irq; i++) {
|
for (i = 0; i < opp->max_irq; i++) {
|
||||||
if (IRQ_testbit(q, i)) {
|
if (IRQ_testbit(q, i)) {
|
||||||
DPRINTF("IRQ_check: irq %d set ipvp_pr=%d pr=%d\n",
|
DPRINTF("IRQ_check: irq %d set ipvp_pr=%d pr=%d\n",
|
||||||
i, IPVP_PRIORITY(opp->src[i].ipvp), priority);
|
i, IPVP_PRIORITY(opp->src[i].ipvp), priority);
|
||||||
if (IPVP_PRIORITY(opp->src[i].ipvp) > priority) {
|
if (IPVP_PRIORITY(opp->src[i].ipvp) > priority) {
|
||||||
next = i;
|
next = i;
|
||||||
priority = IPVP_PRIORITY(opp->src[i].ipvp);
|
priority = IPVP_PRIORITY(opp->src[i].ipvp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
q->next = next;
|
q->next = next;
|
||||||
q->priority = priority;
|
q->priority = priority;
|
||||||
|
@ -293,7 +293,7 @@ static int IRQ_get_next (openpic_t *opp, IRQ_queue_t *q)
|
||||||
{
|
{
|
||||||
if (q->next == -1) {
|
if (q->next == -1) {
|
||||||
/* XXX: optimize */
|
/* XXX: optimize */
|
||||||
IRQ_check(opp, q);
|
IRQ_check(opp, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
return q->next;
|
return q->next;
|
||||||
|
@ -309,16 +309,16 @@ static void IRQ_local_pipe (openpic_t *opp, int n_CPU, int n_IRQ)
|
||||||
src = &opp->src[n_IRQ];
|
src = &opp->src[n_IRQ];
|
||||||
priority = IPVP_PRIORITY(src->ipvp);
|
priority = IPVP_PRIORITY(src->ipvp);
|
||||||
if (priority <= dst->pctp) {
|
if (priority <= dst->pctp) {
|
||||||
/* Too low priority */
|
/* Too low priority */
|
||||||
DPRINTF("%s: IRQ %d has too low priority on CPU %d\n",
|
DPRINTF("%s: IRQ %d has too low priority on CPU %d\n",
|
||||||
__func__, n_IRQ, n_CPU);
|
__func__, n_IRQ, n_CPU);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (IRQ_testbit(&dst->raised, n_IRQ)) {
|
if (IRQ_testbit(&dst->raised, n_IRQ)) {
|
||||||
/* Interrupt miss */
|
/* Interrupt miss */
|
||||||
DPRINTF("%s: IRQ %d was missed on CPU %d\n",
|
DPRINTF("%s: IRQ %d was missed on CPU %d\n",
|
||||||
__func__, n_IRQ, n_CPU);
|
__func__, n_IRQ, n_CPU);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
set_bit(&src->ipvp, IPVP_ACTIVITY);
|
set_bit(&src->ipvp, IPVP_ACTIVITY);
|
||||||
IRQ_setbit(&dst->raised, n_IRQ);
|
IRQ_setbit(&dst->raised, n_IRQ);
|
||||||
|
@ -354,14 +354,14 @@ static void openpic_update_irq(openpic_t *opp, int n_IRQ)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (test_bit(&src->ipvp, IPVP_MASK)) {
|
if (test_bit(&src->ipvp, IPVP_MASK)) {
|
||||||
/* Interrupt source is disabled */
|
/* Interrupt source is disabled */
|
||||||
DPRINTF("%s: IRQ %d is disabled\n", __func__, n_IRQ);
|
DPRINTF("%s: IRQ %d is disabled\n", __func__, n_IRQ);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (IPVP_PRIORITY(src->ipvp) == 0) {
|
if (IPVP_PRIORITY(src->ipvp) == 0) {
|
||||||
/* Priority set to zero */
|
/* Priority set to zero */
|
||||||
DPRINTF("%s: IRQ %d has 0 priority\n", __func__, n_IRQ);
|
DPRINTF("%s: IRQ %d has 0 priority\n", __func__, n_IRQ);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (test_bit(&src->ipvp, IPVP_ACTIVITY)) {
|
if (test_bit(&src->ipvp, IPVP_ACTIVITY)) {
|
||||||
/* IRQ already active */
|
/* IRQ already active */
|
||||||
|
@ -369,9 +369,9 @@ static void openpic_update_irq(openpic_t *opp, int n_IRQ)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (src->ide == 0x00000000) {
|
if (src->ide == 0x00000000) {
|
||||||
/* No target */
|
/* No target */
|
||||||
DPRINTF("%s: IRQ %d has no target\n", __func__, n_IRQ);
|
DPRINTF("%s: IRQ %d has no target\n", __func__, n_IRQ);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src->ide == (1 << src->last_cpu)) {
|
if (src->ide == (1 << src->last_cpu)) {
|
||||||
|
@ -434,34 +434,34 @@ static void openpic_reset (void *opaque)
|
||||||
opp->micr = 0x00000000;
|
opp->micr = 0x00000000;
|
||||||
/* Initialise IRQ sources */
|
/* Initialise IRQ sources */
|
||||||
for (i = 0; i < opp->max_irq; i++) {
|
for (i = 0; i < opp->max_irq; i++) {
|
||||||
opp->src[i].ipvp = 0xA0000000;
|
opp->src[i].ipvp = 0xA0000000;
|
||||||
opp->src[i].ide = 0x00000000;
|
opp->src[i].ide = 0x00000000;
|
||||||
}
|
}
|
||||||
/* Initialise IRQ destinations */
|
/* Initialise IRQ destinations */
|
||||||
for (i = 0; i < MAX_CPU; i++) {
|
for (i = 0; i < MAX_CPU; i++) {
|
||||||
opp->dst[i].pctp = 0x0000000F;
|
opp->dst[i].pctp = 0x0000000F;
|
||||||
opp->dst[i].pcsr = 0x00000000;
|
opp->dst[i].pcsr = 0x00000000;
|
||||||
memset(&opp->dst[i].raised, 0, sizeof(IRQ_queue_t));
|
memset(&opp->dst[i].raised, 0, sizeof(IRQ_queue_t));
|
||||||
opp->dst[i].raised.next = -1;
|
opp->dst[i].raised.next = -1;
|
||||||
memset(&opp->dst[i].servicing, 0, sizeof(IRQ_queue_t));
|
memset(&opp->dst[i].servicing, 0, sizeof(IRQ_queue_t));
|
||||||
opp->dst[i].servicing.next = -1;
|
opp->dst[i].servicing.next = -1;
|
||||||
}
|
}
|
||||||
/* Initialise timers */
|
/* Initialise timers */
|
||||||
for (i = 0; i < MAX_TMR; i++) {
|
for (i = 0; i < MAX_TMR; i++) {
|
||||||
opp->timers[i].ticc = 0x00000000;
|
opp->timers[i].ticc = 0x00000000;
|
||||||
opp->timers[i].tibc = 0x80000000;
|
opp->timers[i].tibc = 0x80000000;
|
||||||
}
|
}
|
||||||
/* Initialise doorbells */
|
/* Initialise doorbells */
|
||||||
#if MAX_DBL > 0
|
#if MAX_DBL > 0
|
||||||
opp->dar = 0x00000000;
|
opp->dar = 0x00000000;
|
||||||
for (i = 0; i < MAX_DBL; i++) {
|
for (i = 0; i < MAX_DBL; i++) {
|
||||||
opp->doorbells[i].dmr = 0x00000000;
|
opp->doorbells[i].dmr = 0x00000000;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Initialise mailboxes */
|
/* Initialise mailboxes */
|
||||||
#if MAX_MBX > 0
|
#if MAX_MBX > 0
|
||||||
for (i = 0; i < MAX_MBX; i++) { /* ? */
|
for (i = 0; i < MAX_MBX; i++) { /* ? */
|
||||||
opp->mailboxes[i].mbr = 0x00000000;
|
opp->mailboxes[i].mbr = 0x00000000;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Go out of RESET state */
|
/* Go out of RESET state */
|
||||||
|
@ -474,11 +474,11 @@ static inline uint32_t read_IRQreg (openpic_t *opp, int n_IRQ, uint32_t reg)
|
||||||
|
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case IRQ_IPVP:
|
case IRQ_IPVP:
|
||||||
retval = opp->src[n_IRQ].ipvp;
|
retval = opp->src[n_IRQ].ipvp;
|
||||||
break;
|
break;
|
||||||
case IRQ_IDE:
|
case IRQ_IDE:
|
||||||
retval = opp->src[n_IRQ].ide;
|
retval = opp->src[n_IRQ].ide;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -494,95 +494,95 @@ static inline void write_IRQreg (openpic_t *opp, int n_IRQ,
|
||||||
/* NOTE: not fully accurate for special IRQs, but simple and
|
/* NOTE: not fully accurate for special IRQs, but simple and
|
||||||
sufficient */
|
sufficient */
|
||||||
/* ACTIVITY bit is read-only */
|
/* ACTIVITY bit is read-only */
|
||||||
opp->src[n_IRQ].ipvp =
|
opp->src[n_IRQ].ipvp =
|
||||||
(opp->src[n_IRQ].ipvp & 0x40000000) |
|
(opp->src[n_IRQ].ipvp & 0x40000000) |
|
||||||
(val & 0x800F00FF);
|
(val & 0x800F00FF);
|
||||||
openpic_update_irq(opp, n_IRQ);
|
openpic_update_irq(opp, n_IRQ);
|
||||||
DPRINTF("Set IPVP %d to 0x%08x -> 0x%08x\n",
|
DPRINTF("Set IPVP %d to 0x%08x -> 0x%08x\n",
|
||||||
n_IRQ, val, opp->src[n_IRQ].ipvp);
|
n_IRQ, val, opp->src[n_IRQ].ipvp);
|
||||||
break;
|
break;
|
||||||
case IRQ_IDE:
|
case IRQ_IDE:
|
||||||
tmp = val & 0xC0000000;
|
tmp = val & 0xC0000000;
|
||||||
tmp |= val & ((1 << MAX_CPU) - 1);
|
tmp |= val & ((1 << MAX_CPU) - 1);
|
||||||
opp->src[n_IRQ].ide = tmp;
|
opp->src[n_IRQ].ide = tmp;
|
||||||
DPRINTF("Set IDE %d to 0x%08x\n", n_IRQ, opp->src[n_IRQ].ide);
|
DPRINTF("Set IDE %d to 0x%08x\n", n_IRQ, opp->src[n_IRQ].ide);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // Code provision for Intel model
|
#if 0 // Code provision for Intel model
|
||||||
#if MAX_DBL > 0
|
#if MAX_DBL > 0
|
||||||
static uint32_t read_doorbell_register (openpic_t *opp,
|
static uint32_t read_doorbell_register (openpic_t *opp,
|
||||||
int n_dbl, uint32_t offset)
|
int n_dbl, uint32_t offset)
|
||||||
{
|
{
|
||||||
uint32_t retval;
|
uint32_t retval;
|
||||||
|
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case DBL_IPVP_OFFSET:
|
case DBL_IPVP_OFFSET:
|
||||||
retval = read_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IPVP);
|
retval = read_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IPVP);
|
||||||
break;
|
break;
|
||||||
case DBL_IDE_OFFSET:
|
case DBL_IDE_OFFSET:
|
||||||
retval = read_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IDE);
|
retval = read_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IDE);
|
||||||
break;
|
break;
|
||||||
case DBL_DMR_OFFSET:
|
case DBL_DMR_OFFSET:
|
||||||
retval = opp->doorbells[n_dbl].dmr;
|
retval = opp->doorbells[n_dbl].dmr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_doorbell_register (penpic_t *opp, int n_dbl,
|
static void write_doorbell_register (penpic_t *opp, int n_dbl,
|
||||||
uint32_t offset, uint32_t value)
|
uint32_t offset, uint32_t value)
|
||||||
{
|
{
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case DBL_IVPR_OFFSET:
|
case DBL_IVPR_OFFSET:
|
||||||
write_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IPVP, value);
|
write_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IPVP, value);
|
||||||
break;
|
break;
|
||||||
case DBL_IDE_OFFSET:
|
case DBL_IDE_OFFSET:
|
||||||
write_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IDE, value);
|
write_IRQreg(opp, IRQ_DBL0 + n_dbl, IRQ_IDE, value);
|
||||||
break;
|
break;
|
||||||
case DBL_DMR_OFFSET:
|
case DBL_DMR_OFFSET:
|
||||||
opp->doorbells[n_dbl].dmr = value;
|
opp->doorbells[n_dbl].dmr = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MAX_MBX > 0
|
#if MAX_MBX > 0
|
||||||
static uint32_t read_mailbox_register (openpic_t *opp,
|
static uint32_t read_mailbox_register (openpic_t *opp,
|
||||||
int n_mbx, uint32_t offset)
|
int n_mbx, uint32_t offset)
|
||||||
{
|
{
|
||||||
uint32_t retval;
|
uint32_t retval;
|
||||||
|
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case MBX_MBR_OFFSET:
|
case MBX_MBR_OFFSET:
|
||||||
retval = opp->mailboxes[n_mbx].mbr;
|
retval = opp->mailboxes[n_mbx].mbr;
|
||||||
break;
|
break;
|
||||||
case MBX_IVPR_OFFSET:
|
case MBX_IVPR_OFFSET:
|
||||||
retval = read_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IPVP);
|
retval = read_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IPVP);
|
||||||
break;
|
break;
|
||||||
case MBX_DMR_OFFSET:
|
case MBX_DMR_OFFSET:
|
||||||
retval = read_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IDE);
|
retval = read_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IDE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_mailbox_register (openpic_t *opp, int n_mbx,
|
static void write_mailbox_register (openpic_t *opp, int n_mbx,
|
||||||
uint32_t address, uint32_t value)
|
uint32_t address, uint32_t value)
|
||||||
{
|
{
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case MBX_MBR_OFFSET:
|
case MBX_MBR_OFFSET:
|
||||||
opp->mailboxes[n_mbx].mbr = value;
|
opp->mailboxes[n_mbx].mbr = value;
|
||||||
break;
|
break;
|
||||||
case MBX_IVPR_OFFSET:
|
case MBX_IVPR_OFFSET:
|
||||||
write_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IPVP, value);
|
write_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IPVP, value);
|
||||||
break;
|
break;
|
||||||
case MBX_DMR_OFFSET:
|
case MBX_DMR_OFFSET:
|
||||||
write_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IDE, value);
|
write_IRQreg(opp, IRQ_MBX0 + n_mbx, IRQ_IDE, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -608,9 +608,9 @@ static void openpic_gbl_write (void *opaque, target_phys_addr_t addr, uint32_t v
|
||||||
if (val & 0x80000000 && opp->reset)
|
if (val & 0x80000000 && opp->reset)
|
||||||
opp->reset(opp);
|
opp->reset(opp);
|
||||||
opp->glbc = val & ~0x80000000;
|
opp->glbc = val & ~0x80000000;
|
||||||
break;
|
break;
|
||||||
case 0x80: /* VENI */
|
case 0x80: /* VENI */
|
||||||
break;
|
break;
|
||||||
case 0x90: /* PINT */
|
case 0x90: /* PINT */
|
||||||
for (idx = 0; idx < opp->nb_cpus; idx++) {
|
for (idx = 0; idx < opp->nb_cpus; idx++) {
|
||||||
if ((val & (1 << idx)) && !(opp->pint & (1 << idx))) {
|
if ((val & (1 << idx)) && !(opp->pint & (1 << idx))) {
|
||||||
|
@ -624,7 +624,7 @@ static void openpic_gbl_write (void *opaque, target_phys_addr_t addr, uint32_t v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
opp->pint = val;
|
opp->pint = val;
|
||||||
break;
|
break;
|
||||||
#if MAX_IPI > 0
|
#if MAX_IPI > 0
|
||||||
case 0xA0: /* IPI_IPVP */
|
case 0xA0: /* IPI_IPVP */
|
||||||
case 0xB0:
|
case 0xB0:
|
||||||
|
@ -642,7 +642,7 @@ static void openpic_gbl_write (void *opaque, target_phys_addr_t addr, uint32_t v
|
||||||
break;
|
break;
|
||||||
case 0xF0: /* TIFR */
|
case 0xF0: /* TIFR */
|
||||||
opp->tifr = val;
|
opp->tifr = val;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -664,13 +664,13 @@ static uint32_t openpic_gbl_read (void *opaque, target_phys_addr_t addr)
|
||||||
break;
|
break;
|
||||||
case 0x20: /* GLBC */
|
case 0x20: /* GLBC */
|
||||||
retval = opp->glbc;
|
retval = opp->glbc;
|
||||||
break;
|
break;
|
||||||
case 0x80: /* VENI */
|
case 0x80: /* VENI */
|
||||||
retval = opp->veni;
|
retval = opp->veni;
|
||||||
break;
|
break;
|
||||||
case 0x90: /* PINT */
|
case 0x90: /* PINT */
|
||||||
retval = 0x00000000;
|
retval = 0x00000000;
|
||||||
break;
|
break;
|
||||||
#if MAX_IPI > 0
|
#if MAX_IPI > 0
|
||||||
case 0xA0: /* IPI_IPVP */
|
case 0xA0: /* IPI_IPVP */
|
||||||
case 0xB0:
|
case 0xB0:
|
||||||
|
@ -681,14 +681,14 @@ static uint32_t openpic_gbl_read (void *opaque, target_phys_addr_t addr)
|
||||||
idx = (addr - 0xA0) >> 4;
|
idx = (addr - 0xA0) >> 4;
|
||||||
retval = read_IRQreg(opp, opp->irq_ipi0 + idx, IRQ_IPVP);
|
retval = read_IRQreg(opp, opp->irq_ipi0 + idx, IRQ_IPVP);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 0xE0: /* SPVE */
|
case 0xE0: /* SPVE */
|
||||||
retval = opp->spve;
|
retval = opp->spve;
|
||||||
break;
|
break;
|
||||||
case 0xF0: /* TIFR */
|
case 0xF0: /* TIFR */
|
||||||
retval = opp->tifr;
|
retval = opp->tifr;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -719,18 +719,18 @@ static void openpic_timer_write (void *opaque, uint32_t addr, uint32_t val)
|
||||||
case 0x00: /* TICC */
|
case 0x00: /* TICC */
|
||||||
break;
|
break;
|
||||||
case 0x10: /* TIBC */
|
case 0x10: /* TIBC */
|
||||||
if ((opp->timers[idx].ticc & 0x80000000) != 0 &&
|
if ((opp->timers[idx].ticc & 0x80000000) != 0 &&
|
||||||
(val & 0x80000000) == 0 &&
|
(val & 0x80000000) == 0 &&
|
||||||
(opp->timers[idx].tibc & 0x80000000) != 0)
|
(opp->timers[idx].tibc & 0x80000000) != 0)
|
||||||
opp->timers[idx].ticc &= ~0x80000000;
|
opp->timers[idx].ticc &= ~0x80000000;
|
||||||
opp->timers[idx].tibc = val;
|
opp->timers[idx].tibc = val;
|
||||||
break;
|
break;
|
||||||
case 0x20: /* TIVP */
|
case 0x20: /* TIVP */
|
||||||
write_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IPVP, val);
|
write_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IPVP, val);
|
||||||
break;
|
break;
|
||||||
case 0x30: /* TIDE */
|
case 0x30: /* TIDE */
|
||||||
write_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IDE, val);
|
write_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IDE, val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -750,17 +750,17 @@ static uint32_t openpic_timer_read (void *opaque, uint32_t addr)
|
||||||
addr = addr & 0x30;
|
addr = addr & 0x30;
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x00: /* TICC */
|
case 0x00: /* TICC */
|
||||||
retval = opp->timers[idx].ticc;
|
retval = opp->timers[idx].ticc;
|
||||||
break;
|
break;
|
||||||
case 0x10: /* TIBC */
|
case 0x10: /* TIBC */
|
||||||
retval = opp->timers[idx].tibc;
|
retval = opp->timers[idx].tibc;
|
||||||
break;
|
break;
|
||||||
case 0x20: /* TIPV */
|
case 0x20: /* TIPV */
|
||||||
retval = read_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IPVP);
|
retval = read_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IPVP);
|
||||||
break;
|
break;
|
||||||
case 0x30: /* TIDE */
|
case 0x30: /* TIDE */
|
||||||
retval = read_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IDE);
|
retval = read_IRQreg(opp, opp->irq_tim0 + idx, IRQ_IDE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DPRINTF("%s: => %08x\n", __func__, retval);
|
DPRINTF("%s: => %08x\n", __func__, retval);
|
||||||
#if defined TARGET_WORDS_BIGENDIAN
|
#if defined TARGET_WORDS_BIGENDIAN
|
||||||
|
@ -849,21 +849,21 @@ static void openpic_cpu_write (void *opaque, target_phys_addr_t addr, uint32_t v
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 0x80: /* PCTP */
|
case 0x80: /* PCTP */
|
||||||
dst->pctp = val & 0x0000000F;
|
dst->pctp = val & 0x0000000F;
|
||||||
break;
|
break;
|
||||||
case 0x90: /* WHOAMI */
|
case 0x90: /* WHOAMI */
|
||||||
/* Read-only register */
|
/* Read-only register */
|
||||||
break;
|
break;
|
||||||
case 0xA0: /* PIAC */
|
case 0xA0: /* PIAC */
|
||||||
/* Read-only register */
|
/* Read-only register */
|
||||||
break;
|
break;
|
||||||
case 0xB0: /* PEOI */
|
case 0xB0: /* PEOI */
|
||||||
DPRINTF("PEOI\n");
|
DPRINTF("PEOI\n");
|
||||||
s_IRQ = IRQ_get_next(opp, &dst->servicing);
|
s_IRQ = IRQ_get_next(opp, &dst->servicing);
|
||||||
IRQ_resetbit(&dst->servicing, s_IRQ);
|
IRQ_resetbit(&dst->servicing, s_IRQ);
|
||||||
dst->servicing.next = -1;
|
dst->servicing.next = -1;
|
||||||
/* Set up next servicing IRQ */
|
/* Set up next servicing IRQ */
|
||||||
s_IRQ = IRQ_get_next(opp, &dst->servicing);
|
s_IRQ = IRQ_get_next(opp, &dst->servicing);
|
||||||
/* Check queued interrupts. */
|
/* Check queued interrupts. */
|
||||||
n_IRQ = IRQ_get_next(opp, &dst->raised);
|
n_IRQ = IRQ_get_next(opp, &dst->raised);
|
||||||
src = &opp->src[n_IRQ];
|
src = &opp->src[n_IRQ];
|
||||||
|
@ -874,7 +874,7 @@ static void openpic_cpu_write (void *opaque, target_phys_addr_t addr, uint32_t v
|
||||||
idx, n_IRQ);
|
idx, n_IRQ);
|
||||||
opp->irq_raise(opp, idx, src);
|
opp->irq_raise(opp, idx, src);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -898,46 +898,46 @@ static uint32_t openpic_cpu_read (void *opaque, target_phys_addr_t addr)
|
||||||
addr &= 0xFF0;
|
addr &= 0xFF0;
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x80: /* PCTP */
|
case 0x80: /* PCTP */
|
||||||
retval = dst->pctp;
|
retval = dst->pctp;
|
||||||
break;
|
break;
|
||||||
case 0x90: /* WHOAMI */
|
case 0x90: /* WHOAMI */
|
||||||
retval = idx;
|
retval = idx;
|
||||||
break;
|
break;
|
||||||
case 0xA0: /* PIAC */
|
case 0xA0: /* PIAC */
|
||||||
DPRINTF("Lower OpenPIC INT output\n");
|
DPRINTF("Lower OpenPIC INT output\n");
|
||||||
qemu_irq_lower(dst->irqs[OPENPIC_OUTPUT_INT]);
|
qemu_irq_lower(dst->irqs[OPENPIC_OUTPUT_INT]);
|
||||||
n_IRQ = IRQ_get_next(opp, &dst->raised);
|
n_IRQ = IRQ_get_next(opp, &dst->raised);
|
||||||
DPRINTF("PIAC: irq=%d\n", n_IRQ);
|
DPRINTF("PIAC: irq=%d\n", n_IRQ);
|
||||||
if (n_IRQ == -1) {
|
if (n_IRQ == -1) {
|
||||||
/* No more interrupt pending */
|
/* No more interrupt pending */
|
||||||
retval = IPVP_VECTOR(opp->spve);
|
retval = IPVP_VECTOR(opp->spve);
|
||||||
} else {
|
} else {
|
||||||
src = &opp->src[n_IRQ];
|
src = &opp->src[n_IRQ];
|
||||||
if (!test_bit(&src->ipvp, IPVP_ACTIVITY) ||
|
if (!test_bit(&src->ipvp, IPVP_ACTIVITY) ||
|
||||||
!(IPVP_PRIORITY(src->ipvp) > dst->pctp)) {
|
!(IPVP_PRIORITY(src->ipvp) > dst->pctp)) {
|
||||||
/* - Spurious level-sensitive IRQ
|
/* - Spurious level-sensitive IRQ
|
||||||
* - Priorities has been changed
|
* - Priorities has been changed
|
||||||
* and the pending IRQ isn't allowed anymore
|
* and the pending IRQ isn't allowed anymore
|
||||||
*/
|
*/
|
||||||
reset_bit(&src->ipvp, IPVP_ACTIVITY);
|
reset_bit(&src->ipvp, IPVP_ACTIVITY);
|
||||||
retval = IPVP_VECTOR(opp->spve);
|
retval = IPVP_VECTOR(opp->spve);
|
||||||
} else {
|
} else {
|
||||||
/* IRQ enter servicing state */
|
/* IRQ enter servicing state */
|
||||||
IRQ_setbit(&dst->servicing, n_IRQ);
|
IRQ_setbit(&dst->servicing, n_IRQ);
|
||||||
retval = IPVP_VECTOR(src->ipvp);
|
retval = IPVP_VECTOR(src->ipvp);
|
||||||
}
|
}
|
||||||
IRQ_resetbit(&dst->raised, n_IRQ);
|
IRQ_resetbit(&dst->raised, n_IRQ);
|
||||||
dst->raised.next = -1;
|
dst->raised.next = -1;
|
||||||
if (!test_bit(&src->ipvp, IPVP_SENSE)) {
|
if (!test_bit(&src->ipvp, IPVP_SENSE)) {
|
||||||
/* edge-sensitive IRQ */
|
/* edge-sensitive IRQ */
|
||||||
reset_bit(&src->ipvp, IPVP_ACTIVITY);
|
reset_bit(&src->ipvp, IPVP_ACTIVITY);
|
||||||
src->pending = 0;
|
src->pending = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0xB0: /* PEOI */
|
case 0xB0: /* PEOI */
|
||||||
retval = 0;
|
retval = 0;
|
||||||
break;
|
break;
|
||||||
#if MAX_IPI > 0
|
#if MAX_IPI > 0
|
||||||
case 0x40: /* IDE */
|
case 0x40: /* IDE */
|
||||||
case 0x50:
|
case 0x50:
|
||||||
|
|
Loading…
Reference in New Issue