The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/powerpc/powerpc/bus_machdep.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2006 Semihalf, Rafal Jaworowski <raj@semihalf.com>
    3  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
    4  * All rights reserved.
    5  *
    6  * This code is derived from software contributed to The NetBSD Foundation
    7  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
    8  * NASA Ames Research Center.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  * 3. All advertising materials mentioning features or use of this software
   19  *    must display the following acknowledgement:
   20  *      This product includes software developed by the NetBSD
   21  *      Foundation, Inc. and its contributors.
   22  * 4. Neither the name of The NetBSD Foundation nor the names of its
   23  *    contributors may be used to endorse or promote products derived
   24  *    from this software without specific prior written permission.
   25  *
   26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   36  * POSSIBILITY OF SUCH DAMAGE.
   37  */
   38 
   39 #include <sys/cdefs.h>
   40 __FBSDID("$FreeBSD: releng/10.2/sys/powerpc/powerpc/bus_machdep.c 265996 2014-05-14 00:51:26Z ian $");
   41 
   42 #define KTR_BE_IO       0
   43 #define KTR_LE_IO       0
   44 
   45 #include <sys/param.h>
   46 #include <sys/systm.h>
   47 #include <sys/bus.h>
   48 #include <sys/ktr.h>
   49 #include <vm/vm.h>
   50 #include <vm/pmap.h>
   51 
   52 #include <machine/bus.h>
   53 #include <machine/pio.h>
   54 #include <machine/md_var.h>
   55 
   56 #define TODO panic("%s: not implemented", __func__)
   57 
   58 #define MAX_EARLYBOOT_MAPPINGS  6
   59 
   60 static struct {
   61         vm_offset_t virt;
   62         bus_addr_t addr;
   63         bus_size_t size;
   64         int flags;
   65 } earlyboot_mappings[MAX_EARLYBOOT_MAPPINGS];
   66 static int earlyboot_map_idx = 0;
   67 
   68 void bs_remap_earlyboot(void);
   69 
   70 static __inline void *
   71 __ppc_ba(bus_space_handle_t bsh, bus_size_t ofs)
   72 {
   73         return ((void *)(bsh + ofs));
   74 }
   75 
   76 static int
   77 bs_gen_map(bus_addr_t addr, bus_size_t size, int flags,
   78     bus_space_handle_t *bshp)
   79 {
   80         vm_memattr_t ma;
   81 
   82         /*
   83          * Record what we did if we haven't enabled the MMU yet. We
   84          * will need to remap it as soon as the MMU comes up.
   85          */
   86         if (!pmap_bootstrapped) {
   87                 KASSERT(earlyboot_map_idx < MAX_EARLYBOOT_MAPPINGS,
   88                     ("%s: too many early boot mapping requests", __func__));
   89                 earlyboot_mappings[earlyboot_map_idx].addr = addr;
   90                 earlyboot_mappings[earlyboot_map_idx].virt =
   91                     pmap_early_io_map(addr, size);
   92                 earlyboot_mappings[earlyboot_map_idx].size = size;
   93                 earlyboot_mappings[earlyboot_map_idx].flags = flags;
   94                 *bshp = earlyboot_mappings[earlyboot_map_idx].virt;
   95                 earlyboot_map_idx++;
   96         } else {
   97                 ma = VM_MEMATTR_DEFAULT;
   98                 switch (flags) {
   99                         case BUS_SPACE_MAP_CACHEABLE:
  100                                 ma = VM_MEMATTR_CACHEABLE;
  101                                 break;
  102                         case BUS_SPACE_MAP_PREFETCHABLE:
  103                                 ma = VM_MEMATTR_PREFETCHABLE;
  104                                 break;
  105                 }
  106                 *bshp = (bus_space_handle_t)pmap_mapdev_attr(addr, size, ma);
  107         }
  108 
  109         return (0);
  110 }
  111 
  112 void
  113 bs_remap_earlyboot(void)
  114 {
  115         int i;
  116         vm_offset_t pa, spa, va;
  117         vm_memattr_t ma;
  118 
  119         for (i = 0; i < earlyboot_map_idx; i++) {
  120                 spa = earlyboot_mappings[i].addr;
  121                 if (spa == earlyboot_mappings[i].virt &&
  122                    pmap_dev_direct_mapped(spa, earlyboot_mappings[i].size) == 0)
  123                         continue;
  124 
  125                 ma = VM_MEMATTR_DEFAULT;
  126                 switch (earlyboot_mappings[i].flags) {
  127                         case BUS_SPACE_MAP_CACHEABLE:
  128                                 ma = VM_MEMATTR_CACHEABLE;
  129                                 break;
  130                         case BUS_SPACE_MAP_PREFETCHABLE:
  131                                 ma = VM_MEMATTR_PREFETCHABLE;
  132                                 break;
  133                 }
  134 
  135                 pa = trunc_page(spa);
  136                 va = trunc_page(earlyboot_mappings[i].virt);
  137                 while (pa < spa + earlyboot_mappings[i].size) {
  138                         pmap_kenter_attr(va, pa, ma);
  139                         va += PAGE_SIZE;
  140                         pa += PAGE_SIZE;
  141                 }
  142         }
  143 }
  144 
  145 static void
  146 bs_gen_unmap(bus_size_t size __unused)
  147 {
  148 }
  149 
  150 static int
  151 bs_gen_subregion(bus_space_handle_t bsh, bus_size_t ofs,
  152     bus_size_t size __unused, bus_space_handle_t *nbshp)
  153 {
  154         *nbshp = bsh + ofs;
  155         return (0);
  156 }
  157 
  158 static int
  159 bs_gen_alloc(bus_addr_t rstart __unused, bus_addr_t rend __unused,
  160     bus_size_t size __unused, bus_size_t alignment __unused,
  161     bus_size_t boundary __unused, int flags __unused,
  162     bus_addr_t *bpap __unused, bus_space_handle_t *bshp __unused)
  163 {
  164         TODO;
  165 }
  166 
  167 static void
  168 bs_gen_free(bus_space_handle_t bsh __unused, bus_size_t size __unused)
  169 {
  170         TODO;
  171 }
  172 
  173 static void
  174 bs_gen_barrier(bus_space_handle_t bsh __unused, bus_size_t ofs __unused,
  175     bus_size_t size __unused, int flags __unused)
  176 {
  177 
  178         powerpc_iomb();
  179 }
  180 
  181 /*
  182  * Big-endian access functions
  183  */
  184 static uint8_t
  185 bs_be_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
  186 {
  187         volatile uint8_t *addr;
  188         uint8_t res;
  189 
  190         addr = __ppc_ba(bsh, ofs);
  191         res = *addr;
  192         powerpc_iomb();
  193         CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
  194         return (res);
  195 }
  196 
  197 static uint16_t
  198 bs_be_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
  199 {
  200         volatile uint16_t *addr;
  201         uint16_t res;
  202 
  203         addr = __ppc_ba(bsh, ofs);
  204         res = *addr;
  205         powerpc_iomb();
  206         CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
  207         return (res);
  208 }
  209 
  210 static uint32_t
  211 bs_be_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
  212 {
  213         volatile uint32_t *addr;
  214         uint32_t res;
  215 
  216         addr = __ppc_ba(bsh, ofs);
  217         res = *addr;
  218         powerpc_iomb();
  219         CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
  220         return (res);
  221 }
  222 
  223 static uint64_t
  224 bs_be_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
  225 {
  226         volatile uint64_t *addr;
  227         uint64_t res;
  228 
  229         addr = __ppc_ba(bsh, ofs);
  230         res = *addr;
  231         powerpc_iomb();
  232         return (res);
  233 }
  234 
  235 static void
  236 bs_be_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
  237 {
  238         ins8(__ppc_ba(bsh, ofs), addr, cnt);
  239 }
  240 
  241 static void
  242 bs_be_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
  243 {
  244         ins16(__ppc_ba(bsh, ofs), addr, cnt);
  245 }
  246 
  247 static void
  248 bs_be_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
  249 {
  250         ins32(__ppc_ba(bsh, ofs), addr, cnt);
  251 }
  252 
  253 static void
  254 bs_be_rm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
  255 {
  256         ins64(__ppc_ba(bsh, ofs), addr, cnt);
  257 }
  258 
  259 static void
  260 bs_be_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
  261 {
  262         volatile uint8_t *s = __ppc_ba(bsh, ofs);
  263 
  264         while (cnt--)
  265                 *addr++ = *s++;
  266         powerpc_iomb();
  267 }
  268 
  269 static void
  270 bs_be_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
  271 {
  272         volatile uint16_t *s = __ppc_ba(bsh, ofs);
  273 
  274         while (cnt--)
  275                 *addr++ = *s++;
  276         powerpc_iomb();
  277 }
  278 
  279 static void
  280 bs_be_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
  281 {
  282         volatile uint32_t *s = __ppc_ba(bsh, ofs);
  283 
  284         while (cnt--)
  285                 *addr++ = *s++;
  286         powerpc_iomb();
  287 }
  288 
  289 static void
  290 bs_be_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
  291 {
  292         volatile uint64_t *s = __ppc_ba(bsh, ofs);
  293 
  294         while (cnt--)
  295                 *addr++ = *s++;
  296         powerpc_iomb();
  297 }
  298 
  299 static void
  300 bs_be_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
  301 {
  302         volatile uint8_t *addr;
  303 
  304         addr = __ppc_ba(bsh, ofs);
  305         *addr = val;
  306         powerpc_iomb();
  307         CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
  308 }
  309 
  310 static void
  311 bs_be_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
  312 {
  313         volatile uint16_t *addr;
  314 
  315         addr = __ppc_ba(bsh, ofs);
  316         *addr = val;
  317         powerpc_iomb();
  318         CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
  319 }
  320 
  321 static void
  322 bs_be_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
  323 {
  324         volatile uint32_t *addr;
  325 
  326         addr = __ppc_ba(bsh, ofs);
  327         *addr = val;
  328         powerpc_iomb();
  329         CTR4(KTR_BE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
  330 }
  331 
  332 static void
  333 bs_be_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
  334 {
  335         volatile uint64_t *addr;
  336 
  337         addr = __ppc_ba(bsh, ofs);
  338         *addr = val;
  339         powerpc_iomb();
  340 }
  341 
  342 static void
  343 bs_be_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
  344     bus_size_t cnt)
  345 {
  346         outsb(__ppc_ba(bsh, ofs), addr, cnt);
  347 }
  348 
  349 static void
  350 bs_be_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
  351     bus_size_t cnt)
  352 {
  353         outsw(__ppc_ba(bsh, ofs), addr, cnt);
  354 }
  355 
  356 static void
  357 bs_be_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
  358     bus_size_t cnt)
  359 {
  360         outsl(__ppc_ba(bsh, ofs), addr, cnt);
  361 }
  362 
  363 static void
  364 bs_be_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
  365     bus_size_t cnt)
  366 {
  367         outsll(__ppc_ba(bsh, ofs), addr, cnt);
  368 }
  369 
  370 static void
  371 bs_be_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
  372     size_t cnt)
  373 {
  374         volatile uint8_t *d = __ppc_ba(bsh, ofs);
  375 
  376         while (cnt--)
  377                 *d++ = *addr++;
  378         powerpc_iomb();
  379 }
  380 
  381 static void
  382 bs_be_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
  383     size_t cnt)
  384 {
  385         volatile uint16_t *d = __ppc_ba(bsh, ofs);
  386 
  387         while (cnt--)
  388                 *d++ = *addr++;
  389         powerpc_iomb();
  390 }
  391 
  392 static void
  393 bs_be_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
  394     size_t cnt)
  395 {
  396         volatile uint32_t *d = __ppc_ba(bsh, ofs);
  397 
  398         while (cnt--)
  399                 *d++ = *addr++;
  400         powerpc_iomb();
  401 }
  402 
  403 static void
  404 bs_be_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
  405     size_t cnt)
  406 {
  407         volatile uint64_t *d = __ppc_ba(bsh, ofs);
  408 
  409         while (cnt--)
  410                 *d++ = *addr++;
  411         powerpc_iomb();
  412 }
  413 
  414 static void
  415 bs_be_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
  416 {
  417         volatile uint8_t *d = __ppc_ba(bsh, ofs);
  418 
  419         while (cnt--)
  420                 *d = val;
  421         powerpc_iomb();
  422 }
  423 
  424 static void
  425 bs_be_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
  426 {
  427         volatile uint16_t *d = __ppc_ba(bsh, ofs);
  428 
  429         while (cnt--)
  430                 *d = val;
  431         powerpc_iomb();
  432 }
  433 
  434 static void
  435 bs_be_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
  436 {
  437         volatile uint32_t *d = __ppc_ba(bsh, ofs);
  438 
  439         while (cnt--)
  440                 *d = val;
  441         powerpc_iomb();
  442 }
  443 
  444 static void
  445 bs_be_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
  446 {
  447         volatile uint64_t *d = __ppc_ba(bsh, ofs);
  448 
  449         while (cnt--)
  450                 *d = val;
  451         powerpc_iomb();
  452 }
  453 
  454 static void
  455 bs_be_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
  456 {
  457         volatile uint8_t *d = __ppc_ba(bsh, ofs);
  458 
  459         while (cnt--)
  460                 *d++ = val;
  461         powerpc_iomb();
  462 }
  463 
  464 static void
  465 bs_be_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
  466 {
  467         volatile uint16_t *d = __ppc_ba(bsh, ofs);
  468 
  469         while (cnt--)
  470                 *d++ = val;
  471         powerpc_iomb();
  472 }
  473 
  474 static void
  475 bs_be_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
  476 {
  477         volatile uint32_t *d = __ppc_ba(bsh, ofs);
  478 
  479         while (cnt--)
  480                 *d++ = val;
  481         powerpc_iomb();
  482 }
  483 
  484 static void
  485 bs_be_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
  486 {
  487         volatile uint64_t *d = __ppc_ba(bsh, ofs);
  488 
  489         while (cnt--)
  490                 *d++ = val;
  491         powerpc_iomb();
  492 }
  493 
  494 /*
  495  * Little-endian access functions
  496  */
  497 static uint8_t
  498 bs_le_rs_1(bus_space_handle_t bsh, bus_size_t ofs)
  499 {
  500         volatile uint8_t *addr;
  501         uint8_t res;
  502 
  503         addr = __ppc_ba(bsh, ofs);
  504         res = *addr;
  505         powerpc_iomb();
  506         CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
  507         return (res);
  508 }
  509 
  510 static uint16_t
  511 bs_le_rs_2(bus_space_handle_t bsh, bus_size_t ofs)
  512 {
  513         volatile uint16_t *addr;
  514         uint16_t res;
  515 
  516         addr = __ppc_ba(bsh, ofs);
  517         __asm __volatile("lhbrx %0, 0, %1" : "=r"(res) : "r"(addr));
  518         powerpc_iomb();
  519         CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
  520         return (res);
  521 }
  522 
  523 static uint32_t
  524 bs_le_rs_4(bus_space_handle_t bsh, bus_size_t ofs)
  525 {
  526         volatile uint32_t *addr;
  527         uint32_t res;
  528 
  529         addr = __ppc_ba(bsh, ofs);
  530         __asm __volatile("lwbrx %0, 0, %1" : "=r"(res) : "r"(addr));
  531         powerpc_iomb();
  532         CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x) = %#x", __func__, bsh, ofs, res);
  533         return (res);
  534 }
  535 
  536 static uint64_t
  537 bs_le_rs_8(bus_space_handle_t bsh, bus_size_t ofs)
  538 {
  539         TODO;
  540 }
  541 
  542 static void
  543 bs_le_rm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
  544 {
  545         ins8(__ppc_ba(bsh, ofs), addr, cnt);
  546 }
  547 
  548 static void
  549 bs_le_rm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
  550 {
  551         ins16rb(__ppc_ba(bsh, ofs), addr, cnt);
  552 }
  553 
  554 static void
  555 bs_le_rm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
  556 {
  557         ins32rb(__ppc_ba(bsh, ofs), addr, cnt);
  558 }
  559 
  560 static void
  561 bs_le_rm_8(bus_space_handle_t bshh, bus_size_t ofs, uint64_t *addr, size_t cnt)
  562 {
  563         TODO;
  564 }
  565 
  566 static void
  567 bs_le_rr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t *addr, size_t cnt)
  568 {
  569         volatile uint8_t *s = __ppc_ba(bsh, ofs);
  570 
  571         while (cnt--)
  572                 *addr++ = *s++;
  573         powerpc_iomb();
  574 }
  575 
  576 static void
  577 bs_le_rr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t *addr, size_t cnt)
  578 {
  579         volatile uint16_t *s = __ppc_ba(bsh, ofs);
  580 
  581         while (cnt--)
  582                 *addr++ = in16rb(s++);
  583         powerpc_iomb();
  584 }
  585 
  586 static void
  587 bs_le_rr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t *addr, size_t cnt)
  588 {
  589         volatile uint32_t *s = __ppc_ba(bsh, ofs);
  590 
  591         while (cnt--)
  592                 *addr++ = in32rb(s++);
  593         powerpc_iomb();
  594 }
  595 
  596 static void
  597 bs_le_rr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t *addr, size_t cnt)
  598 {
  599         TODO;
  600 }
  601 
  602 static void
  603 bs_le_ws_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val)
  604 {
  605         volatile uint8_t *addr;
  606 
  607         addr = __ppc_ba(bsh, ofs);
  608         *addr = val;
  609         powerpc_iomb();
  610         CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
  611 }
  612 
  613 static void
  614 bs_le_ws_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val)
  615 {
  616         volatile uint16_t *addr;
  617  
  618         addr = __ppc_ba(bsh, ofs);
  619         __asm __volatile("sthbrx %0, 0, %1" :: "r"(val), "r"(addr));
  620         powerpc_iomb();
  621         CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
  622 }
  623 
  624 static void
  625 bs_le_ws_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val)
  626 {
  627         volatile uint32_t *addr;
  628 
  629         addr = __ppc_ba(bsh, ofs);
  630         __asm __volatile("stwbrx %0, 0, %1" :: "r"(val), "r"(addr));
  631         powerpc_iomb();
  632         CTR4(KTR_LE_IO, "%s(bsh=%#x, ofs=%#x, val=%#x)", __func__, bsh, ofs, val);
  633 }
  634 
  635 static void
  636 bs_le_ws_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val)
  637 {
  638         TODO;
  639 }
  640 
  641 static void
  642 bs_le_wm_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
  643     bus_size_t cnt)
  644 {
  645         outs8(__ppc_ba(bsh, ofs), addr, cnt);
  646 }
  647 
  648 static void
  649 bs_le_wm_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
  650     bus_size_t cnt)
  651 {
  652         outs16rb(__ppc_ba(bsh, ofs), addr, cnt);
  653 }
  654 
  655 static void
  656 bs_le_wm_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
  657     bus_size_t cnt)
  658 {
  659         outs32rb(__ppc_ba(bsh, ofs), addr, cnt);
  660 }
  661 
  662 static void
  663 bs_le_wm_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
  664     bus_size_t cnt)
  665 {
  666         TODO;
  667 }
  668 
  669 static void
  670 bs_le_wr_1(bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *addr,
  671     size_t cnt)
  672 {
  673         volatile uint8_t *d = __ppc_ba(bsh, ofs);
  674 
  675         while (cnt--)
  676                 *d++ = *addr++;
  677         powerpc_iomb();
  678 }
  679 
  680 static void
  681 bs_le_wr_2(bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *addr,
  682     size_t cnt)
  683 {
  684         volatile uint16_t *d = __ppc_ba(bsh, ofs);
  685 
  686         while (cnt--)
  687                 out16rb(d++, *addr++);
  688         powerpc_iomb();
  689 }
  690 
  691 static void
  692 bs_le_wr_4(bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *addr,
  693     size_t cnt)
  694 {
  695         volatile uint32_t *d = __ppc_ba(bsh, ofs);
  696 
  697         while (cnt--)
  698                 out32rb(d++, *addr++);
  699         powerpc_iomb();
  700 }
  701 
  702 static void
  703 bs_le_wr_8(bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *addr,
  704     size_t cnt)
  705 {
  706         TODO;
  707 }
  708 
  709 static void
  710 bs_le_sm_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
  711 {
  712         volatile uint8_t *d = __ppc_ba(bsh, ofs);
  713 
  714         while (cnt--)
  715                 *d = val;
  716         powerpc_iomb();
  717 }
  718 
  719 static void
  720 bs_le_sm_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
  721 {
  722         volatile uint16_t *d = __ppc_ba(bsh, ofs);
  723 
  724         while (cnt--)
  725                 out16rb(d, val);
  726         powerpc_iomb();
  727 }
  728 
  729 static void
  730 bs_le_sm_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
  731 {
  732         volatile uint32_t *d = __ppc_ba(bsh, ofs);
  733 
  734         while (cnt--)
  735                 out32rb(d, val);
  736         powerpc_iomb();
  737 }
  738 
  739 static void
  740 bs_le_sm_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
  741 {
  742         TODO;
  743 }
  744 
  745 static void
  746 bs_le_sr_1(bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t cnt)
  747 {
  748         volatile uint8_t *d = __ppc_ba(bsh, ofs);
  749 
  750         while (cnt--)
  751                 *d++ = val;
  752         powerpc_iomb();
  753 }
  754 
  755 static void
  756 bs_le_sr_2(bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t cnt)
  757 {
  758         volatile uint16_t *d = __ppc_ba(bsh, ofs);
  759 
  760         while (cnt--)
  761                 out16rb(d++, val);
  762         powerpc_iomb();
  763 }
  764 
  765 static void
  766 bs_le_sr_4(bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t cnt)
  767 {
  768         volatile uint32_t *d = __ppc_ba(bsh, ofs);
  769 
  770         while (cnt--)
  771                 out32rb(d++, val);
  772         powerpc_iomb();
  773 }
  774 
  775 static void
  776 bs_le_sr_8(bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t cnt)
  777 {
  778         TODO;
  779 }
  780 
  781 struct bus_space bs_be_tag = {
  782         /* mapping/unmapping */
  783         bs_gen_map,
  784         bs_gen_unmap,
  785         bs_gen_subregion,
  786 
  787         /* allocation/deallocation */
  788         bs_gen_alloc,
  789         bs_gen_free,
  790 
  791         /* barrier */
  792         bs_gen_barrier,
  793 
  794         /* read (single) */
  795         bs_be_rs_1,
  796         bs_be_rs_2,
  797         bs_be_rs_4,
  798         bs_be_rs_8,
  799 
  800         bs_be_rs_2,
  801         bs_be_rs_4,
  802         bs_be_rs_8,
  803 
  804         /* read multiple */
  805         bs_be_rm_1,
  806         bs_be_rm_2,
  807         bs_be_rm_4,
  808         bs_be_rm_8,
  809 
  810         bs_be_rm_2,
  811         bs_be_rm_4,
  812         bs_be_rm_8,
  813 
  814         /* read region */
  815         bs_be_rr_1,
  816         bs_be_rr_2,
  817         bs_be_rr_4,
  818         bs_be_rr_8,
  819 
  820         bs_be_rr_2,
  821         bs_be_rr_4,
  822         bs_be_rr_8,
  823 
  824         /* write (single) */
  825         bs_be_ws_1,
  826         bs_be_ws_2,
  827         bs_be_ws_4,
  828         bs_be_ws_8,
  829 
  830         bs_be_ws_2,
  831         bs_be_ws_4,
  832         bs_be_ws_8,
  833 
  834         /* write multiple */
  835         bs_be_wm_1,
  836         bs_be_wm_2,
  837         bs_be_wm_4,
  838         bs_be_wm_8,
  839 
  840         bs_be_wm_2,
  841         bs_be_wm_4,
  842         bs_be_wm_8,
  843 
  844         /* write region */
  845         bs_be_wr_1,
  846         bs_be_wr_2,
  847         bs_be_wr_4,
  848         bs_be_wr_8,
  849 
  850         bs_be_wr_2,
  851         bs_be_wr_4,
  852         bs_be_wr_8,
  853 
  854         /* set multiple */
  855         bs_be_sm_1,
  856         bs_be_sm_2,
  857         bs_be_sm_4,
  858         bs_be_sm_8,
  859 
  860         bs_be_sm_2,
  861         bs_be_sm_4,
  862         bs_be_sm_8,
  863 
  864         /* set region */
  865         bs_be_sr_1,
  866         bs_be_sr_2,
  867         bs_be_sr_4,
  868         bs_be_sr_8,
  869 
  870         bs_be_sr_2,
  871         bs_be_sr_4,
  872         bs_be_sr_8,
  873 };
  874 
  875 struct bus_space bs_le_tag = {
  876         /* mapping/unmapping */
  877         bs_gen_map,
  878         bs_gen_unmap,
  879         bs_gen_subregion,
  880 
  881         /* allocation/deallocation */
  882         bs_gen_alloc,
  883         bs_gen_free,
  884 
  885         /* barrier */
  886         bs_gen_barrier,
  887 
  888         /* read (single) */
  889         bs_le_rs_1,
  890         bs_le_rs_2,
  891         bs_le_rs_4,
  892         bs_le_rs_8,
  893 
  894         bs_be_rs_2,
  895         bs_be_rs_4,
  896         bs_be_rs_8,
  897 
  898         /* read multiple */
  899         bs_le_rm_1,
  900         bs_le_rm_2,
  901         bs_le_rm_4,
  902         bs_le_rm_8,
  903 
  904         bs_be_rm_2,
  905         bs_be_rm_4,
  906         bs_be_rm_8,
  907 
  908         /* read region */
  909         bs_le_rr_1,
  910         bs_le_rr_2,
  911         bs_le_rr_4,
  912         bs_le_rr_8,
  913 
  914         bs_be_rr_2,
  915         bs_be_rr_4,
  916         bs_be_rr_8,
  917 
  918         /* write (single) */
  919         bs_le_ws_1,
  920         bs_le_ws_2,
  921         bs_le_ws_4,
  922         bs_le_ws_8,
  923 
  924         bs_be_ws_2,
  925         bs_be_ws_4,
  926         bs_be_ws_8,
  927 
  928         /* write multiple */
  929         bs_le_wm_1,
  930         bs_le_wm_2,
  931         bs_le_wm_4,
  932         bs_le_wm_8,
  933 
  934         bs_be_wm_2,
  935         bs_be_wm_4,
  936         bs_be_wm_8,
  937 
  938         /* write region */
  939         bs_le_wr_1,
  940         bs_le_wr_2,
  941         bs_le_wr_4,
  942         bs_le_wr_8,
  943 
  944         bs_be_wr_2,
  945         bs_be_wr_4,
  946         bs_be_wr_8,
  947 
  948         /* set multiple */
  949         bs_le_sm_1,
  950         bs_le_sm_2,
  951         bs_le_sm_4,
  952         bs_le_sm_8,
  953 
  954         bs_be_sm_2,
  955         bs_be_sm_4,
  956         bs_be_sm_8,
  957 
  958         /* set region */
  959         bs_le_sr_1,
  960         bs_le_sr_2,
  961         bs_le_sr_4,
  962         bs_le_sr_8,
  963 
  964         bs_be_sr_2,
  965         bs_be_sr_4,
  966         bs_be_sr_8,
  967 };

Cache object: 6fb0453ed4bf83980dd29c458456abdb


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.