From mboxrd@z Thu Jan 1 00:00:00 1970 From: arnd@arndb.de (Arnd Bergmann) Date: Wed, 24 Sep 2014 12:33:14 +0200 Subject: [PATCH v2 1/8] ARM: add mach-asm9260 In-Reply-To: <20140924102542.GV5182@n2100.arm.linux.org.uk> References: <1411324904-14881-1-git-send-email-linux@rempel-privat.de> <54229533.8050607@rempel-privat.de> <20140924102542.GV5182@n2100.arm.linux.org.uk> Message-ID: <2748904.3BsN75JAH1@wuerfel> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wednesday 24 September 2014 11:25:42 Russell King - ARM Linux wrote: > On Wed, Sep 24, 2014 at 11:56:03AM +0200, Oleksij Rempel wrote: > > Am 24.09.2014 um 11:43 schrieb Russell King - ARM Linux: > > > The "why" is in the text from your oops dump. That's precisely /why/ we > > > print that text - so that we know /why/ the fault happened. > > > > Here is oops message: > > http://pastebin.com/qYWeAyfV > > > > i can avoid this oops by setting size at least 0x2000 per register > > range. Do it mean my TLB supports only 8 KiB pages? > > No, it has nothing to do with the TLB. > > Unable to handle kernel paging request at virtual address c2802174 > pgd = c0004000 > [c2802174] *pgd=21805811, *pte=00000000, *ppte=00000000 > Internal error: Oops: 7 [#1] PREEMPT ARM > > The number after the Oops: is the FSR value, which means "page translation > fault", and sure enough, the pgd/pte values show that there is no page > table entry at the faulting address. > > That's odd, because ioremap() aligns the size of the requested mapping up > to a multiple of the page size, and inserts page table entries according > to the rounded size. > > Where are you calling ioremap(), iounmap() etc? IOW, please show your > code for this. It's the clock driver from patch 5. It starts out with an ioremap of the clock controller node: + acc: clock-controller at 80040000 { + compatible = "alphascale,asm9260-clock-controller"; + #clock-cells = <1>; + clocks = <&osc24m>; + reg = <0x80040000 0x500>; + }; Oh, and there is the bug: + /* check for errors on leaf clocks */ + for (n = 0; n < MAX_CLKS; n++) { + if (!IS_ERR(clks[n])) + continue; + + pr_err("%s: Unable to register leaf clock %d\n", + np->full_name, n); + goto fail; + } + + /* register clk-provider */ + clk_data.clks = clks; + clk_data.clk_num = MAX_CLKS; + of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); +fail: + iounmap(base); +} There should be a 'return' in front of the 'fail:', otherwise it get unmapped unconditionally. Arnd