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