1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/pkg/devices/util/src/memory.cc Sun May 13 01:34:16 2018 +0200
1.3 @@ -0,0 +1,78 @@
1.4 +/*
1.5 + * Memory allocation utility functions.
1.6 + *
1.7 + * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
1.8 + *
1.9 + * This program is free software; you can redistribute it and/or
1.10 + * modify it under the terms of the GNU General Public License as
1.11 + * published by the Free Software Foundation; either version 2 of
1.12 + * the License, or (at your option) any later version.
1.13 + *
1.14 + * This program is distributed in the hope that it will be useful,
1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.17 + * GNU General Public License for more details.
1.18 + *
1.19 + * You should have received a copy of the GNU General Public License
1.20 + * along with this program; if not, write to the Free Software
1.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor,
1.22 + * Boston, MA 02110-1301, USA
1.23 + */
1.24 +
1.25 +#include <l4/io/io.h>
1.26 +#include <l4/re/env.h>
1.27 +#include <l4/re/c/mem_alloc.h>
1.28 +#include <l4/re/c/util/cap_alloc.h>
1.29 +#include <l4/util/util.h>
1.30 +#include <l4/vbus/vbus.h>
1.31 +
1.32 +#include "memory.h"
1.33 +
1.34 +int get_device(char const *hid, l4io_device_handle_t *dh, l4io_resource_handle_t *rh)
1.35 +{
1.36 + return l4io_lookup_device(hid, dh, 0, rh);
1.37 +}
1.38 +
1.39 +int get_resource(l4io_device_handle_t dh, l4io_resource_t *res,
1.40 + enum l4io_resource_types_t type)
1.41 +{
1.42 + int current = 0, result = 0;
1.43 + l4_cap_idx_t vbus = l4re_env_get_cap("vbus");
1.44 +
1.45 + do
1.46 + {
1.47 + result = l4vbus_get_resource(vbus, dh, current, res);
1.48 + current++;
1.49 + }
1.50 + while ((!result) && (res->type != type));
1.51 +
1.52 + return result;
1.53 +}
1.54 +
1.55 +int get_memory(char const *hid, l4_addr_t *start, l4_addr_t *end)
1.56 +{
1.57 + l4io_device_handle_t dh;
1.58 + l4io_resource_handle_t rh;
1.59 + l4io_resource_t res;
1.60 + int result;
1.61 +
1.62 + result = get_device(hid, &dh, &rh);
1.63 +
1.64 + if (result < 0)
1.65 + return result;
1.66 +
1.67 + result = get_resource(dh, &res, L4IO_RESOURCE_MEM);
1.68 +
1.69 + if (result)
1.70 + return result;
1.71 +
1.72 + result = l4io_request_iomem(res.start, res.end - res.start + 1,
1.73 + L4IO_MEM_NONCACHED, start);
1.74 +
1.75 + if (result)
1.76 + return result;
1.77 +
1.78 + *end = *start + (res.end - res.start + 1);
1.79 +
1.80 + return 0;
1.81 +}