[BACK]Return to pci_swiz_bus_mem_chipdep.c CVS log [TXT][DIR] Up to [local] / sys / arch / alpha / pci

Annotation of sys/arch/alpha/pci/pci_swiz_bus_mem_chipdep.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: pci_swiz_bus_mem_chipdep.c,v 1.4 2007/03/16 21:22:27 robert Exp $     */
                      2: /*     $NetBSD: pcs_bus_mem_common.c,v 1.15 1996/12/02 22:19:36 cgd Exp $      */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995, 1996 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Chris G. Demetriou
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31: /*
                     32:  * Common PCI Chipset "bus I/O" functions, for chipsets which have to
                     33:  * deal with only a single PCI interface chip in a machine.
                     34:  *
                     35:  * uses:
                     36:  *     CHIP            name of the 'chip' it's being compiled for.
                     37:  *     CHIP_D_MEM_BASE Dense Mem space base to use.
                     38:  *     CHIP_S_MEM_BASE Sparse Mem space base to use.
                     39:  */
                     40:
                     41: #include <sys/extent.h>
                     42:
                     43: #define        __C(A,B)        __CONCAT(A,B)
                     44: #define        __S(S)          __STRING(S)
                     45:
                     46: #ifndef        CHIP_EXTENT_DNAME
                     47: #define        CHIP_EXTENT_DNAME(v)    __S(__C(CHIP,_bus_dmem))
                     48: #endif
                     49: #ifndef CHIP_EXTENT_SNAME
                     50: #define CHIP_EXTENT_SNAME(v)   __S(__C(CHIP,_bus_smem))
                     51: #endif
                     52:
                     53: #ifndef        CHIP_EXTENT_DSTORAGE
                     54: #define CHIP_EXTENT_DSTORAGE(v)        __C(CHIP,_dmem_ex_storage)
                     55: static long
                     56:     __C(CHIP,_dmem_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
                     57: #endif
                     58: #ifndef CHIP_EXTENT_SSTORAGE
                     59: #define CHIP_EXTENT_SSTORAGE(v)        __C(CHIP,_smem_ex_storage)
                     60: static long
                     61:     __C(CHIP,_smem_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
                     62:
                     63: #endif
                     64:
                     65: /* mapping/unmapping */
                     66: int            __C(CHIP,_mem_map)(void *, bus_addr_t, bus_size_t, int,
                     67:                    bus_space_handle_t *);
                     68: void           __C(CHIP,_mem_unmap)(void *, bus_space_handle_t,
                     69:                    bus_size_t);
                     70: int            __C(CHIP,_mem_subregion)(void *, bus_space_handle_t,
                     71:                    bus_size_t, bus_size_t, bus_space_handle_t *);
                     72:
                     73: /* allocation/deallocation */
                     74: int            __C(CHIP,_mem_alloc)(void *, bus_addr_t, bus_addr_t,
                     75:                    bus_size_t, bus_size_t, bus_addr_t, int, bus_addr_t *,
                     76:                     bus_space_handle_t *);
                     77: void           __C(CHIP,_mem_free)(void *, bus_space_handle_t,
                     78:                    bus_size_t);
                     79:
                     80: /* barrier */
                     81: inline void    __C(CHIP,_mem_barrier)(void *, bus_space_handle_t,
                     82:                    bus_size_t, bus_size_t, int);
                     83:
                     84: /* read (single) */
                     85: inline u_int8_t        __C(CHIP,_mem_read_1)(void *, bus_space_handle_t,
                     86:                    bus_size_t);
                     87: inline u_int16_t __C(CHIP,_mem_read_2)(void *, bus_space_handle_t,
                     88:                    bus_size_t);
                     89: inline u_int32_t __C(CHIP,_mem_read_4)(void *, bus_space_handle_t,
                     90:                    bus_size_t);
                     91: inline u_int64_t __C(CHIP,_mem_read_8)(void *, bus_space_handle_t,
                     92:                    bus_size_t);
                     93:
                     94: /* read multiple */
                     95: void           __C(CHIP,_mem_read_multi_1)(void *, bus_space_handle_t,
                     96:                    bus_size_t, u_int8_t *, bus_size_t);
                     97: void           __C(CHIP,_mem_read_multi_2)(void *, bus_space_handle_t,
                     98:                    bus_size_t, u_int16_t *, bus_size_t);
                     99: void           __C(CHIP,_mem_read_multi_4)(void *, bus_space_handle_t,
                    100:                    bus_size_t, u_int32_t *, bus_size_t);
                    101: void           __C(CHIP,_mem_read_multi_8)(void *, bus_space_handle_t,
                    102:                    bus_size_t, u_int64_t *, bus_size_t);
                    103:
                    104: /* read region */
                    105: void           __C(CHIP,_mem_read_region_1)(void *, bus_space_handle_t,
                    106:                    bus_size_t, u_int8_t *, bus_size_t);
                    107: void           __C(CHIP,_mem_read_region_2)(void *, bus_space_handle_t,
                    108:                    bus_size_t, u_int16_t *, bus_size_t);
                    109: void           __C(CHIP,_mem_read_region_4)(void *, bus_space_handle_t,
                    110:                    bus_size_t, u_int32_t *, bus_size_t);
                    111: void           __C(CHIP,_mem_read_region_8)(void *, bus_space_handle_t,
                    112:                    bus_size_t, u_int64_t *, bus_size_t);
                    113:
                    114: /* write (single) */
                    115: inline void    __C(CHIP,_mem_write_1)(void *, bus_space_handle_t,
                    116:                    bus_size_t, u_int8_t);
                    117: inline void    __C(CHIP,_mem_write_2)(void *, bus_space_handle_t,
                    118:                    bus_size_t, u_int16_t);
                    119: inline void    __C(CHIP,_mem_write_4)(void *, bus_space_handle_t,
                    120:                    bus_size_t, u_int32_t);
                    121: inline void    __C(CHIP,_mem_write_8)(void *, bus_space_handle_t,
                    122:                    bus_size_t, u_int64_t);
                    123:
                    124: /* write multiple */
                    125: void           __C(CHIP,_mem_write_multi_1)(void *, bus_space_handle_t,
                    126:                    bus_size_t, const u_int8_t *, bus_size_t);
                    127: void           __C(CHIP,_mem_write_multi_2)(void *, bus_space_handle_t,
                    128:                    bus_size_t, const u_int16_t *, bus_size_t);
                    129: void           __C(CHIP,_mem_write_multi_4)(void *, bus_space_handle_t,
                    130:                    bus_size_t, const u_int32_t *, bus_size_t);
                    131: void           __C(CHIP,_mem_write_multi_8)(void *, bus_space_handle_t,
                    132:                    bus_size_t, const u_int64_t *, bus_size_t);
                    133:
                    134: /* write region */
                    135: void           __C(CHIP,_mem_write_region_1)(void *, bus_space_handle_t,
                    136:                    bus_size_t, const u_int8_t *, bus_size_t);
                    137: void           __C(CHIP,_mem_write_region_2)(void *, bus_space_handle_t,
                    138:                    bus_size_t, const u_int16_t *, bus_size_t);
                    139: void           __C(CHIP,_mem_write_region_4)(void *, bus_space_handle_t,
                    140:                    bus_size_t, const u_int32_t *, bus_size_t);
                    141: void           __C(CHIP,_mem_write_region_8)(void *, bus_space_handle_t,
                    142:                    bus_size_t, const u_int64_t *, bus_size_t);
                    143:
                    144: /* set multiple */
                    145: void           __C(CHIP,_mem_set_multi_1)(void *, bus_space_handle_t,
                    146:                    bus_size_t, u_int8_t, bus_size_t);
                    147: void           __C(CHIP,_mem_set_multi_2)(void *, bus_space_handle_t,
                    148:                    bus_size_t, u_int16_t, bus_size_t);
                    149: void           __C(CHIP,_mem_set_multi_4)(void *, bus_space_handle_t,
                    150:                    bus_size_t, u_int32_t, bus_size_t);
                    151: void           __C(CHIP,_mem_set_multi_8)(void *, bus_space_handle_t,
                    152:                    bus_size_t, u_int64_t, bus_size_t);
                    153:
                    154: /* set region */
                    155: void           __C(CHIP,_mem_set_region_1)(void *, bus_space_handle_t,
                    156:                    bus_size_t, u_int8_t, bus_size_t);
                    157: void           __C(CHIP,_mem_set_region_2)(void *, bus_space_handle_t,
                    158:                    bus_size_t, u_int16_t, bus_size_t);
                    159: void           __C(CHIP,_mem_set_region_4)(void *, bus_space_handle_t,
                    160:                    bus_size_t, u_int32_t, bus_size_t);
                    161: void           __C(CHIP,_mem_set_region_8)(void *, bus_space_handle_t,
                    162:                    bus_size_t, u_int64_t, bus_size_t);
                    163:
                    164: /* copy */
                    165: void           __C(CHIP,_mem_copy_1)(void *, bus_space_handle_t,
                    166:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    167: void           __C(CHIP,_mem_copy_2)(void *, bus_space_handle_t,
                    168:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    169: void           __C(CHIP,_mem_copy_4)(void *, bus_space_handle_t,
                    170:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    171: void           __C(CHIP,_mem_copy_8)(void *, bus_space_handle_t,
                    172:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    173:
                    174: /* read multiple raw */
                    175: void           __C(CHIP,_mem_read_raw_multi_2)(void *,
                    176:                    bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
                    177: void           __C(CHIP,_mem_read_raw_multi_4)(void *,
                    178:                    bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
                    179: void           __C(CHIP,_mem_read_raw_multi_8)(void *,
                    180:                    bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
                    181:
                    182: /* write multiple raw */
                    183: void           __C(CHIP,_mem_write_raw_multi_2)(void *,
                    184:                    bus_space_handle_t, bus_size_t, const u_int8_t *,
                    185:                    bus_size_t);
                    186: void           __C(CHIP,_mem_write_raw_multi_4)(void *,
                    187:                    bus_space_handle_t, bus_size_t, const u_int8_t *,
                    188:                    bus_size_t);
                    189: void           __C(CHIP,_mem_write_raw_multi_8)(void *,
                    190:                    bus_space_handle_t, bus_size_t, const u_int8_t *,
                    191:                    bus_size_t);
                    192:
                    193: void
                    194: __C(CHIP,_bus_mem_init)(t, v)
                    195:        bus_space_tag_t t;
                    196:        void *v;
                    197: {
                    198:        struct extent *dex, *sex;
                    199:
                    200:        /*
                    201:         * Initialize the bus space tag.
                    202:         */
                    203:
                    204:        /* cookie */
                    205:        t->abs_cookie = v;
                    206:
                    207:        /* mapping/unmapping */
                    208:        t->abs_map =            __C(CHIP,_mem_map);
                    209:        t->abs_unmap =          __C(CHIP,_mem_unmap);
                    210:        t->abs_subregion =      __C(CHIP,_mem_subregion);
                    211:
                    212:        /* allocation/deallocation */
                    213:        t->abs_alloc =          __C(CHIP,_mem_alloc);
                    214:        t->abs_free =           __C(CHIP,_mem_free);
                    215:
                    216:        /* barrier */
                    217:        t->abs_barrier =        __C(CHIP,_mem_barrier);
                    218:
                    219:        /* read (single) */
                    220:        t->abs_r_1 =            __C(CHIP,_mem_read_1);
                    221:        t->abs_r_2 =            __C(CHIP,_mem_read_2);
                    222:        t->abs_r_4 =            __C(CHIP,_mem_read_4);
                    223:        t->abs_r_8 =            __C(CHIP,_mem_read_8);
                    224:
                    225:        /* read multiple */
                    226:        t->abs_rm_1 =           __C(CHIP,_mem_read_multi_1);
                    227:        t->abs_rm_2 =           __C(CHIP,_mem_read_multi_2);
                    228:        t->abs_rm_4 =           __C(CHIP,_mem_read_multi_4);
                    229:        t->abs_rm_8 =           __C(CHIP,_mem_read_multi_8);
                    230:
                    231:        /* read region */
                    232:        t->abs_rr_1 =           __C(CHIP,_mem_read_region_1);
                    233:        t->abs_rr_2 =           __C(CHIP,_mem_read_region_2);
                    234:        t->abs_rr_4 =           __C(CHIP,_mem_read_region_4);
                    235:        t->abs_rr_8 =           __C(CHIP,_mem_read_region_8);
                    236:
                    237:        /* write (single) */
                    238:        t->abs_w_1 =            __C(CHIP,_mem_write_1);
                    239:        t->abs_w_2 =            __C(CHIP,_mem_write_2);
                    240:        t->abs_w_4 =            __C(CHIP,_mem_write_4);
                    241:        t->abs_w_8 =            __C(CHIP,_mem_write_8);
                    242:
                    243:        /* write multiple */
                    244:        t->abs_wm_1 =           __C(CHIP,_mem_write_multi_1);
                    245:        t->abs_wm_2 =           __C(CHIP,_mem_write_multi_2);
                    246:        t->abs_wm_4 =           __C(CHIP,_mem_write_multi_4);
                    247:        t->abs_wm_8 =           __C(CHIP,_mem_write_multi_8);
                    248:
                    249:        /* write region */
                    250:        t->abs_wr_1 =           __C(CHIP,_mem_write_region_1);
                    251:        t->abs_wr_2 =           __C(CHIP,_mem_write_region_2);
                    252:        t->abs_wr_4 =           __C(CHIP,_mem_write_region_4);
                    253:        t->abs_wr_8 =           __C(CHIP,_mem_write_region_8);
                    254:
                    255:        /* set multiple */
                    256:        t->abs_sm_1 =           __C(CHIP,_mem_set_multi_1);
                    257:        t->abs_sm_2 =           __C(CHIP,_mem_set_multi_2);
                    258:        t->abs_sm_4 =           __C(CHIP,_mem_set_multi_4);
                    259:        t->abs_sm_8 =           __C(CHIP,_mem_set_multi_8);
                    260:
                    261:        /* set region */
                    262:        t->abs_sr_1 =           __C(CHIP,_mem_set_region_1);
                    263:        t->abs_sr_2 =           __C(CHIP,_mem_set_region_2);
                    264:        t->abs_sr_4 =           __C(CHIP,_mem_set_region_4);
                    265:        t->abs_sr_8 =           __C(CHIP,_mem_set_region_8);
                    266:
                    267:        /* copy */
                    268:        t->abs_c_1 =            __C(CHIP,_mem_copy_1);
                    269:        t->abs_c_2 =            __C(CHIP,_mem_copy_2);
                    270:        t->abs_c_4 =            __C(CHIP,_mem_copy_4);
                    271:        t->abs_c_8 =            __C(CHIP,_mem_copy_8);
                    272:
                    273:        /* read multiple raw */
                    274:        t->abs_rrm_2 =          __C(CHIP,_mem_read_raw_multi_2);
                    275:        t->abs_rrm_4 =          __C(CHIP,_mem_read_raw_multi_4);
                    276:        t->abs_rrm_8 =          __C(CHIP,_mem_read_raw_multi_8);
                    277:
                    278:        /* write multiple raw*/
                    279:        t->abs_wrm_2 =          __C(CHIP,_mem_write_raw_multi_2);
                    280:        t->abs_wrm_4 =          __C(CHIP,_mem_write_raw_multi_4);
                    281:        t->abs_wrm_8 =          __C(CHIP,_mem_write_raw_multi_8);
                    282:
                    283:        /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
                    284:        dex = extent_create(CHIP_EXTENT_DNAME(v), 0x0UL,
                    285:            0xffffffffffffffffUL, M_DEVBUF,
                    286:            (caddr_t)CHIP_EXTENT_DSTORAGE(v),
                    287:            sizeof(CHIP_EXTENT_DSTORAGE(v)), EX_NOWAIT);
                    288:        extent_alloc_region(dex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
                    289:
                    290: #ifdef CHIP_D_MEM_W1_BUS_START
                    291: #ifdef EXTENT_DEBUG
                    292:        printf("dmem: freeing from 0x%lx to 0x%lx\n",
                    293:            CHIP_D_MEM_W1_BUS_START(v), CHIP_D_MEM_W1_BUS_END(v));
                    294: #endif
                    295:        extent_free(dex, CHIP_D_MEM_W1_BUS_START(v),
                    296:            CHIP_D_MEM_W1_BUS_END(v) - CHIP_D_MEM_W1_BUS_START(v) + 1,
                    297:            EX_NOWAIT);
                    298: #endif
                    299:
                    300: #ifdef EXTENT_DEBUG
                    301:         extent_print(dex);
                    302: #endif
                    303:         CHIP_D_MEM_EXTENT(v) = dex;
                    304:
                    305:        /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
                    306:        sex = extent_create(CHIP_EXTENT_SNAME(v), 0x0UL,
                    307:            0xffffffffffffffffUL, M_DEVBUF,
                    308:            (caddr_t)CHIP_EXTENT_SSTORAGE(v),
                    309:            sizeof(CHIP_EXTENT_SSTORAGE(v)), EX_NOWAIT);
                    310:        extent_alloc_region(sex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
                    311:
                    312: #ifdef CHIP_S_MEM_W1_BUS_START
                    313: #ifdef EXTENT_DEBUG
                    314:        printf("smem: freeing from 0x%lx to 0x%lx\n",
                    315:            CHIP_S_MEM_W1_BUS_START(v), CHIP_S_MEM_W1_BUS_END(v));
                    316: #endif
                    317:        extent_free(sex, CHIP_S_MEM_W1_BUS_START(v),
                    318:            CHIP_S_MEM_W1_BUS_END(v) - CHIP_S_MEM_W1_BUS_START(v) + 1,
                    319:            EX_NOWAIT);
                    320: #endif
                    321: #ifdef CHIP_S_MEM_W2_BUS_START
                    322:        if (CHIP_S_MEM_W2_BUS_START(v) != CHIP_S_MEM_W1_BUS_START(v)) {
                    323: #ifdef EXTENT_DEBUG
                    324:                printf("smem: freeing from 0x%lx to 0x%lx\n",
                    325:                    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
                    326: #endif
                    327:                extent_free(sex, CHIP_S_MEM_W2_BUS_START(v),
                    328:                    CHIP_S_MEM_W2_BUS_END(v) - CHIP_S_MEM_W2_BUS_START(v) + 1,
                    329:                    EX_NOWAIT);
                    330:        } else {
                    331: #ifdef EXTENT_DEBUG
                    332:                printf("smem: window 2 (0x%lx to 0x%lx) overlaps window 1\n",
                    333:                    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
                    334: #endif
                    335:        }
                    336: #endif
                    337: #ifdef CHIP_S_MEM_W3_BUS_START
                    338:        if (CHIP_S_MEM_W3_BUS_START(v) != CHIP_S_MEM_W1_BUS_START(v) &&
                    339:            CHIP_S_MEM_W3_BUS_START(v) != CHIP_S_MEM_W2_BUS_START(v)) {
                    340: #ifdef EXTENT_DEBUG
                    341:                printf("smem: freeing from 0x%lx to 0x%lx\n",
                    342:                    CHIP_S_MEM_W3_BUS_START(v), CHIP_S_MEM_W3_BUS_END(v));
                    343: #endif
                    344:                extent_free(sex, CHIP_S_MEM_W3_BUS_START(v),
                    345:                    CHIP_S_MEM_W3_BUS_END(v) - CHIP_S_MEM_W3_BUS_START(v) + 1,
                    346:                    EX_NOWAIT);
                    347:        } else {
                    348: #ifdef EXTENT_DEBUG
                    349:                printf("smem: window 2 (0x%lx to 0x%lx) overlaps window 1\n",
                    350:                    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
                    351: #endif
                    352:        }
                    353: #endif
                    354:
                    355: #ifdef EXTENT_DEBUG
                    356:         extent_print(sex);
                    357: #endif
                    358:         CHIP_S_MEM_EXTENT(v) = sex;
                    359: }
                    360:
                    361: static int     __C(CHIP,_xlate_addr_to_dense_handle)(void *,
                    362:                    bus_addr_t, bus_space_handle_t *);
                    363: static int     __C(CHIP,_xlate_dense_handle_to_addr)(void *,
                    364:                    bus_space_handle_t, bus_addr_t *);
                    365: static int     __C(CHIP,_xlate_addr_to_sparse_handle)(void *,
                    366:                    bus_addr_t, bus_space_handle_t *);
                    367: static int     __C(CHIP,_xlate_sparse_handle_to_addr)(void *,
                    368:                    bus_space_handle_t, bus_addr_t *);
                    369:
                    370: static int
                    371: __C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr, memhp)
                    372:        void *v;
                    373:        bus_addr_t memaddr;
                    374:        bus_space_handle_t *memhp;
                    375: {
                    376: #ifdef CHIP_D_MEM_W1_BUS_START
                    377:        if (memaddr >= CHIP_D_MEM_W1_BUS_START(v) &&
                    378:            memaddr <= CHIP_D_MEM_W1_BUS_END(v)) {
                    379:                *memhp = ALPHA_PHYS_TO_K0SEG(CHIP_D_MEM_W1_SYS_START(v)) +
                    380:                    (memaddr - CHIP_D_MEM_W1_BUS_START(v));
                    381:                return (1);
                    382:        } else
                    383: #endif
                    384:                return (0);
                    385: }
                    386:
                    387: static int
                    388: __C(CHIP,_xlate_dense_handle_to_addr)(v, memh, memaddrp)
                    389:        void *v;
                    390:        bus_space_handle_t memh;
                    391:        bus_addr_t *memaddrp;
                    392: {
                    393:
                    394:        memh = ALPHA_K0SEG_TO_PHYS(memh);
                    395:
                    396: #ifdef CHIP_D_MEM_W1_BUS_START
                    397:        if (memh >= CHIP_D_MEM_W1_SYS_START(v) &&
                    398:            memh <= CHIP_D_MEM_W1_SYS_END(v)) {
                    399:                *memaddrp = CHIP_D_MEM_W1_BUS_START(v) +
                    400:                    (memh - CHIP_D_MEM_W1_SYS_START(v));
                    401:                return (1);
                    402:        } else
                    403: #endif
                    404:                return (0);
                    405: }
                    406:
                    407: static int
                    408: __C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr, memhp)
                    409:        void *v;
                    410:        bus_addr_t memaddr;
                    411:        bus_space_handle_t *memhp;
                    412: {
                    413:
                    414: #ifdef CHIP_S_MEM_W1_BUS_START
                    415:        if (memaddr >= CHIP_S_MEM_W1_BUS_START(v) &&
                    416:            memaddr <= CHIP_S_MEM_W1_BUS_END(v)) {
                    417:                *memhp =
                    418:                    (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W1_SYS_START(v)) >> 5) +
                    419:                    (memaddr - CHIP_S_MEM_W1_BUS_START(v));
                    420:                return (1);
                    421:        } else
                    422: #endif
                    423: #ifdef CHIP_S_MEM_W2_BUS_START
                    424:        if (memaddr >= CHIP_S_MEM_W2_BUS_START(v) &&
                    425:            memaddr <= CHIP_S_MEM_W2_BUS_END(v)) {
                    426:                *memhp =
                    427:                    (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W2_SYS_START(v)) >> 5) +
                    428:                    (memaddr - CHIP_S_MEM_W2_BUS_START(v));
                    429:                return (1);
                    430:        } else
                    431: #endif
                    432: #ifdef CHIP_S_MEM_W3_BUS_START
                    433:        if (memaddr >= CHIP_S_MEM_W3_BUS_START(v) &&
                    434:            memaddr <= CHIP_S_MEM_W3_BUS_END(v)) {
                    435:                *memhp =
                    436:                    (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W3_SYS_START(v)) >> 5) +
                    437:                    (memaddr - CHIP_S_MEM_W3_BUS_START(v));
                    438:                return (1);
                    439:        } else
                    440: #endif
                    441:                return (0);
                    442: }
                    443:
                    444: static int
                    445: __C(CHIP,_xlate_sparse_handle_to_addr)(v, memh, memaddrp)
                    446:        void *v;
                    447:        bus_space_handle_t memh;
                    448:        bus_addr_t *memaddrp;
                    449: {
                    450:
                    451:        memh = ALPHA_K0SEG_TO_PHYS(memh << 5) >> 5;
                    452:
                    453: #ifdef CHIP_S_MEM_W1_BUS_START
                    454:        if ((memh << 5) >= CHIP_S_MEM_W1_SYS_START(v) &&
                    455:            (memh << 5) <= CHIP_S_MEM_W1_SYS_END(v)) {
                    456:                *memaddrp = CHIP_S_MEM_W1_BUS_START(v) +
                    457:                    (memh - (CHIP_S_MEM_W1_SYS_START(v) >> 5));
                    458:                return (1);
                    459:        } else
                    460: #endif
                    461: #ifdef CHIP_S_MEM_W2_BUS_START
                    462:        if ((memh << 5) >= CHIP_S_MEM_W2_SYS_START(v) &&
                    463:            (memh << 5) <= CHIP_S_MEM_W2_SYS_END(v)) {
                    464:                *memaddrp = CHIP_S_MEM_W2_BUS_START(v) +
                    465:                    (memh - (CHIP_S_MEM_W2_SYS_START(v) >> 5));
                    466:                return (1);
                    467:        } else
                    468: #endif
                    469: #ifdef CHIP_S_MEM_W3_BUS_START
                    470:        if ((memh << 5) >= CHIP_S_MEM_W3_SYS_START(v) &&
                    471:            (memh << 5) <= CHIP_S_MEM_W3_SYS_END(v)) {
                    472:                *memaddrp = CHIP_S_MEM_W3_BUS_START(v) +
                    473:                    (memh - (CHIP_S_MEM_W3_SYS_START(v) >> 5));
                    474:                return (1);
                    475:        } else
                    476: #endif
                    477:                return (0);
                    478: }
                    479:
                    480: int
                    481: __C(CHIP,_mem_map)(v, memaddr, memsize, cacheable, memhp)
                    482:        void *v;
                    483:        bus_addr_t memaddr;
                    484:        bus_size_t memsize;
                    485:        int cacheable;
                    486:        bus_space_handle_t *memhp;
                    487: {
                    488:        bus_space_handle_t dh = 0, sh = 0;      /* XXX -Wuninitialized */
                    489:        int didd, dids, errord, errors, mustd, musts;
                    490:
                    491:        mustd = 1;
                    492:        musts = (cacheable == 0);
                    493:
                    494: #ifdef EXTENT_DEBUG
                    495:        printf("mem: allocating 0x%lx to 0x%lx\n", memaddr,
                    496:            memaddr + memsize - 1);
                    497:        printf("mem: %s dense, %s sparse\n", mustd ? "need" : "want",
                    498:            musts ? "need" : "want");
                    499: #endif
                    500:        errord = extent_alloc_region(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
                    501:            EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
                    502:        didd = (errord == 0);
                    503:        errors = extent_alloc_region(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
                    504:            EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
                    505:        dids = (errors == 0);
                    506:
                    507: #ifdef EXTENT_DEBUG
                    508:        if (!didd)
                    509:                printf("mem: failed to get dense (%d)\n", errord);
                    510:        if (!dids)
                    511:                printf("mem: failed to get sparse (%d)\n", errors);
                    512: #endif
                    513:
                    514:        if ((mustd && !didd) || (musts && !dids))
                    515:                goto bad;
                    516:
                    517:        if (didd && !__C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr, &dh)) {
                    518:                printf("\n");
                    519: #ifdef CHIP_D_MEM_W1_BUS_START
                    520:                printf("%s: window[1]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
                    521:                    CHIP_D_MEM_W1_BUS_START(v), CHIP_D_MEM_W1_BUS_END(v));
                    522: #endif
                    523:                panic("%s: don't know how to map %lx cacheable",
                    524:                    __S(__C(CHIP,_mem_map)), memaddr);
                    525:        }
                    526:
                    527:        if (dids && !__C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr, &sh)) {
                    528:                printf("\n");
                    529: #ifdef CHIP_S_MEM_W1_BUS_START
                    530:                printf("%s: window[1]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
                    531:                    CHIP_S_MEM_W1_BUS_START(v), CHIP_S_MEM_W1_BUS_END(v));
                    532: #endif
                    533: #ifdef CHIP_S_MEM_W2_BUS_START
                    534:                printf("%s: window[2]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
                    535:                    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
                    536: #endif
                    537: #ifdef CHIP_S_MEM_W3_BUS_START
                    538:                printf("%s: window[3]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
                    539:                    CHIP_S_MEM_W3_BUS_START(v), CHIP_S_MEM_W3_BUS_END(v));
                    540: #endif
                    541:                panic("%s: don't know how to map %lx non-cacheable",
                    542:                    __S(__C(CHIP,_mem_map)), memaddr);
                    543:        }
                    544:
                    545:        if (cacheable)
                    546:                *memhp = dh;
                    547:        else
                    548:                *memhp = sh;
                    549:        return (0);
                    550:
                    551: bad:
                    552: #ifdef EXTENT_DEBUG
                    553:        printf("mem: failed\n");
                    554: #endif
                    555:        if (didd) {
                    556: #ifdef EXTENT_DEBUG
                    557:        printf("mem: freeing dense\n");
                    558: #endif
                    559:                if (extent_free(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
                    560:                    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
                    561:                        printf("%s: WARNING: couldn't free dense 0x%lx-0x%lx\n",
                    562:                            __S(__C(CHIP,_mem_map)), memaddr,
                    563:                            memaddr + memsize - 1);
                    564:                }
                    565:        }
                    566:        if (dids) {
                    567: #ifdef EXTENT_DEBUG
                    568:        printf("mem: freeing sparse\n");
                    569: #endif
                    570:                if (extent_free(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
                    571:                    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
                    572:                        printf("%s: WARNING: couldn't free sparse 0x%lx-0x%lx\n",
                    573:                            __S(__C(CHIP,_mem_map)), memaddr,
                    574:                            memaddr + memsize - 1);
                    575:                }
                    576:        }
                    577:
                    578: #ifdef EXTENT_DEBUG
                    579:        extent_print(CHIP_D_MEM_EXTENT(v));
                    580:        extent_print(CHIP_S_MEM_EXTENT(v));
                    581: #endif
                    582:
                    583:        /*
                    584:         * return dense error if we needed it but couldn't get it, else
                    585:         * sparse error.  The error _has_ to be one of the two...
                    586:         */
                    587:        return (mustd && !didd ? errord : (musts && !dids ? errors : EINVAL));
                    588: }
                    589:
                    590: void
                    591: __C(CHIP,_mem_unmap)(v, memh, memsize)
                    592:        void *v;
                    593:        bus_space_handle_t memh;
                    594:        bus_size_t memsize;
                    595: {
                    596:        bus_addr_t memaddr;
                    597:        bus_space_handle_t temph;
                    598:        int sparse, haves, haved;
                    599:
                    600: #ifdef EXTENT_DEBUG
                    601:        printf("mem: freeing handle 0x%lx for 0x%lx\n", memh, memsize);
                    602: #endif
                    603:
                    604:        /*
                    605:         * Find out what space we're in.
                    606:         */
                    607:        sparse = ((memh >> 63) == 0);
                    608:
                    609:        /*
                    610:         * Find out what address we're in in that space.
                    611:         */
                    612:        haves = haved = 0;
                    613:        if (sparse)
                    614:                haves = __C(CHIP,_xlate_sparse_handle_to_addr)(v, memh,
                    615:                    &memaddr);
                    616:        else
                    617:                haved = __C(CHIP,_xlate_dense_handle_to_addr)(v, memh,
                    618:                    &memaddr);
                    619:
                    620:        if (!haves && !haved)
                    621:                panic("%s: couldn't get addr from %s handle 0x%lx",
                    622:                    __S(__C(CHIP,_mem_unmap)), sparse ? "sparse" : "dense",
                    623:                    memh);
                    624:
                    625:        /*
                    626:         * Find out were/if that address lives in the other space.
                    627:         */
                    628:        if (sparse)
                    629:                haved = __C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr,
                    630:                    &temph);
                    631:        else
                    632:                haves = __C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr,
                    633:                    &temph);
                    634:
                    635:        /*
                    636:         * Free any ranges we have.
                    637:         */
                    638: #ifdef EXTENT_DEBUG
                    639:        printf("mem: it's at 0x%lx (%sdense, %ssparse)\n", memaddr,
                    640:            haved ? "" : "not ", haves ? "" : "not ");
                    641: #endif
                    642:        if (haved && extent_free(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
                    643:            EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
                    644:                printf("%s: WARNING: couldn't free dense 0x%lx-0x%lx\n",
                    645:                    __S(__C(CHIP,_mem_map)), memaddr,
                    646:                    memaddr + memsize - 1);
                    647:        }
                    648:        if (haves && extent_free(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
                    649:            EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
                    650:                printf("%s: WARNING: couldn't free sparse 0x%lx-0x%lx\n",
                    651:                    __S(__C(CHIP,_mem_map)), memaddr,
                    652:                    memaddr + memsize - 1);
                    653:        }
                    654: }
                    655:
                    656: int
                    657: __C(CHIP,_mem_subregion)(v, memh, offset, size, nmemh)
                    658:        void *v;
                    659:        bus_space_handle_t memh, *nmemh;
                    660:        bus_size_t offset, size;
                    661: {
                    662:
                    663:        *nmemh = memh + offset;
                    664:        return (0);
                    665: }
                    666:
                    667: int
                    668: __C(CHIP,_mem_alloc)(v, rstart, rend, size, align, boundary, cacheable,
                    669:     addrp, bshp)
                    670:        void *v;
                    671:        bus_addr_t rstart, rend, *addrp;
                    672:        bus_size_t size, align, boundary;
                    673:        int cacheable;
                    674:        bus_space_handle_t *bshp;
                    675: {
                    676:
                    677:        /* XXX XXX XXX XXX XXX XXX */
                    678:        panic("%s not implemented", __S(__C(CHIP,_mem_alloc)));
                    679: }
                    680:
                    681: void
                    682: __C(CHIP,_mem_free)(v, bsh, size)
                    683:        void *v;
                    684:        bus_space_handle_t bsh;
                    685:        bus_size_t size;
                    686: {
                    687:
                    688:        /* XXX XXX XXX XXX XXX XXX */
                    689:        panic("%s not implemented", __S(__C(CHIP,_mem_free)));
                    690: }
                    691:
                    692: inline void
                    693: __C(CHIP,_mem_barrier)(v, h, o, l, f)
                    694:        void *v;
                    695:        bus_space_handle_t h;
                    696:        bus_size_t o, l;
                    697:        int f;
                    698: {
                    699:
                    700:        if ((f & BUS_BARRIER_READ) != 0)
                    701:                alpha_mb();
                    702:        else if ((f & BUS_BARRIER_WRITE) != 0)
                    703:                alpha_wmb();
                    704: }
                    705:
                    706: inline u_int8_t
                    707: __C(CHIP,_mem_read_1)(v, memh, off)
                    708:        void *v;
                    709:        bus_space_handle_t memh;
                    710:        bus_size_t off;
                    711: {
                    712:        register bus_space_handle_t tmpmemh;
                    713:        register u_int32_t *port, val;
                    714:        register u_int8_t rval;
                    715:        register int offset;
                    716:
                    717:        alpha_mb();
                    718:
                    719:        if ((memh >> 63) != 0)
                    720:                return (*(u_int8_t *)(memh + off));
                    721:
                    722:        tmpmemh = memh + off;
                    723:        offset = tmpmemh & 3;
                    724:        port = (u_int32_t *)((tmpmemh << 5) | (0 << 3));
                    725:        val = *port;
                    726:        rval = ((val) >> (8 * offset)) & 0xff;
                    727:
                    728:        return rval;
                    729: }
                    730:
                    731: inline u_int16_t
                    732: __C(CHIP,_mem_read_2)(v, memh, off)
                    733:        void *v;
                    734:        bus_space_handle_t memh;
                    735:        bus_size_t off;
                    736: {
                    737:        register bus_space_handle_t tmpmemh;
                    738:        register u_int32_t *port, val;
                    739:        register u_int16_t rval;
                    740:        register int offset;
                    741:
                    742:        alpha_mb();
                    743:
                    744:        if ((memh >> 63) != 0)
                    745:                return (*(u_int16_t *)(memh + off));
                    746:
                    747:        tmpmemh = memh + off;
                    748:        offset = tmpmemh & 3;
                    749:        port = (u_int32_t *)((tmpmemh << 5) | (1 << 3));
                    750:        val = *port;
                    751:        rval = ((val) >> (8 * offset)) & 0xffff;
                    752:
                    753:        return rval;
                    754: }
                    755:
                    756: inline u_int32_t
                    757: __C(CHIP,_mem_read_4)(v, memh, off)
                    758:        void *v;
                    759:        bus_space_handle_t memh;
                    760:        bus_size_t off;
                    761: {
                    762:        register bus_space_handle_t tmpmemh;
                    763:        register u_int32_t *port, val;
                    764:        register u_int32_t rval;
                    765:        register int offset;
                    766:
                    767:        alpha_mb();
                    768:
                    769:        if ((memh >> 63) != 0)
                    770:                return (*(u_int32_t *)(memh + off));
                    771:
                    772:        tmpmemh = memh + off;
                    773:        offset = tmpmemh & 3;
                    774:        port = (u_int32_t *)((tmpmemh << 5) | (3 << 3));
                    775:        val = *port;
                    776: #if 0
                    777:        rval = ((val) >> (8 * offset)) & 0xffffffff;
                    778: #else
                    779:        rval = val;
                    780: #endif
                    781:
                    782:        return rval;
                    783: }
                    784:
                    785: inline u_int64_t
                    786: __C(CHIP,_mem_read_8)(v, memh, off)
                    787:        void *v;
                    788:        bus_space_handle_t memh;
                    789:        bus_size_t off;
                    790: {
                    791:
                    792:        alpha_mb();
                    793:
                    794:         if ((memh >> 63) != 0)
                    795:                 return (*(u_int64_t *)(memh + off));
                    796:
                    797:        /* XXX XXX XXX */
                    798:        panic("%s not implemented", __S(__C(CHIP,_mem_read_8)));
                    799: }
                    800:
                    801: #define CHIP_mem_read_multi_N(BYTES,TYPE)                              \
                    802: void                                                                   \
                    803: __C(__C(CHIP,_mem_read_multi_),BYTES)(v, h, o, a, c)                   \
                    804:        void *v;                                                        \
                    805:        bus_space_handle_t h;                                           \
                    806:        bus_size_t o, c;                                                \
                    807:        TYPE *a;                                                        \
                    808: {                                                                      \
                    809:                                                                        \
                    810:        while (c-- > 0) {                                               \
                    811:                __C(CHIP,_mem_barrier)(v, h, o, sizeof *a,              \
                    812:                    BUS_BARRIER_READ);                                  \
                    813:                *a++ = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o);        \
                    814:        }                                                               \
                    815: }
                    816: CHIP_mem_read_multi_N(1,u_int8_t)
                    817: CHIP_mem_read_multi_N(2,u_int16_t)
                    818: CHIP_mem_read_multi_N(4,u_int32_t)
                    819: CHIP_mem_read_multi_N(8,u_int64_t)
                    820:
                    821: #define CHIP_mem_read_region_N(BYTES,TYPE)                             \
                    822: void                                                                   \
                    823: __C(__C(CHIP,_mem_read_region_),BYTES)(v, h, o, a, c)                  \
                    824:        void *v;                                                        \
                    825:        bus_space_handle_t h;                                           \
                    826:        bus_size_t o, c;                                                \
                    827:        TYPE *a;                                                        \
                    828: {                                                                      \
                    829:                                                                        \
                    830:        while (c-- > 0) {                                               \
                    831:                *a++ = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o);        \
                    832:                o += sizeof *a;                                         \
                    833:        }                                                               \
                    834: }
                    835: CHIP_mem_read_region_N(1,u_int8_t)
                    836: CHIP_mem_read_region_N(2,u_int16_t)
                    837: CHIP_mem_read_region_N(4,u_int32_t)
                    838: CHIP_mem_read_region_N(8,u_int64_t)
                    839:
                    840: inline void
                    841: __C(CHIP,_mem_write_1)(v, memh, off, val)
                    842:        void *v;
                    843:        bus_space_handle_t memh;
                    844:        bus_size_t off;
                    845:        u_int8_t val;
                    846: {
                    847:        register bus_space_handle_t tmpmemh;
                    848:        register u_int32_t *port, nval;
                    849:        register int offset;
                    850:
                    851:        if ((memh >> 63) != 0)
                    852:                (*(u_int8_t *)(memh + off)) = val;
                    853:        else {
                    854:                tmpmemh = memh + off;
                    855:                offset = tmpmemh & 3;
                    856:                nval = val << (8 * offset);
                    857:                port = (u_int32_t *)((tmpmemh << 5) | (0 << 3));
                    858:                *port = nval;
                    859:        }
                    860:         alpha_mb();
                    861: }
                    862:
                    863: inline void
                    864: __C(CHIP,_mem_write_2)(v, memh, off, val)
                    865:        void *v;
                    866:        bus_space_handle_t memh;
                    867:        bus_size_t off;
                    868:        u_int16_t val;
                    869: {
                    870:        register bus_space_handle_t tmpmemh;
                    871:        register u_int32_t *port, nval;
                    872:        register int offset;
                    873:
                    874:        if ((memh >> 63) != 0)
                    875:                (*(u_int16_t *)(memh + off)) = val;
                    876:        else {
                    877:                tmpmemh = memh + off;
                    878:                offset = tmpmemh & 3;
                    879:                nval = val << (8 * offset);
                    880:                port = (u_int32_t *)((tmpmemh << 5) | (1 << 3));
                    881:                *port = nval;
                    882:        }
                    883:         alpha_mb();
                    884: }
                    885:
                    886: inline void
                    887: __C(CHIP,_mem_write_4)(v, memh, off, val)
                    888:        void *v;
                    889:        bus_space_handle_t memh;
                    890:        bus_size_t off;
                    891:        u_int32_t val;
                    892: {
                    893:        register bus_space_handle_t tmpmemh;
                    894:        register u_int32_t *port, nval;
                    895:        register int offset;
                    896:
                    897:        if ((memh >> 63) != 0)
                    898:                (*(u_int32_t *)(memh + off)) = val;
                    899:        else {
                    900:                tmpmemh = memh + off;
                    901:                offset = tmpmemh & 3;
                    902:                nval = val /*<< (8 * offset)*/;
                    903:                port = (u_int32_t *)((tmpmemh << 5) | (3 << 3));
                    904:                *port = nval;
                    905:        }
                    906:         alpha_mb();
                    907: }
                    908:
                    909: inline void
                    910: __C(CHIP,_mem_write_8)(v, memh, off, val)
                    911:        void *v;
                    912:        bus_space_handle_t memh;
                    913:        bus_size_t off;
                    914:        u_int64_t val;
                    915: {
                    916:
                    917:        if ((memh >> 63) != 0)
                    918:                (*(u_int64_t *)(memh + off)) = val;
                    919:        else {
                    920:                /* XXX XXX XXX */
                    921:                panic("%s not implemented",
                    922:                    __S(__C(CHIP,_mem_write_8)));
                    923:        }
                    924:        alpha_mb();
                    925: }
                    926:
                    927: #define CHIP_mem_write_multi_N(BYTES,TYPE)                             \
                    928: void                                                                   \
                    929: __C(__C(CHIP,_mem_write_multi_),BYTES)(v, h, o, a, c)                  \
                    930:        void *v;                                                        \
                    931:        bus_space_handle_t h;                                           \
                    932:        bus_size_t o, c;                                                \
                    933:        const TYPE *a;                                                  \
                    934: {                                                                      \
                    935:                                                                        \
                    936:        while (c-- > 0) {                                               \
                    937:                __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, *a++);        \
                    938:                __C(CHIP,_mem_barrier)(v, h, o, sizeof *a,              \
                    939:                    BUS_BARRIER_WRITE);                                 \
                    940:        }                                                               \
                    941: }
                    942: CHIP_mem_write_multi_N(1,u_int8_t)
                    943: CHIP_mem_write_multi_N(2,u_int16_t)
                    944: CHIP_mem_write_multi_N(4,u_int32_t)
                    945: CHIP_mem_write_multi_N(8,u_int64_t)
                    946:
                    947: #define CHIP_mem_write_region_N(BYTES,TYPE)                            \
                    948: void                                                                   \
                    949: __C(__C(CHIP,_mem_write_region_),BYTES)(v, h, o, a, c)                 \
                    950:        void *v;                                                        \
                    951:        bus_space_handle_t h;                                           \
                    952:        bus_size_t o, c;                                                \
                    953:        const TYPE *a;                                                  \
                    954: {                                                                      \
                    955:                                                                        \
                    956:        while (c-- > 0) {                                               \
                    957:                __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, *a++);        \
                    958:                o += sizeof *a;                                         \
                    959:        }                                                               \
                    960: }
                    961: CHIP_mem_write_region_N(1,u_int8_t)
                    962: CHIP_mem_write_region_N(2,u_int16_t)
                    963: CHIP_mem_write_region_N(4,u_int32_t)
                    964: CHIP_mem_write_region_N(8,u_int64_t)
                    965:
                    966: #define CHIP_mem_set_multi_N(BYTES,TYPE)                               \
                    967: void                                                                   \
                    968: __C(__C(CHIP,_mem_set_multi_),BYTES)(v, h, o, val, c)                  \
                    969:        void *v;                                                        \
                    970:        bus_space_handle_t h;                                           \
                    971:        bus_size_t o, c;                                                \
                    972:        TYPE val;                                                       \
                    973: {                                                                      \
                    974:                                                                        \
                    975:        while (c-- > 0) {                                               \
                    976:                __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, val);         \
                    977:                __C(CHIP,_mem_barrier)(v, h, o, sizeof val,             \
                    978:                    BUS_BARRIER_WRITE);                                 \
                    979:        }                                                               \
                    980: }
                    981: CHIP_mem_set_multi_N(1,u_int8_t)
                    982: CHIP_mem_set_multi_N(2,u_int16_t)
                    983: CHIP_mem_set_multi_N(4,u_int32_t)
                    984: CHIP_mem_set_multi_N(8,u_int64_t)
                    985:
                    986: #define CHIP_mem_set_region_N(BYTES,TYPE)                              \
                    987: void                                                                   \
                    988: __C(__C(CHIP,_mem_set_region_),BYTES)(v, h, o, val, c)                 \
                    989:        void *v;                                                        \
                    990:        bus_space_handle_t h;                                           \
                    991:        bus_size_t o, c;                                                \
                    992:        TYPE val;                                                       \
                    993: {                                                                      \
                    994:                                                                        \
                    995:        while (c-- > 0) {                                               \
                    996:                __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, val);         \
                    997:                o += sizeof val;                                        \
                    998:        }                                                               \
                    999: }
                   1000: CHIP_mem_set_region_N(1,u_int8_t)
                   1001: CHIP_mem_set_region_N(2,u_int16_t)
                   1002: CHIP_mem_set_region_N(4,u_int32_t)
                   1003: CHIP_mem_set_region_N(8,u_int64_t)
                   1004:
                   1005: #define        CHIP_mem_copy_N(BYTES)                                          \
                   1006: void                                                                   \
                   1007: __C(__C(CHIP,_mem_copy_),BYTES)(v, h1, o1, h2, o2, c)                  \
                   1008:        void *v;                                                        \
                   1009:        bus_space_handle_t h1, h2;                                      \
                   1010:        bus_size_t o1, o2, c;                                           \
                   1011: {                                                                      \
                   1012:        bus_size_t i, o;                                                \
                   1013:                                                                        \
                   1014:        if ((h1 >> 63) != 0 && (h2 >> 63) != 0) {                       \
                   1015:                bcopy((void *)(h1 + o1), (void *)(h2 + o2), c * BYTES); \
                   1016:                return;                                                 \
                   1017:        }                                                               \
                   1018:                                                                        \
                   1019:        /* Circumvent a common case of overlapping problems */          \
                   1020:        if (h1 == h2 && o2 > o1)                                        \
                   1021:                for (i = 0, o = (c - 1) * BYTES; i < c; i++, o -= BYTES)\
                   1022:                        __C(__C(CHIP,_mem_write_),BYTES)(v, h2, o2 + o, \
                   1023:                            __C(__C(CHIP,_mem_read_),BYTES)(v, h1, o1 + o));\
                   1024:        else                                                            \
                   1025:                for (i = 0, o = 0; i < c; i++, o += BYTES)              \
                   1026:                        __C(__C(CHIP,_mem_write_),BYTES)(v, h2, o2 + o, \
                   1027:                            __C(__C(CHIP,_mem_read_),BYTES)(v, h1, o1 + o));\
                   1028: }
                   1029: CHIP_mem_copy_N(1)
                   1030: CHIP_mem_copy_N(2)
                   1031: CHIP_mem_copy_N(4)
                   1032: CHIP_mem_copy_N(8)
                   1033:
                   1034: #define CHIP_mem_read_raw_multi_N(BYTES,TYPE)                          \
                   1035: void                                                                   \
                   1036: __C(__C(CHIP,_mem_read_raw_multi_),BYTES)(v, h, o, a, c)                       \
                   1037:        void *v;                                                        \
                   1038:        bus_space_handle_t h;                                           \
                   1039:        bus_size_t o, c;                                                \
                   1040:        u_int8_t *a;                                                    \
                   1041: {                                                                      \
                   1042:        TYPE temp;                                                      \
                   1043:        int i;                                                          \
                   1044:                                                                        \
                   1045:        while (c > 0) {                                                 \
                   1046:                __C(CHIP,_mem_barrier)(v, h, o, BYTES, BUS_BARRIER_READ); \
                   1047:                temp = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o);        \
                   1048:                i = MIN(c, BYTES);                                      \
                   1049:                c -= i;                                                 \
                   1050:                while (i--) {                                           \
                   1051:                        *a++ = temp & 0xff;                             \
                   1052:                        temp >>= 8;                                     \
                   1053:                }                                                       \
                   1054:        }                                                               \
                   1055: }
                   1056: CHIP_mem_read_raw_multi_N(2,u_int16_t)
                   1057: CHIP_mem_read_raw_multi_N(4,u_int32_t)
                   1058: CHIP_mem_read_raw_multi_N(8,u_int64_t)
                   1059:
                   1060: #define CHIP_mem_write_raw_multi_N(BYTES,TYPE)                         \
                   1061: void                                                                   \
                   1062: __C(__C(CHIP,_mem_write_raw_multi_),BYTES)(v, h, o, a, c)              \
                   1063:        void *v;                                                        \
                   1064:        bus_space_handle_t h;                                           \
                   1065:        bus_size_t o, c;                                                \
                   1066:        const u_int8_t *a;                                              \
                   1067: {                                                                      \
                   1068:        TYPE temp;                                                      \
                   1069:        int i;                                                          \
                   1070:                                                                        \
                   1071:        while (c > 0) {                                                 \
                   1072:                temp = 0;                                               \
                   1073:                for (i = BYTES - 1; i >= 0; i--) {                      \
                   1074:                        temp <<= 8;                                     \
                   1075:                        if (i < c)                                      \
                   1076:                                temp |= *(a + i);                       \
                   1077:                }                                                       \
                   1078:                __C(__C(CHIP,_mem_write_),BYTES)(v, h, o, temp);        \
                   1079:                __C(CHIP,_mem_barrier)(v, h, o, BYTES, BUS_BARRIER_WRITE); \
                   1080:                i = MIN(c, BYTES);                                      \
                   1081:                c -= i;                                                 \
                   1082:                a += i;                                                 \
                   1083:        }                                                               \
                   1084: }
                   1085: CHIP_mem_write_raw_multi_N(2,u_int16_t)
                   1086: CHIP_mem_write_raw_multi_N(4,u_int32_t)
                   1087: CHIP_mem_write_raw_multi_N(8,u_int64_t)

CVSweb