This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/AM5728: FPGA access on GPMC

Part Number: AM5728

Tool/software: Linux

Hi,

I am trying to connect a fpga to gpmc on cs0 in 16bit multiplexed mode, i have done the following changes for dts

       gpmc_pins_default {
    pinctrl-single,pins = <
        0x000 0x30    /* gpmc_ad0.gpmc_ad0 MODE0 | INPUT | PULLUP */
        0x004 0x30    /* gpmc_ad1.gpmc_ad1 MODE0 | INPUT | PULLUP */
        0x008 0x30    /* gpmc_ad2.gpmc_ad2 MODE0 | INPUT | PULLUP */
        0x00C 0x30    /* gpmc_ad3.gpmc_ad3 MODE0 | INPUT | PULLUP */
        0x010 0x30    /* gpmc_ad4.gpmc_ad4 MODE0 | INPUT | PULLUP */
        0x014 0x30    /* gpmc_ad5.gpmc_ad5 MODE0 | INPUT | PULLUP */
        0x018 0x30    /* gpmc_ad6.gpmc_ad6 MODE0 | INPUT | PULLUP */
        0x01C 0x30    /* gpmc_ad7.gpmc_ad7 MODE0 | INPUT | PULLUP */
        0x020 0x30    /* gpmc_ad8.gpmc_ad8 MODE0 | INPUT | PULLUP */
        0x024 0x30    /* gpmc_ad9.gpmc_ad9 MODE0 | INPUT | PULLUP */
        0x028 0x30    /* gpmc_ad10.gpmc_ad10 MODE0 | INPUT | PULLUP */
        0x02C 0x30    /* gpmc_ad11.gpmc_ad11 MODE0 | INPUT | PULLUP */
        0x030 0x30    /* gpmc_ad12.gpmc_ad12 MODE0 | INPUT | PULLUP */
        0x034 0x30    /* gpmc_ad13.gpmc_ad13 MODE0 | INPUT | PULLUP */
        0x038 0x30    /* gpmc_ad14.gpmc_ad14 MODE0 | INPUT | PULLUP */
        0x03C 0x30    /* gpmc_ad15.gpmc_ad15 MODE0 | INPUT | PULLUP */
        0x0B4 0x08    /* gpmc_cscn0.gpmc_cscn0 MODE0 | OUTPUT */
        0x0C0 0x28    /* gpmc_clk.gpmc_clk MODE0 | INPUT */
        0x0C4 0x08    /* gpmc_advn_ale.gpmc_advn_ale MODE0 | OUTPUT */
        0x0C8 0x08    /* gpmc_oen_ren.gpmc_oen_ren MODE0 | OUTPUT */
        0x0CC 0x08    /* gpmc_wen.gpmc_wen MODE0 | OUTPUT */
        0x0D0 0x08    /* gpmc_ben0_cle.gpmc_ben0_cle MODE0 | OUTPUT */
        0x0D4 0x08    /* gpmc_ben1_cle.gpmc_ben1_cle MODE0 | OUTPUT */
        0x0D8 0x30    /* gpmc_wait0.gpmc_wait0 MODE0 | INPUT | PULLUP */
    >;
};

gpmc@50000000 {
    compatible = "ti,am3352-gpmc";
    ti,hwmods = "gpmc";
    reg = <0x50000000 0x37c>;
    interrupts = <0x0 0xf 0x4>;
    dmas = <0xb2 0x4 0x0>;
    dma-names = "rxtx";
    gpmc,num-cs = <0x8>;
    gpmc,num-waitpins = <0x2>;
    #address-cells = <0x2>;
    #size-cells = <0x1>;
    interrupt-controller;
    #interrupt-cells = <0x2>;
    gpio-controller;
    #gpio-cells = <0x2>;
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&gpmc_pins_default>;
   ranges = <0 0 0x08000000 0x10000000>;
    fpga {
       reg = <0 0 0x01000000>;
        bank-width = <2>;
    
        gpmc,mux-add-data = <2>;
        gpmc,sync-clk-ps = <0>;
        gpmc,cs-on-ns = <0>;
        gpmc,cs-rd-off-ns = <44>;
        gpmc,cs-wr-off-ns = <44>;
        gpmc,adv-on-ns = <6>;
        gpmc,adv-rd-off-ns = <34>;
        gpmc,adv-wr-off-ns = <44>;
        gpmc,we-off-ns = <40>;
        gpmc,oe-off-ns = <54>;
        gpmc,access-ns = <64>;
        gpmc,rd-cycle-ns = <82>;
        gpmc,wr-cycle-ns = <82>;
        gpmc,wr-access-ns = <40>;
        gpmc,wr-data-mux-bus-ns = <0>;

        #address-cells = <1>;
        #size-cells = <1>;
    };
};

