From patchwork Wed Jun 19 16:30:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Dooks X-Patchwork-Id: 2750511 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 407C89F8E1 for ; Wed, 19 Jun 2013 16:34:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id F1CA420291 for ; Wed, 19 Jun 2013 16:34:46 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0277E200F2 for ; Wed, 19 Jun 2013 16:34:42 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpLIt-00013E-IF; Wed, 19 Jun 2013 16:32:18 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpLI9-0007dv-QW; Wed, 19 Jun 2013 16:31:29 +0000 Received: from ducie-dc1.codethink.co.uk ([37.128.190.40]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UpLHI-0007Wv-UE for linux-arm-kernel@lists.infradead.org; Wed, 19 Jun 2013 16:30:40 +0000 Received: by ducie-dc1.codethink.co.uk (Postfix, from userid 1002) id BA47946BD2C; Wed, 19 Jun 2013 17:30:17 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-5.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from rainbowdash.ducie.codethink.co.uk (rainbowdash.dyn.ducie.codethink.co.uk [192.168.24.134]) by ducie-dc1.codethink.co.uk (Postfix) with ESMTPS id 0D18D46B945; Wed, 19 Jun 2013 17:30:16 +0100 (BST) Received: from ben by rainbowdash.ducie.codethink.co.uk with local (Exim 4.80) (envelope-from ) id 1UpLGw-0005GY-05; Wed, 19 Jun 2013 17:30:14 +0100 From: Ben Dooks To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 5/6] ARM: fixup atags to be endian agnostic Date: Wed, 19 Jun 2013 17:30:02 +0100 Message-Id: <1371659404-20167-6-git-send-email-ben.dooks@codethink.co.uk> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1371659404-20167-1-git-send-email-ben.dooks@codethink.co.uk> References: <1371659404-20167-1-git-send-email-ben.dooks@codethink.co.uk> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130619_123037_345152_9730BAE0 X-CRM114-Status: GOOD ( 18.51 ) X-Spam-Score: -3.2 (---) Cc: Ben Dooks X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Use the atag32_to_cpu() function to allow the main atag handling code to be agnostic of any endian configuration. Signed-of-by: Ben Dooks --- arch/arm/kernel/atags_parse.c | 51 +++++++++++++++++++++-------------------- arch/arm/kernel/atags_proc.c | 6 ++--- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/arch/arm/kernel/atags_parse.c b/arch/arm/kernel/atags_parse.c index 14512e6..312899b 100644 --- a/arch/arm/kernel/atags_parse.c +++ b/arch/arm/kernel/atags_parse.c @@ -43,19 +43,19 @@ static struct { struct tag_mem32 mem; struct tag_header hdr3; } default_tags __initdata = { - { tag_size(tag_core), ATAG_CORE }, - { 1, PAGE_SIZE, 0xff }, - { tag_size(tag_mem32), ATAG_MEM }, - { MEM_SIZE }, - { 0, ATAG_NONE } + { cpu_to_atag32(tag_size(tag_core)), cpu_to_atag32(ATAG_CORE) }, + { cpu_to_atag32(1), atag32_to_cpu(PAGE_SIZE), cpu_to_atag32(0xff) }, + { cpu_to_atag32(tag_size(tag_mem32)), cpu_to_atag32(ATAG_MEM) }, + { cpu_to_atag32(MEM_SIZE) }, + { cpu_to_atag32(0), cpu_to_atag32(ATAG_NONE) } }; static int __init parse_tag_core(const struct tag *tag) { - if (tag->hdr.size > 2) { - if ((tag->u.core.flags & 1) == 0) + if (atag32_to_cpu(tag->hdr.size) > 2) { + if ((atag32_to_cpu(tag->u.core.flags) & 1) == 0) root_mountflags &= ~MS_RDONLY; - ROOT_DEV = old_decode_dev(tag->u.core.rootdev); + ROOT_DEV = old_decode_dev(atag32_to_cpu(tag->u.core.rootdev)); } return 0; } @@ -64,7 +64,7 @@ __tagtable(ATAG_CORE, parse_tag_core); static int __init parse_tag_mem32(const struct tag *tag) { - return arm_add_memory(tag->u.mem.start, tag->u.mem.size); + return arm_add_memory(atag32_to_cpu(tag->u.mem.start), atag32_to_cpu(tag->u.mem.size)); } __tagtable(ATAG_MEM, parse_tag_mem32); @@ -91,13 +91,14 @@ __tagtable(ATAG_VIDEOTEXT, parse_tag_videotext); static int __init parse_tag_ramdisk(const struct tag *tag) { extern int rd_size, rd_image_start, rd_prompt, rd_doload; + unsigned int flags = atag32_to_cpu(tag->u.ramdisk.flags); - rd_image_start = tag->u.ramdisk.start; - rd_doload = (tag->u.ramdisk.flags & 1) == 0; - rd_prompt = (tag->u.ramdisk.flags & 2) == 0; + rd_image_start = atag32_to_cpu(tag->u.ramdisk.start); + rd_doload = (flags & 1) == 0; + rd_prompt = (flags & 2) == 0; - if (tag->u.ramdisk.size) - rd_size = tag->u.ramdisk.size; + if (atag32_to_cpu(tag->u.ramdisk.size)) + rd_size = atag32_to_cpu(tag->u.ramdisk.size); return 0; } @@ -107,8 +108,8 @@ __tagtable(ATAG_RAMDISK, parse_tag_ramdisk); static int __init parse_tag_serialnr(const struct tag *tag) { - system_serial_low = tag->u.serialnr.low; - system_serial_high = tag->u.serialnr.high; + system_serial_low = atag32_to_cpu(tag->u.serialnr.low); + system_serial_high = atag32_to_cpu(tag->u.serialnr.high); return 0; } @@ -116,7 +117,7 @@ __tagtable(ATAG_SERIAL, parse_tag_serialnr); static int __init parse_tag_revision(const struct tag *tag) { - system_rev = tag->u.revision.rev; + system_rev = atag32_to_cpu(tag->u.revision.rev); return 0; } @@ -150,7 +151,7 @@ static int __init parse_tag(const struct tag *tag) struct tagtable *t; for (t = &__tagtable_begin; t < &__tagtable_end; t++) - if (tag->hdr.tag == t->tag) { + if (atag32_to_cpu(tag->hdr.tag) == t->tag) { t->parse(tag); break; } @@ -164,17 +165,17 @@ static int __init parse_tag(const struct tag *tag) */ static void __init parse_tags(const struct tag *t) { - for (; t->hdr.size; t = tag_next(t)) + for_each_tag(t, t) if (!parse_tag(t)) printk(KERN_WARNING "Ignoring unrecognised tag 0x%08x\n", - t->hdr.tag); + atag32_to_cpu(t->hdr.tag)); } static void __init squash_mem_tags(struct tag *tag) { - for (; tag->hdr.size; tag = tag_next(tag)) - if (tag->hdr.tag == ATAG_MEM) + for_each_tag(tag, tag) + if (tag->hdr.tag == atag32_to_cpu(ATAG_MEM)) tag->hdr.tag = ATAG_NONE; } @@ -213,10 +214,10 @@ struct machine_desc * __init setup_machine_tags(phys_addr_t __atags_pointer, * If we have the old style parameters, convert them to * a tag list. */ - if (tags->hdr.tag != ATAG_CORE) + if (tags->hdr.tag != atag32_to_cpu(ATAG_CORE)) convert_to_tag_list(tags); #endif - if (tags->hdr.tag != ATAG_CORE) { + if (tags->hdr.tag != atag32_to_cpu(ATAG_CORE)) { early_print("Warning: Neither atags nor dtb found\n"); tags = (struct tag *)&default_tags; } @@ -224,7 +225,7 @@ struct machine_desc * __init setup_machine_tags(phys_addr_t __atags_pointer, if (mdesc->fixup) mdesc->fixup(tags, &from, &meminfo); - if (tags->hdr.tag == ATAG_CORE) { + if (tags->hdr.tag == cpu_to_atag32(ATAG_CORE)) { if (meminfo.nr_banks != 0) squash_mem_tags(tags); save_atags(tags); diff --git a/arch/arm/kernel/atags_proc.c b/arch/arm/kernel/atags_proc.c index c7ff807..9080b43 100644 --- a/arch/arm/kernel/atags_proc.c +++ b/arch/arm/kernel/atags_proc.c @@ -40,18 +40,18 @@ static int __init init_atags_procfs(void) struct buffer *b; size_t size; - if (tag->hdr.tag != ATAG_CORE) { + if (tag->hdr.tag != cpu_to_atag32(ATAG_CORE)) { printk(KERN_INFO "No ATAGs?"); return -EINVAL; } - for (; tag->hdr.size; tag = tag_next(tag)) + for_each_tag(tag, tag) ; /* include the terminating ATAG_NONE */ size = (char *)tag - atags_copy + sizeof(struct tag_header); - WARN_ON(tag->hdr.tag != ATAG_NONE); + WARN_ON(tag->hdr.tag != cpu_to_atag32(ATAG_NONE)); b = kmalloc(sizeof(*b) + size, GFP_KERNEL); if (!b)