From patchwork Tue Jul 10 13:32:16 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 9932 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 07BF523E4F for ; Tue, 10 Jul 2012 13:32:23 +0000 (UTC) Received: from mail-qa0-f45.google.com (mail-qa0-f45.google.com [209.85.216.45]) by fiordland.canonical.com (Postfix) with ESMTP id A813DA187BE for ; Tue, 10 Jul 2012 13:32:22 +0000 (UTC) Received: by qaeb19 with SMTP id b19so2376424qae.11 for ; Tue, 10 Jul 2012 06:32:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:x-gm-message-state; bh=1aLuNUGgJA18v05AG0HRQtsSB9RpO5P0QvuT7huJ2Po=; b=U07NCFNOSP1wlOCAkYZ9iLsrdKMta85IcVIrzo62iIDTQ0DQhHsoXJ7pyL7UO23cil 8hWGmHXP1dQQf6TZgX8QueVmhpXDBIEwWvvBw0IzWiSqgeS7QZo+pS03RsdRdhjLHB+U 9+ayW1b/84jPkKNRpnA3A9zr9dRHfbPd8NsrEcwyGy7X5wxV+GBcDe3XMkscn5mitHs+ YNhQuKw8PVekR5WESME+r/8nUX9NqLhWoCk+jCxIVwyjfnMjHrPJbL45fiI3/5lgDdd5 IvUHcvIA2tNmIccBrGnerMsSw93LhZNHNMzixhvBOmoi/5fjoAszz737nxsWJamEdQGn lGzg== Received: by 10.50.163.99 with SMTP id yh3mr11049213igb.53.1341927141864; Tue, 10 Jul 2012 06:32:21 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.24.148 with SMTP id v20csp49281ibb; Tue, 10 Jul 2012 06:32:21 -0700 (PDT) Received: by 10.180.102.136 with SMTP id fo8mr38299637wib.19.1341927140708; Tue, 10 Jul 2012 06:32:20 -0700 (PDT) Received: from mnementh.archaic.org.uk (mnementh.archaic.org.uk. [81.2.115.146]) by mx.google.com with ESMTPS id l2si33133346wic.14.2012.07.10.06.32.19 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 10 Jul 2012 06:32:20 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of pm215@archaic.org.uk designates 81.2.115.146 as permitted sender) client-ip=81.2.115.146; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of pm215@archaic.org.uk designates 81.2.115.146 as permitted sender) smtp.mail=pm215@archaic.org.uk Received: from pm215 by mnementh.archaic.org.uk with local (Exim 4.72) (envelope-from ) id 1SoaY4-00080b-Qn; Tue, 10 Jul 2012 14:32:16 +0100 From: Peter Maydell To: qemu-devel@nongnu.org Cc: patches@linaro.org, Peter Crosthwaite Subject: [PATCH v2] device_tree: Add support for reading device tree properties Date: Tue, 10 Jul 2012 14:32:16 +0100 Message-Id: <1341927136-30762-1-git-send-email-peter.maydell@linaro.org> X-Mailer: git-send-email 1.7.2.5 X-Gm-Message-State: ALoCoQnmerl2+GuLdSxKVCLqWPlFkZbhuJAWAzM4IWBpmt0UG45WBFEQU/7tcpL1vA5iR34myb19 Add support for reading device tree properties (both generic and single-cell ones) to QEMU's convenience wrapper layer. Signed-off-by: Peter Maydell reviewed-by: tag to my v1 patch, then, or was there something --- Here's a v2: * added qemu_devtree_get_one_cell_from_prop() which reads a single cell from a property which is an array of cells * NB that qemu_devtree_getprop() isn't implemented in terms of this because that would give worse error handling. I still think that having this new function is misguided: * nobody's using it * it breaks the current model where functions at the qemu_devtree and libfdt levels deal only with entire properties and do not look inside them to operate on only part of the property value But here's a patch so we can argue about something concrete. device_tree.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ device_tree.h | 6 ++++++ 2 files changed, 55 insertions(+), 0 deletions(-) diff --git a/device_tree.c b/device_tree.c index b366fdd..3a8ff13 100644 --- a/device_tree.c +++ b/device_tree.c @@ -178,6 +178,55 @@ int qemu_devtree_setprop_string(void *fdt, const char *node_path, return r; } +const void *qemu_devtree_getprop(void *fdt, const char *node_path, + const char *property, int *lenp) +{ + int len; + const void *r; + if (!lenp) { + lenp = &len; + } + r = fdt_getprop(fdt, findnode_nofail(fdt, node_path), property, lenp); + if (!r) { + fprintf(stderr, "%s: Couldn't get %s/%s: %s\n", __func__, + node_path, property, fdt_strerror(*lenp)); + exit(1); + } + return r; +} + +uint32_t qemu_devtree_get_one_cell_from_prop(void *fdt, const char *node_path, + const char *property, int idx) +{ + int len; + const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len); + if (len % 4 != 0) { + fprintf(stderr, "%s: %s/%s not multiple of 4 bytes long " + "(not cells?)\n", + __func__, node_path, property); + exit(1); + } + if (len < (idx + 1) * 4) { + fprintf(stderr, "%s: %s/%s wrong length to contain %d cells\n", + __func__, node_path, property, idx + 1); + exit(1); + } + return be32_to_cpu(p[idx]); +} + +uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path, + const char *property) +{ + int len; + const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len); + if (len != 4) { + fprintf(stderr, "%s: %s/%s not 4 bytes long (not a cell?)\n", + __func__, node_path, property); + exit(1); + } + return be32_to_cpu(*p); +} + uint32_t qemu_devtree_get_phandle(void *fdt, const char *path) { uint32_t r; diff --git a/device_tree.h b/device_tree.h index 2244270..86669ea 100644 --- a/device_tree.h +++ b/device_tree.h @@ -28,6 +28,12 @@ int qemu_devtree_setprop_string(void *fdt, const char *node_path, int qemu_devtree_setprop_phandle(void *fdt, const char *node_path, const char *property, const char *target_node_path); +const void *qemu_devtree_getprop(void *fdt, const char *node_path, + const char *property, int *lenp); +uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path, + const char *property); +uint32_t qemu_devtree_get_one_cell_from_prop(void *fdt, const char *node_path, + const char *property, int idx); uint32_t qemu_devtree_get_phandle(void *fdt, const char *path); uint32_t qemu_devtree_alloc_phandle(void *fdt); int qemu_devtree_nop_node(void *fdt, const char *node_path);