Now when I access the by mapping from userspace using the following code (I get a dump [1]):

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/mman.h>

int main(int argc, char** argv)
{
    int fd = open("/dev/mem", O_RDWR | O_SYNC); //O_SYNC makes the memory uncacheable

#if 1
    volatile uint8_t *extmem;

    extmem = (uint8_t *) mmap(NULL,0x10000000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x10000000);
    volatile uint32_t * p32 = (uint32_t *) &extmem[0x1000020];
    *p32 = 0xdeadbeef;
    uint32_t val = *p32;
    *p32 = 0xcafebabe;
    uint32_t val2 = *p32;
    printf("val=%#x\n", val);
    printf("val=%#x\n", val2);
 
    //printf("size=%d\n", sizeof(buffer));
    //memcpy(extmem, buffer, sizeof(buffer)-1);

#endif
    return(0) ;
}

Is there something I am missing which I need to do here ?

Dmesg Output

============

[    0.412145] omap-gpmc 50000000.gpmc: could not find pctldev for node /ocp/l4@4a000000/scm@2000/pinmux@1400/gpmc_pins_default, deferring probe
[    2.293608] omap-gpmc 50000000.gpmc: GPMC revision 6.0
[    2.298811] gpmc_mem_init: disabling cs 0 mapped at 0x0-0x1000000
[    2.305044] gpiochip_add: registered GPIOs 510 to 511 on device: omap-gpmc

[1]  Core Dump

