summaryrefslogtreecommitdiff
path: root/arch/sparc/cpu/leon3/ambapp.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/cpu/leon3/ambapp.c')
-rw-r--r--arch/sparc/cpu/leon3/ambapp.c316
1 files changed, 0 insertions, 316 deletions
diff --git a/arch/sparc/cpu/leon3/ambapp.c b/arch/sparc/cpu/leon3/ambapp.c
deleted file mode 100644
index 47769cffd7..0000000000
--- a/arch/sparc/cpu/leon3/ambapp.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* GRLIB AMBA Plug&Play information scanning, relies on assembler
- * routines.
- *
- * (C) Copyright 2010, 2015
- * Daniel Hellstrom, Cobham Gaisler, daniel@gaisler.com.
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-/* #define DEBUG */
-
-#include <common.h>
-#include <malloc.h>
-#include <ambapp.h>
-#include <config.h>
-
-/************ C INTERFACE OF ASSEMBLER SCAN ROUTINES ************/
-struct ambapp_find_apb_info {
- /* Address of APB device Plug&Play information */
- struct ambapp_pnp_apb *pnp;
- /* AHB Bus index of where the APB-Master Bridge device was found */
- int ahb_bus_index;
- int dec_index;
-};
-
-struct ambapp_find_ahb_info {
- /* Address of AHB device Plug&Play information */
- struct ambapp_pnp_ahb *pnp;
- /* AHB Bus index of where the AHB device was found */
- int ahb_bus_index;
- int dec_index;
-};
-
-extern void ambapp_find_buses(unsigned int ioarea, struct ambapp_bus *abus);
-
-extern int ambapp_find_apb(struct ambapp_bus *abus, unsigned int dev_vend,
- int index, struct ambapp_find_apb_info *result);
-
-extern int ambapp_find_ahb(struct ambapp_bus *abus, unsigned int dev_vend,
- int index, int type, struct ambapp_find_ahb_info *result);
-
-/************ C ROUTINES USED BY U-BOOT AMBA CORE DRIVERS ************/
-struct ambapp_bus ambapp_plb __section(.data);
-
-void ambapp_bus_init(
- unsigned int ioarea,
- unsigned int freq,
- struct ambapp_bus *abus)
-{
- int i;
-
- ambapp_find_buses(ioarea, abus);
- for (i = 0; i < 6; i++)
- if (abus->ioareas[i] == 0)
- break;
- abus->buses = i;
- abus->freq = freq;
-}
-
-/* Parse APB PnP Information */
-void ambapp_apb_parse(struct ambapp_find_apb_info *info, ambapp_apbdev *dev)
-{
- struct ambapp_pnp_apb *apb = info->pnp;
- unsigned int apbbase = (unsigned int)apb & 0xfff00000;
-
- dev->vendor = amba_vendor(apb->id);
- dev->device = amba_device(apb->id);
- dev->irq = amba_irq(apb->id);
- dev->ver = amba_ver(apb->id);
- dev->address = (apbbase | (((apb->iobar & 0xfff00000) >> 12))) &
- (((apb->iobar & 0x0000fff0) << 4) | 0xfff00000);
- dev->mask = amba_apb_mask(apb->iobar);
- dev->ahb_bus_index = info->ahb_bus_index - 1;
-}
-
-/* Parse AHB PnP information */
-void ambapp_ahb_parse(struct ambapp_find_ahb_info *info, ambapp_ahbdev *dev)
-{
- struct ambapp_pnp_ahb *ahb = info->pnp;
- unsigned int ahbbase = (unsigned int)ahb & 0xfff00000;
- int i, type;
- unsigned int addr, mask, mbar;
-
- dev->vendor = amba_vendor(ahb->id);
- dev->device = amba_device(ahb->id);
- dev->irq = amba_irq(ahb->id);
- dev->ver = amba_ver(ahb->id);
- dev->userdef[0] = ahb->custom[0];
- dev->userdef[1] = ahb->custom[1];
- dev->userdef[2] = ahb->custom[2];
- dev->ahb_bus_index = info->ahb_bus_index - 1;
- for (i = 0; i < 4; i++) {
- mbar = ahb->mbar[i];
- addr = amba_membar_start(mbar);
- type = amba_membar_type(mbar);
- if (type == AMBA_TYPE_AHBIO) {
- addr = amba_ahbio_adr(addr, ahbbase);
- mask = (((unsigned int)
- (amba_membar_mask((~mbar))<<8)|0xff))+1;
- } else {
- /* AHB memory area, absolute address */
- mask = (~((unsigned int)
- (amba_membar_mask(mbar)<<20)))+1;
- }
- dev->address[i] = addr;
- dev->mask[i] = mask;
- dev->type[i] = type;
- }
-}
-
-int ambapp_apb_find(struct ambapp_bus *abus, int vendor, int device,
- int index, ambapp_apbdev *dev)
-{
- unsigned int devid = AMBA_PNP_ID(vendor, device);
- int found;
- struct ambapp_find_apb_info apbdev;
-
- found = ambapp_find_apb(abus, devid, index, &apbdev);
- if (found == 1)
- ambapp_apb_parse(&apbdev, dev);
-
- return found;
-}
-
-int ambapp_apb_count(struct ambapp_bus *abus, int vendor, int device)
-{
- unsigned int devid = AMBA_PNP_ID(vendor, device);
- int found;
- struct ambapp_find_apb_info apbdev;
-
- found = ambapp_find_apb(abus, devid, 63, &apbdev);
- if (found == 1)
- return 64;
- else
- return 63 - apbdev.dec_index;
-}
-
-int ambapp_ahb_find(struct ambapp_bus *abus, int vendor, int device,
- int index, ambapp_ahbdev *dev, int type)
-{
- int found;
- struct ambapp_find_ahb_info ahbdev;
- unsigned int devid = AMBA_PNP_ID(vendor, device);
-
- found = ambapp_find_ahb(abus, devid, index, type, &ahbdev);
- if (found == 1)
- ambapp_ahb_parse(&ahbdev, dev);
-
- return found;
-}
-
-int ambapp_ahbmst_find(struct ambapp_bus *abus, int vendor, int device,
- int index, ambapp_ahbdev *dev)
-{
- return ambapp_ahb_find(abus, vendor, device, index, dev, DEV_AHB_MST);
-}
-
-int ambapp_ahbslv_find(struct ambapp_bus *abus, int vendor, int device,
- int index, ambapp_ahbdev *dev)
-{
- return ambapp_ahb_find(abus, vendor, device, index, dev, DEV_AHB_SLV);
-}
-
-int ambapp_ahb_count(struct ambapp_bus *abus, int vendor, int device, int type)
-{
- int found;
- struct ambapp_find_ahb_info ahbdev;
- unsigned int devid = AMBA_PNP_ID(vendor, device);
-
- found = ambapp_find_ahb(abus, devid, 63, type, &ahbdev);
- if (found == 1)
- return 64;
- else
- return 63 - ahbdev.dec_index;
-}
-
-int ambapp_ahbmst_count(struct ambapp_bus *abus, int vendor, int device)
-{
- return ambapp_ahb_count(abus, vendor, device, DEV_AHB_MST);
-}
-
-int ambapp_ahbslv_count(struct ambapp_bus *abus, int vendor, int device)
-{
- return ambapp_ahb_count(abus, vendor, device, DEV_AHB_SLV);
-}
-
-/* The define CONFIG_SYS_GRLIB_SINGLE_BUS may be defined on GRLIB systems
- * where only one AHB Bus is available - no bridges are present. This option
- * is available only to reduce the footprint.
- *
- * Defining this on a multi-bus GRLIB system may also work depending on the
- * design.
- */
-
-#ifndef CONFIG_SYS_GRLIB_SINGLE_BUS
-
-/* GAISLER AHB2AHB Version 1 Bridge Definitions */
-#define AHB2AHB_V1_FLAG_FFACT 0x0f0 /* Frequency factor against top bus */
-#define AHB2AHB_V1_FLAG_FFACT_DIR 0x100 /* Factor direction, 0=down, 1=up */
-#define AHB2AHB_V1_FLAG_MBUS 0x00c /* Master bus number mask */
-#define AHB2AHB_V1_FLAG_SBUS 0x003 /* Slave bus number mask */
-
-/* Get Parent bus frequency. Note that since we go from a "child" bus
- * to a parent bus, the frequency factor direction is inverted.
- */
-unsigned int gaisler_ahb2ahb_v1_freq(ambapp_ahbdev *ahb, unsigned int freq)
-{
- int dir;
- unsigned char ffact;
-
- /* Get division/multiple factor */
- ffact = (ahb->userdef[0] & AHB2AHB_V1_FLAG_FFACT) >> 4;
- if (ffact != 0) {
- dir = ahb->userdef[0] & AHB2AHB_V1_FLAG_FFACT_DIR;
-
- /* Calculate frequency by dividing or
- * multiplying system frequency
- */
- if (dir)
- freq = freq * ffact;
- else
- freq = freq / ffact;
- }
-
- return freq;
-}
-
-/* AHB2AHB and L2CACHE ver 2 is not supported yet. */
-unsigned int gaisler_ahb2ahb_v2_freq(ambapp_ahbdev *ahb, unsigned int freq)
-{
- panic("gaisler_ahb2ahb_v2_freq: AHB2AHB ver 2 not supported\n");
- return -1;
-}
-#endif
-
-/* Return the frequency of a AHB bus identified by index found
- * note that this is not the AHB Bus number.
- */
-unsigned int ambapp_bus_freq(struct ambapp_bus *abus, int ahb_bus_index)
-{
- unsigned int freq = abus->freq;
-#ifndef CONFIG_SYS_GRLIB_SINGLE_BUS
- unsigned int ioarea, ioarea_parent, bridge_pnp_ofs;
- struct ambapp_find_ahb_info ahbinfo;
- ambapp_ahbdev ahb;
- int parent;
-
- debug("ambapp_bus_freq: get freq on bus %d\n", ahb_bus_index);
-
- while (ahb_bus_index != 0) {
- debug(" BUS[0]: 0x%08x\n", abus->ioareas[0]);
- debug(" BUS[1]: 0x%08x\n", abus->ioareas[1]);
- debug(" BUS[2]: 0x%08x\n", abus->ioareas[2]);
- debug(" BUS[3]: 0x%08x\n", abus->ioareas[3]);
- debug(" BUS[4]: 0x%08x\n", abus->ioareas[4]);
- debug(" BUS[5]: 0x%08x\n", abus->ioareas[5]);
-
- /* Get I/O area of AHB bus */
- ioarea = abus->ioareas[ahb_bus_index];
-
- debug(" IOAREA: 0x%08x\n", ioarea);
-
- /* Get parent bus */
- parent = (ioarea & 0x7);
- if (parent == 0) {
- panic("%s: parent=0 indicates no parent! Stopping.\n",
- __func__);
- return -1;
- }
- parent = parent - 1;
- bridge_pnp_ofs = ioarea & 0x7e0;
-
- debug(" PARENT: %d\n", parent);
- debug(" BRIDGE_OFS: 0x%08x\n", bridge_pnp_ofs);
-
- /* Get AHB/AHB bridge PnP address */
- ioarea_parent = (abus->ioareas[parent] & 0xfff00000) |
- AMBA_CONF_AREA | AMBA_AHB_SLAVE_CONF_AREA;
- ahbinfo.pnp = (struct ambapp_pnp_ahb *)
- (ioarea_parent | bridge_pnp_ofs);
-
- debug(" IOAREA PARENT: 0x%08x\n", ioarea_parent);
- debug(" BRIDGE PNP: 0x%p\n", ahbinfo.pnp);
-
- /* Parse the AHB information */
- ahbinfo.ahb_bus_index = parent;
- ambapp_ahb_parse(&ahbinfo, &ahb);
-
- debug(" BRIDGE ID: VENDOR=%d(0x%x), DEVICE=%d(0x%x)\n",
- ahb.vendor, ahb.vendor, ahb.device, ahb.device);
-
- /* Different bridges may convert frequency differently */
- if ((ahb.vendor == VENDOR_GAISLER) &&
- ((ahb.device == GAISLER_AHB2AHB) ||
- (ahb.device == GAISLER_L2CACHE))) {
- /* Get new frequency */
- if (ahb.ver > 1)
- freq = gaisler_ahb2ahb_v2_freq(&ahb, freq);
- else
- freq = gaisler_ahb2ahb_v1_freq(&ahb, freq);
-
- debug(" NEW FREQ: %dHz\n", freq);
- } else {
- panic("%s: unsupported AMBA bridge\n", __func__);
- return -1;
- }
-
- /* Step upwards towards system top bus */
- ahb_bus_index = parent;
- }
-#endif
-
- debug("ambapp_bus_freq: %dHz\n", freq);
-
- return freq;
-}