Changeset d4f184f in mainline


Ignore:
Timestamp:
2006-11-19T20:04:29Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3783d7d
Parents:
be544ef
Message:

sparc64 work:

  • untested support for Psycho PCI controller
Location:
kernel/arch/sparc64
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/include/drivers/pci.h

    rbe544ef rd4f184f  
    4747enum pci_model {
    4848        PCI_UNKNOWN,
    49         PCI_SABRE
     49        PCI_SABRE,
     50        PCI_PSYCHO
    5051};
    5152
  • kernel/arch/sparc64/src/drivers/pci.c

    rbe544ef rd4f184f  
    5252#define PCI_SABRE_ICLR_BASE     0x300
    5353
     54#define PCI_PSYCHO_REGS_REG     2       
     55
     56#define PCI_PSYCHO_IMAP_BASE    0x200
     57#define PCI_PSYCHO_ICLR_BASE    0x300   
     58
    5459static pci_t *pci_sabre_init(ofw_tree_node_t *node);
    5560static void pci_sabre_enable_interrupt(pci_t *pci, int inr);
    5661static void pci_sabre_clear_interrupt(pci_t *pci, int inr);
     62
     63static pci_t *pci_psycho_init(ofw_tree_node_t *node);
     64static void pci_psycho_enable_interrupt(pci_t *pci, int inr);
     65static void pci_psycho_clear_interrupt(pci_t *pci, int inr);
    5766
    5867/** PCI operations for Sabre model. */
     
    6170        .clear_interrupt = pci_sabre_clear_interrupt
    6271};
    63 
    64 /** Initialize PCI controller (model Sabre). */
     72/** PCI operations for Psycho model. */
     73static pci_operations_t pci_psycho_ops = {
     74        .enable_interrupt = pci_psycho_enable_interrupt,
     75        .clear_interrupt = pci_psycho_clear_interrupt
     76};
     77
     78/** Initialize PCI controller (model Sabre).
     79 *
     80 * @param node OpenFirmware device tree node of the Sabre.
     81 *
     82 * @return Address of the initialized PCI structure.
     83 */
    6584pci_t *pci_sabre_init(ofw_tree_node_t *node)
    6685{
     
    96115}
    97116
     117
     118/** Initialize the Psycho PCI controller.
     119 *
     120 * @param node OpenFirmware device tree node of the Psycho.
     121 *
     122 * @return Address of the initialized PCI structure.
     123 */
     124pci_t *pci_psycho_init(ofw_tree_node_t *node)
     125{
     126        pci_t *pci;
     127        ofw_tree_property_t *prop;
     128
     129        /*
     130         * Get registers.
     131         */
     132        prop = ofw_tree_getprop(node, "reg");
     133        if (!prop || !prop->value)
     134                return NULL;
     135
     136        ofw_upa_reg_t *reg = prop->value;
     137        count_t regs = prop->size / sizeof(ofw_upa_reg_t);
     138
     139        if (regs < PCI_PSYCHO_REGS_REG + 1)
     140                return NULL;
     141
     142        uintptr_t paddr;
     143        if (!ofw_upa_apply_ranges(node->parent, &reg[PCI_PSYCHO_REGS_REG], &paddr))
     144                return NULL;
     145
     146        pci = (pci_t *) malloc(sizeof(pci_t), FRAME_ATOMIC);
     147        if (!pci)
     148                return NULL;
     149
     150        pci->model = PCI_PSYCHO;
     151        pci->op = &pci_psycho_ops;
     152        pci->reg = (uint64_t *) hw_map(paddr, reg[PCI_PSYCHO_REGS_REG].size);
     153
     154        return pci;
     155}
     156
    98157void pci_sabre_enable_interrupt(pci_t *pci, int inr)
    99158{
     
    104163{
    105164        pci->reg[PCI_SABRE_ICLR_BASE + (inr & INO_MASK)] = 0;
     165}
     166
     167void pci_psycho_enable_interrupt(pci_t *pci, int inr)
     168{
     169        pci->reg[PCI_PSYCHO_IMAP_BASE + (inr & INO_MASK)] |= IMAP_V_MASK;
     170}
     171
     172void pci_psycho_clear_interrupt(pci_t *pci, int inr)
     173{
     174        pci->reg[PCI_PSYCHO_ICLR_BASE + (inr & INO_MASK)] = 0;
    106175}
    107176
     
    129198                 */
    130199                return pci_sabre_init(node);
     200        } else if (strcmp(prop->value, "SUNW,psycho") == 0) {
     201                /*
     202                 * PCI controller Psycho.
     203                 * Used on UltraSPARC II based processors, for instance,
     204                 * on Ultra 60.
     205                 */
     206                return pci_psycho_init(node);
    131207        } else {
    132208                /*
Note: See TracChangeset for help on using the changeset viewer.