[   11.893705] ------------[ cut here ]------------
[   11.898364] WARNING: CPU: 0 PID: 498 at drivers/bus/omap_l3_noc.c:147 l3_interrupt_handler+0x25c/0x368()
[   11.907886] 44000000.ocp:L3 Custom Error: MASTER MPU TARGET GPMC (Idle): Data Access in User mode during Functional access
[   11.918974] Modules linked in:
[   11.922052] CPU: 0 PID: 498 Comm: a.out Not tainted 4.4.32-00004-gd9240c6-dirty #76
[   11.929740] Hardware name: Generic DRA74X (Flattened Device Tree)
[   11.935857] Backtrace:
[   11.938330] [<c0013150>] (dump_backtrace) from [<c001334c>] (show_stack+0x18/0x1c)
[   11.945930]  r7:c03125c8 r6:20070193 r5:00000000 r4:c0b185f4
[   11.951655] [<c0013334>] (show_stack) from [<c02e440c>] (dump_stack+0x8c/0xa0)
[   11.958914] [<c02e4380>] (dump_stack) from [<c00336e4>] (warn_slowpath_common+0x88/0xb8)
[   11.967037]  r7:c03125c8 r6:00000093 r5:00000009 r4:ecc37df0
[   11.972762] [<c003365c>] (warn_slowpath_common) from [<c003374c>] (warn_slowpath_fmt+0x38/0x40)
[   11.981495]  r8:00000017 r7:c09eaab0 r6:00000000 r5:c09eab70 r4:c09eac14
[   11.988271] [<c0033718>] (warn_slowpath_fmt) from [<c03125c8>] (l3_interrupt_handler+0x25c/0x368)
[   11.997179]  r3:eea11b40 r2:c09eac14
[   12.000782]  r4:80080003
[   12.003339] [<c031236c>] (l3_interrupt_handler) from [<c007ed28>] (handle_irq_event_percpu+0xb4/0x160)
[   12.012683]  r10:c0b4524a r9:eea0f840 r8:00000017 r7:00000000 r6:00000000 r5:eea0f8a0
[   12.020587]  r4:eea2a040
[   12.023140] [<c007ec74>] (handle_irq_event_percpu) from [<c007ee14>] (handle_irq_event+0x40/0x64)
[   12.032046]  r10:b6fb5000 r9:00000000 r8:ee808000 r7:00000000 r6:c0af24c4 r5:eea0f8a0
[   12.039949]  r4:eea0f840
[   12.042504] [<c007edd4>] (handle_irq_event) from [<c0082140>] (handle_fasteoi_irq+0xc0/0x194)
[   12.051062]  r7:00000000 r6:c0af24c4 r5:eea0f8a0 r4:eea0f840
[   12.056781] [<c0082080>] (handle_fasteoi_irq) from [<c007e354>] (generic_handle_irq+0x2c/0x3c)
[   12.065426]  r7:00000000 r6:00000000 r5:00000017 r4:c0ae6424
[   12.071146] [<c007e328>] (generic_handle_irq) from [<c007e62c>] (__handle_domain_irq+0x64/0xbc)
[   12.079884] [<c007e5c8>] (__handle_domain_irq) from [<c000948c>] (gic_handle_irq+0x40/0x7c)
[   12.088267]  r9:00000000 r8:fa213000 r7:fa212000 r6:ecc37fb0 r5:fa21200c r4:c0aec8b8
[   12.096083] [<c000944c>] (gic_handle_irq) from [<c0014128>] (__irq_usr+0x48/0x60)
[   12.103597] Exception stack(0xecc37fb0 to 0xecc37ff8)
[   12.108670] 7fa0:                                     a6e49000 10000000 a7e49020 cafebabe
[   12.116883] 7fc0: 00010548 00000000 00010354 00000000 00000000 00000000 b6fb5000 bea09bbc
[   12.125096] 7fe0: 00000000 bea09b90 000104cc 0001050c 80070010 ffffffff
[   12.131735]  r9:00000000 r8:30c5387d r7:30c5387d r6:ffffffff r5:80070010 r4:0001050c
[   12.139554] ---[ end trace ce705d0da4493420 ]---
[   12.145663] Unhandled fault: asynchronous external abort (0x1211) at 0x00000000
[   12.147481] Unhandled fault: asynchronous external abort (0x1211) at 0x00000000
[   12.147485] pgd = ed884540
[   12.147495] [00000000] *pgd=ad91c003, *pmd=ad8d2003, *pte=00000000
[   12.169250] pgd = ed9907c0
[   12.171965] [00000000] *pgd=ad840003, *pmd=fd0a3003
[   12.176919] ------------[ cut here ]------------
[   12.181564] WARNING: CPU: 0 PID: 344 at drivers/bus/omap_l3_noc.c:147 l3_interrupt_handler+0x25c/0x368()
[   12.191084] 44000000.ocp:L3 Custom Error: MASTER MPU TARGET GPMC (Read): Data Access in User mode during Functional access
[   12.202171] Modules linked in:
[   12.205245] CPU: 0 PID: 344 Comm: klogd Tainted: G        W       4.4.32-00004-gd9240c6-dirty #76
[   12.214153] Hardware name: Generic DRA74X (Flattened Device Tree)
[   12.220269] Backtrace:
[   12.222739] [<c0013150>] (dump_backtrace) from [<c001334c>] (show_stack+0x18/0x1c)
[   12.230338]  r7:c03125c8 r6:200c0193 r5:00000000 r4:c0b185f4
[   12.236062] [<c0013334>] (show_stack) from [<c02e440c>] (dump_stack+0x8c/0xa0)
[   12.243320] [<c02e4380>] (dump_stack) from [<c00336e4>] (warn_slowpath_common+0x88/0xb8)
[   12.251442]  r7:c03125c8 r6:00000093 r5:00000009 r4:ed969c68
[   12.257162] [<c003365c>] (warn_slowpath_common) from [<c003374c>] (warn_slowpath_fmt+0x38/0x40)
[   12.265895]  r8:00000017 r7:c09eaab0 r6:00000002 r5:c09eab70 r4:c09eac14
[   12.272670] [<c0033718>] (warn_slowpath_fmt) from [<c03125c8>] (l3_interrupt_handler+0x25c/0x368)
[   12.281578]  r3:eea11b40 r2:c09eac14
[   12.285180]  r4:80080003
[   12.287736] [<c031236c>] (l3_interrupt_handler) from [<c007ed28>] (handle_irq_event_percpu+0xb4/0x160)
[   12.297080]  r10:c0b4524a r9:eea0f840 r8:00000017 r7:00000000 r6:00000000 r5:eea0f8a0
[   12.304981]  r4:eea2a040
[   12.307535] [<c007ec74>] (handle_irq_event_percpu) from [<c007ee14>] (handle_irq_event+0x40/0x64)
[   12.316442]  r10:00000000 r9:ed968000 r8:ee808000 r7:00000000 r6:c0af24c4 r5:eea0f8a0
[   12.324343]  r4:eea0f840
[   12.326898] [<c007edd4>] (handle_irq_event) from [<c0082140>] (handle_fasteoi_irq+0xc0/0x194)
[   12.335458]  r7:00000000 r6:c0af24c4 r5:eea0f8a0 r4:eea0f840
[   12.341176] [<c0082080>] (handle_fasteoi_irq) from [<c007e354>] (generic_handle_irq+0x2c/0x3c)
[   12.349822]  r7:00000000 r6:ed969f40 r5:00000017 r4:c0ae6424
[   12.355543] [<c007e328>] (generic_handle_irq) from [<c007e62c>] (__handle_domain_irq+0x64/0xbc)
[   12.364280] [<c007e5c8>] (__handle_domain_irq) from [<c000948c>] (gic_handle_irq+0x40/0x7c)
[   12.372663]  r9:ed968000 r8:fa213000 r7:fa212000 r6:ed969e28 r5:fa21200c r4:c0aec8b8
[   12.380481] [<c000944c>] (gic_handle_irq) from [<c0013e40>] (__irq_svc+0x40/0x74)
[   12.387996] Exception stack(0xed969e28 to 0xed969e70)
[   12.393069] 9e20:                   00000000 c0b492c0 00000000 00000000 00000202 00000012
[   12.401282] 9e40: ed968000 00000000 ee808000 ed968000 00000000 ed969ed4 ed969ed8 ed969e78
[   12.409494] 9e60: c003759c c0037108 600c0113 ffffffff
[   12.414564]  r9:ed968000 r8:ee808000 r7:ed969e5c r6:ffffffff r5:600c0113 r4:c0037108
[   12.422384] [<c0037074>] (__do_softirq) from [<c003759c>] (irq_exit+0xbc/0x11c)
[   12.429721]  r10:00000000 r9:ed968000 r8:ee808000 r7:00000000 r6:00000000 r5:00000012
[   12.437627]  r4:ffffe000
[   12.440180] [<c00374e0>] (irq_exit) from [<c007e630>] (__handle_domain_irq+0x68/0xbc)
[   12.448040]  r5:00000012 r4:c0ae6424
[   12.451648] [<c007e5c8>] (__handle_domain_irq) from [<c000948c>] (gic_handle_irq+0x40/0x7c)
[   12.460033]  r9:ed968000 r8:fa213000 r7:fa212000 r6:ed969f40 r5:fa21200c r4:c0aec8b8
[   12.467854] [<c000944c>] (gic_handle_irq) from [<c0013e40>] (__irq_svc+0x40/0x74)
[   12.475367] Exception stack(0xed969f40 to 0xed969f88)
[   12.480440] 9f40: ed969fb0 00000001 00000000 600c0010 ed968000 00000000 ed969fb0 30c5387d
[   12.488652] 9f60: 00000000 ed968000 00000000 ed969fac ed969fb0 ed969f90 c000faec c0012cf8
[   12.496863] 9f80: 600c0113 ffffffff
[   12.500363]  r9:ed968000 r8:00000000 r7:ed969f74 r6:ffffffff r5:600c0113 r4:c0012cf8
[   12.508186] [<c0012ca8>] (do_work_pending) from [<c000faec>] (slow_work_pending+0xc/0x20)
[   12.516395]  r7:30c5387d r6:ffffffff r5:600c0010 r4:b6e8873c
[   12.522108] ---[ end trace ce705d0da4493421 ]---

Thanks,

Mike