[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     ! 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