Changeset 0f1d2f6 in rtems-libbsd


Ignore:
Timestamp:
Jan 10, 2018, 12:18:05 PM (17 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
eeb3fd5d9b07ac9a2e280cff60a1b762bd273a8d, 1e989998de954bef51e6c19cc3d64d39f32100aa
Children:
e4923c8
Parents:
81fc57d
git-author:
Sebastian Huber <sebastian.huber@…> (01/10/18 12:18:05)
git-committer:
Sebastian Huber <sebastian.huber@…> (01/23/18 13:54:56)
Message:

linux/of_address.h: Add of_translate_address()

Update #3277.

Location:
rtemsbsd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • rtemsbsd/powerpc/include/linux/of.h

    r81fc57d r0f1d2f6  
    11/*
    2  * Copyright (c) 2015, 2017 embedded brains GmbH
     2 * Copyright (c) 2015, 2018 embedded brains GmbH
    33 * All rights reserved.
    44 *
     
    3535extern "C" {
    3636#endif /* __cplusplus */
     37
     38#define OF_BAD_ADDR ((uint64_t)-1)
    3739
    3840typedef uint32_t phandle;
  • rtemsbsd/powerpc/include/linux/of_address.h

    r81fc57d r0f1d2f6  
    11/*
    2  * Copyright (c) 2015 embedded brains GmbH
     2 * Copyright (c) 2015, 2018 embedded brains GmbH
    33 * All rights reserved.
    44 *
     
    3535#endif /* __cplusplus */
    3636
     37uint64_t of_translate_address(struct device_node *dn, const uint32_t *addr);
     38
    3739int of_address_to_resource(struct device_node *dn, int index,
    3840    struct resource *res);
  • rtemsbsd/sys/powerpc/compat.c

    r81fc57d r0f1d2f6  
    33
    44/*
    5  * Copyright (c) 2015 embedded brains GmbH
     5 * Copyright (c) 2015, 2018 embedded brains GmbH
    66 * All rights reserved.
    77 *
     
    251251}
    252252
     253static uint64_t
     254translate_address(const char *fdt, int node, int ac, int sc,
     255    const uint32_t *addr)
     256{
     257        int pac;
     258        int psc;
     259        uint64_t taddr;
     260
     261        taddr = of_read_number(addr, ac);
     262
     263        node = fdt_parent_offset(fdt, node);
     264        if (node < 0)
     265                return (OF_BAD_ADDR);
     266
     267        for (;;) {
     268                int len;
     269                int parent;
     270                const uint32_t *ranges;
     271                uint64_t offset;
     272
     273                parent = fdt_parent_offset(fdt, node);
     274                if (parent < 0)
     275                        break;
     276
     277                pac = get_address_cells(fdt, parent);
     278                if (pac < 0)
     279                        return (OF_BAD_ADDR);
     280
     281                psc = get_size_cells(fdt, parent);
     282                if (psc < 0)
     283                        return (OF_BAD_ADDR);
     284
     285                ranges = fdt_getprop(fdt, node, "ranges", &len);
     286                if (ranges == NULL || len == 0)
     287                        break;
     288
     289                if (len != (ac + pac + sc) * 4)
     290                        return (OF_BAD_ADDR);
     291
     292                if (of_read_number(&ranges[0], ac) != 0)
     293                        return (OF_BAD_ADDR);
     294
     295                offset = of_read_number(&ranges[ac], pac);
     296                taddr += offset;
     297
     298                node = parent;
     299                ac = pac;
     300                sc = psc;
     301        }
     302
     303        return (taddr);
     304}
     305
     306uint64_t
     307of_translate_address(struct device_node *dn, const uint32_t *addr)
     308{
     309        const void *fdt = bsp_fdt_get();
     310        int node;
     311        int ac;
     312        int sc;
     313
     314        node = dn->offset;
     315
     316        ac = get_address_cells(fdt, node);
     317        if (ac < 0)
     318                return (OF_BAD_ADDR);
     319
     320        sc = get_size_cells(fdt, node);
     321        if (sc < 0)
     322                return (OF_BAD_ADDR);
     323
     324        return (translate_address(fdt, node, ac, sc, addr));
     325}
     326
    253327int
    254328of_address_to_resource(struct device_node *dn, int index,
Note: See TracChangeset for help on using the changeset viewer.