Changeset a3b5831 in mainline


Ignore:
Timestamp:
2008-11-28T22:46:26Z (15 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8df7a1c
Parents:
78ee8b0
Message:

More work on the psycho driver.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/drivers/psycho.c

    r78ee8b0 ra3b5831  
    4141#include <arch/types.h>
    4242#include <genarch/ofw/ofw_tree.h>
     43#include <byteorder.h>
    4344
    44 #define PSYCHO_IGN              0x7c0
    45 #define PSYCHO_KEYBOARD_INR     0x29
     45#define PSYCHO_INTERNAL_REG     2
     46
     47#define PSYCHO_OBIO_IMR_BASE    (0x1000 / sizeof(uint64_t))
     48#define PSYCHO_OBIO_IMR(ino)    (PSYCHO_OBIO_IMR_BASE + ((ino) & INO_MASK))
     49
     50#define PSYCHO_OBIO_CIR_BASE    (0x1800 / sizeof(uint64_t))
     51#define PSYCHO_OBIO_CIR(ino)    (PSYCHO_OBIO_CIR_BASE + ((ino) & INO_MASK))
    4652
    4753psycho_t *psycho_a = NULL;
     
    5763        if (!prop || !prop->value)
    5864                return NULL;
     65       
     66        count_t regs = prop->size / sizeof(ofw_upa_reg_t);
     67        if (regs < PSYCHO_INTERNAL_REG + 1)
     68                return NULL;
    5969               
    60         ofw_upa_reg_t *reg = &((ofw_upa_reg_t *) prop->value)[0]; /* XXX */
     70        ofw_upa_reg_t *reg =
     71            &((ofw_upa_reg_t *) prop->value)[PSYCHO_INTERNAL_REG];
    6172
    6273        uintptr_t paddr;
     
    7586void psycho_enable_interrupt(psycho_t *psycho, int inr)
    7687{
    77         inr -= PSYCHO_IGN;
    78         switch (inr) {
    79         case PSYCHO_KEYBOARD_INR:
    80                 psycho->regs[0] = 1;    /* XXX */
    81                 break;
    82         default:
    83                 panic("Unexpected INR (%d)\n", inr);
    84                 break;
    85         }
     88        int ino = inr & ~IGN_MASK;
     89        uint64_t imr = psycho->regs[PSYCHO_OBIO_IMR(ino)];
     90        imr |= host2uint64_t_le(IMAP_V_MASK);
     91        psycho->regs[PSYCHO_OBIO_IMR(ino)] = imr;
    8692}
    8793
    8894void psycho_clear_interrupt(psycho_t *psycho, int inr)
    8995{
    90         inr -= PSYCHO_IGN;
    91         switch (inr) {
    92         case PSYCHO_KEYBOARD_INR:
    93                 psycho->regs[0] = 0;    /* XXX */
    94                 break;
    95         default:
    96                 panic("Unexpected INR (%d)\n", inr);
    97                 break;
    98         }
     96        int ino = inr & ~IGN_MASK;
     97        uint64_t idle = host2uint64_t_le(0);
     98        psycho->regs[PSYCHO_OBIO_CIR(ino)] = idle;
    9999}
    100100
Note: See TracChangeset for help on using the changeset viewer.