| /* C-interface for AMBA PnP scanning functions implemented in |
| * ambapp_low.S. At the point the memory and stack can be |
| * used. |
| * |
| * (C) Copyright 2010, 2015 |
| * Daniel Hellstrom, Cobham Gaisler, daniel@gaisler.com. |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| |
| .seg "text" |
| .extern _nomem_ambapp_find_buses |
| .extern _nomem_find_apb |
| .extern _nomem_find_ahb |
| |
| .globl ambapp_find_buses |
| .globl ambapp_find_apb |
| .globl ambapp_find_ahb |
| |
| |
| /* C-interface for _nomem_ambapp_find_buses used when memory is available. |
| */ |
| ambapp_find_buses: |
| save %sp, -104, %sp |
| mov %i1, %l7 /* Save second argument */ |
| call _nomem_ambapp_find_buses |
| mov %i0, %o0 |
| |
| /* Store result */ |
| st %g0, [%l7+0x00] |
| st %i0, [%l7+0x04] |
| st %i1, [%l7+0x08] |
| st %i2, [%l7+0x0c] |
| st %i3, [%l7+0x10] |
| st %i4, [%l7+0x14] |
| st %i5, [%l7+0x18] |
| |
| ret |
| restore |
| |
| /* C-interface for _nomem_find_apb used when memory is available. |
| * |
| * void ambapp_find_apb( |
| * struct ambapp_bus *abus, |
| * unsigned int dev_vend, |
| * int index, |
| * struct ambapp_find_apb_info *result |
| * ); |
| * |
| */ |
| ambapp_find_apb: |
| save %sp, -104, %sp |
| |
| mov %i3, %l7 /* Save second argument */ |
| mov %i1, %o1 |
| mov %i2, %o2 |
| |
| /* Initialize buses available in system */ |
| ld [%i0+0x08], %i1 |
| ld [%i0+0x0c], %i2 |
| ld [%i0+0x10], %i3 |
| ld [%i0+0x14], %i4 |
| ld [%i0+0x18], %i5 |
| |
| call _nomem_find_apb |
| ld [%i0+0x04], %i0 |
| |
| st %o2, [%l7+0x08] /* Decremented Index */ |
| st %o3, [%l7] /* PnP configuration address of APB Device */ |
| st %o4, [%l7+0x04] /* AHB Bus Index of AHB/APB bridge and APB Device */ |
| mov %o0, %i0 |
| ret |
| restore |
| |
| /* C-interface for _nomem_find_ahb used when memory is available. |
| * |
| * void ambapp_find_ahb( |
| * struct ambapp_bus *abus, |
| * unsigned int dev_vend, |
| * int index, |
| * int type, |
| * struct ambapp_find_ahb_info *result |
| * ); |
| * |
| */ |
| ambapp_find_ahb: |
| save %sp, -104, %sp |
| |
| mov %i4, %l7 /* Save second argument */ |
| clr %o0 |
| mov %i1, %o1 |
| mov %i2, %o2 |
| clr %o3 |
| clr %o4 |
| mov %i3, %o5 |
| |
| /* Initialize buses available in system */ |
| ld [%i0+0x08], %i1 |
| ld [%i0+0x0c], %i2 |
| ld [%i0+0x10], %i3 |
| ld [%i0+0x14], %i4 |
| ld [%i0+0x18], %i5 |
| |
| call _nomem_find_ahb |
| ld [%i0+0x04], %i0 |
| |
| st %o2, [%l7+0x08] /* Decremented Index */ |
| st %o3, [%l7] /* PnP configuration address of AHB Device */ |
| st %o4, [%l7+0x04] /* AHB Bus Index of AHB Device */ |
| mov %o0, %i0 |
| ret |
| restore |