Annotation of qemu/roms/SLOF/board-js2x/rtas/rtas_pci.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:  * Copyright (c) 2004, 2008 IBM Corporation
                      3:  * All rights reserved.
                      4:  * This program and the accompanying materials
                      5:  * are made available under the terms of the BSD License
                      6:  * which accompanies this distribution, and is available at
                      7:  * http://www.opensource.org/licenses/bsd-license.php
                      8:  *
                      9:  * Contributors:
                     10:  *     IBM Corporation - initial implementation
                     11:  *****************************************************************************/
                     12: #include <stdint.h>
                     13: #include <rtas.h>
                     14: #include <hw.h>
                     15: 
                     16: int
                     17: rtas_ibm_read_pci_config (rtas_args_t *rtas_args) {
                     18:        int retVal = 0;
                     19:        uint64_t addr = ((uint64_t) rtas_args->args[1]) << 32;  // high 32 bits of PHB UID
                     20:        addr |= (rtas_args->args[2] & 0xFFFFFFFF); // low 32 bits of PHB UID
                     21:        addr |= (rtas_args->args[0] & 0x00FFFFFF); // bus, devfn, offset
                     22:        unsigned int size = rtas_args->args[3];
                     23: 
                     24:        /* Check for bus != 0  on PCI/PCI-X (PHB UID = 0xf2000000) */
                     25:        if (((addr & 0xf2000000) == 0xf2000000) && (addr & 0xff0000))
                     26:                addr += 0x1000000;
                     27: 
                     28:        if (size == 1)
                     29:                rtas_args->args[5] = load8_ci(addr);
                     30:        else if (size == 2)
                     31:                rtas_args->args[5] = bswap16_load(addr);
                     32:        else if (size == 4)
                     33:                rtas_args->args[5] = bswap32_load(addr);
                     34:        else
                     35:                retVal = -3;  /* Bad arguments */
                     36: 
                     37:        return retVal;
                     38: }
                     39: 
                     40: int
                     41: rtas_ibm_write_pci_config (rtas_args_t *rtas_args) {
                     42:        int retVal = 0;
                     43:        uint64_t addr = ((uint64_t) rtas_args->args[1]) << 32;  // high 32 bits of PHB UID
                     44:        addr |= (rtas_args->args[2] & 0xFFFFFFFF); // low 32 bits of PHB UID
                     45:        addr |= (rtas_args->args[0] & 0x00FFFFFF); // bus, devfn, offset
                     46:        unsigned int size = rtas_args->args[3];
                     47: 
                     48:        addr |= 0xf2000000;
                     49: 
                     50:        /* Check for bus != 0  on PCI/PCI-X (PHB UID = 0xf2000000) */
                     51:        if (((addr & 0xf2000000) == 0xf2000000) && (addr & 0xff0000))
                     52:                addr += 0x1000000;
                     53: 
                     54:        if (size == 1)
                     55:                store8_ci(addr, rtas_args->args[4]);
                     56:        else if (size == 2)
                     57:                bswap16_store(addr, rtas_args->args[4]);
                     58:        else if (size == 4)
                     59:                bswap32_store(addr, rtas_args->args[4]);
                     60:        else
                     61:                retVal = -3;  /* Bad arguments */
                     62: 
                     63:        return retVal;
                     64: }
                     65: 
                     66: int
                     67: rtas_read_pci_config (rtas_args_t *rtas_args) {
                     68:        int retVal = 0;
                     69:        unsigned long addr = rtas_args->args[0];
                     70:        unsigned int size = rtas_args->args[1];
                     71:        addr |= 0xf2000000;
                     72: 
                     73:        /* Check for bus != 0 */
                     74:        if (addr & 0xff0000)
                     75:                addr += 0x1000000;
                     76: 
                     77:        if (size == 1)
                     78:                rtas_args->args[3] = load8_ci(addr);
                     79:        else if (size == 2)
                     80:                rtas_args->args[3] = bswap16_load(addr);
                     81:        else if (size == 4)
                     82:                rtas_args->args[3] = bswap32_load(addr);
                     83:        else
                     84:                retVal = -3;  /* Bad arguments */
                     85: 
                     86:        return retVal;
                     87: }
                     88: 
                     89: int
                     90: rtas_write_pci_config (rtas_args_t *rtas_args) {
                     91:        int retVal = 0;
                     92:        unsigned long addr = rtas_args->args[0];
                     93:        unsigned int size = rtas_args->args[1];
                     94: 
                     95:        addr |= 0xf2000000;
                     96: 
                     97:        /* Check for bus != 0 */
                     98:        if (addr & 0xff0000)
                     99:                addr += 0x1000000;
                    100: 
                    101:        if (size == 1)
                    102:                store8_ci(addr, rtas_args->args[2]);
                    103:        else if (size == 2)
                    104:                bswap16_store(addr, rtas_args->args[2]);
                    105:        else if (size == 4)
                    106:                bswap32_store(addr, rtas_args->args[2]);
                    107:        else
                    108:                retVal = -3;  /* Bad arguments */
                    109: 
                    110:        return retVal;
                    111: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.