blob: 862bb46801b426183660316514f4a294eb281bf7 [file] [log] [blame]
/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <mach/msm_bus.h>
#include <mach/msm_bus_board.h>
#include <mach/board.h>
#include <mach/rpm.h>
#include "msm_bus_core.h"
#define NMASTERS 14
#define NSLAVES 12
#define NFAB_9615 2
enum msm_bus_fabric_tiered_slave_type {
MSM_BUS_TIERED_SLAVE_EBI1_CH0 = 1,
};
enum msm_bus_9615_master_ports_type {
MSM_BUS_MASTER_PORT_SPS = 0,
MSM_BUS_MASTER_PORT_APSS_PROC,
MSM_BUS_MASTER_PORT_ADM_PORT0,
MSM_BUS_MASTER_PORT_ADM_PORT1,
MSM_BUS_MASTER_PORT_LPASS_PROC,
MSM_BUS_MASTER_PORT_MSS,
MSM_BUS_MASTER_PORT_MSS_SW_PROC,
MSM_BUS_MASTER_PORT_MSS_FW_PROC,
MSM_BUS_MASTER_PORT_LPASS,
MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,
MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB,
MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI,
};
enum msm_bus_9615_slave_ports_type {
MSM_BUS_SLAVE_PORT_SPS = 0,
MSM_BUS_SLAVE_PORT_EBI1_CH0,
MSM_BUS_SLAVE_PORT_APSS_L2,
MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,
MSM_BUS_SLAVE_PORT_CORESIGHT,
MSM_BUS_SLAVE_PORT_APSS,
MSM_BUS_SLAVE_PORT_MSS,
MSM_BUS_SLAVE_PORT_LPASS,
MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,
MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,
};
static int tier2[] = {MSM_BUS_BW_TIER2,};
static uint32_t master_iids[NMASTERS];
static uint32_t slave_iids[NSLAVES];
static int sport_ebi1_ch0[] = {MSM_BUS_SLAVE_PORT_EBI1_CH0,};
static int sport_apss_l2[] = {MSM_BUS_SLAVE_PORT_APSS_L2,};
static int tiered_slave_ebi1_ch0[] = {MSM_BUS_TIERED_SLAVE_EBI1_CH0,};
static int mport_sps[] = {MSM_BUS_MASTER_PORT_SPS,};
static int mport_apss_proc[] = {MSM_BUS_MASTER_PORT_APSS_PROC,};
static int mport_adm_port0[] = {MSM_BUS_MASTER_PORT_ADM_PORT0,};
static int mport_adm_port1[] = {MSM_BUS_MASTER_PORT_ADM_PORT1,};
static int mport_mss[] = {MSM_BUS_MASTER_PORT_MSS,};
static int mport_lpass_proc[] = {MSM_BUS_MASTER_PORT_LPASS_PROC,};
static int mport_mss_sw_proc[] = {MSM_BUS_MASTER_PORT_MSS_SW_PROC,};
static int mport_mss_fw_proc[] = {MSM_BUS_MASTER_PORT_MSS_FW_PROC,};
static int mport_lpass[] = {MSM_BUS_MASTER_PORT_LPASS,};
static int system_mport_adm_ahb_ci[] = {MSM_BUS_SYSTEM_MASTER_PORT_ADM_AHB_CI,};
static int mport_system_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_SYSTEM_FPB,};
static int system_mport_cpss_fpb[] = {MSM_BUS_SYSTEM_MASTER_PORT_CPSS_FPB,};
static int system_sport_system_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_SYSTEM_FPB,};
static int system_sport_cpss_fpb[] = {MSM_BUS_SYSTEM_SLAVE_PORT_CPSS_FPB,};
static int sport_sps[] = {MSM_BUS_SLAVE_PORT_SPS,};
static int sport_system_imem[] = {MSM_BUS_SLAVE_PORT_SYSTEM_IMEM,};
static int sport_coresight[] = {MSM_BUS_SLAVE_PORT_CORESIGHT,};
static int sport_apss[] = {MSM_BUS_SLAVE_PORT_APSS,};
static int sport_mss[] = {MSM_BUS_SLAVE_PORT_MSS,};
static int sport_lpass[] = {MSM_BUS_SLAVE_PORT_LPASS,};
static struct msm_bus_node_info system_fabric_info[] = {
{
.id = MSM_BUS_MASTER_SPS,
.masterp = mport_sps,
.num_mports = ARRAY_SIZE(mport_sps),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_ADM_PORT0,
.masterp = mport_adm_port0,
.num_mports = ARRAY_SIZE(mport_adm_port0),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_ADM_PORT1,
.masterp = mport_adm_port1,
.num_mports = ARRAY_SIZE(mport_adm_port1),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_LPASS_PROC,
.masterp = mport_lpass_proc,
.num_mports = ARRAY_SIZE(mport_lpass_proc),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_MSS,
.masterp = mport_mss,
.num_mports = ARRAY_SIZE(mport_mss),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_AMPSS_M0,
.masterp = mport_apss_proc,
.num_mports = ARRAY_SIZE(mport_apss_proc),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_MSS_SW_PROC,
.masterp = mport_mss_sw_proc,
.num_mports = ARRAY_SIZE(mport_mss_sw_proc),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_MSS_FW_PROC,
.masterp = mport_mss_fw_proc,
.num_mports = ARRAY_SIZE(mport_mss_fw_proc),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_LPASS,
.masterp = mport_lpass,
.num_mports = ARRAY_SIZE(mport_lpass),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_MASTER_ADM0_CI,
.masterp = system_mport_adm_ahb_ci,
.num_mports = ARRAY_SIZE(system_mport_adm_ahb_ci),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
},
{
.id = MSM_BUS_FAB_SYSTEM_FPB,
.gateway = 1,
.slavep = system_sport_system_fpb,
.num_sports = ARRAY_SIZE(system_sport_system_fpb),
.masterp = mport_system_fpb,
.num_mports = ARRAY_SIZE(mport_system_fpb),
.buswidth = 4,
},
{
.id = MSM_BUS_FAB_CPSS_FPB,
.gateway = 1,
.slavep = system_sport_cpss_fpb,
.num_sports = ARRAY_SIZE(system_sport_cpss_fpb),
.masterp = system_mport_cpss_fpb,
.num_mports = ARRAY_SIZE(system_mport_cpss_fpb),
.buswidth = 4,
},
{
.id = MSM_BUS_SLAVE_SPS,
.slavep = sport_sps,
.num_sports = ARRAY_SIZE(sport_sps),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
.buswidth = 8,
.slaveclk[DUAL_CTX] = "dfab_clk",
.slaveclk[ACTIVE_CTX] = "dfab_a_clk",
},
{
.id = MSM_BUS_SLAVE_EBI_CH0,
.slavep = sport_ebi1_ch0,
.num_sports = ARRAY_SIZE(sport_ebi1_ch0),
.tier = tiered_slave_ebi1_ch0,
.num_tiers = ARRAY_SIZE(tiered_slave_ebi1_ch0),
.buswidth = 8,
.slaveclk[DUAL_CTX] = "mem_clk",
.slaveclk[ACTIVE_CTX] = "mem_a_clk",
},
{
.id = MSM_BUS_SLAVE_SYSTEM_IMEM,
.slavep = sport_system_imem,
.num_sports = ARRAY_SIZE(sport_system_imem),
.buswidth = 8,
},
{
.id = MSM_BUS_SLAVE_CORESIGHT,
.slavep = sport_coresight,
.num_sports = ARRAY_SIZE(sport_coresight),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
.buswidth = 8,
},
{
.id = MSM_BUS_SLAVE_AMPSS,
.slavep = sport_apss,
.num_sports = ARRAY_SIZE(sport_apss),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
.buswidth = 8,
},
{
.id = MSM_BUS_SLAVE_AMPSS_L2,
.slavep = sport_apss_l2,
.num_sports = ARRAY_SIZE(sport_apss_l2),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
.buswidth = 8,
},
{
.id = MSM_BUS_SLAVE_MSS,
.slavep = sport_mss,
.num_sports = ARRAY_SIZE(sport_mss),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
.buswidth = 8,
},
{
.id = MSM_BUS_SLAVE_LPASS,
.slavep = sport_lpass,
.num_sports = ARRAY_SIZE(sport_lpass),
.tier = tier2,
.num_tiers = ARRAY_SIZE(tier2),
.buswidth = 8,
},
};
static void msm_bus_board_assign_iids(struct msm_bus_fabric_registration
*fabreg, int fabid)
{
int i;
for (i = 0; i < fabreg->len; i++) {
if (!fabreg->info[i].gateway) {
fabreg->info[i].priv_id = fabid + fabreg->info[i].id;
if (fabreg->info[i].id < SLAVE_ID_KEY)
master_iids[fabreg->info[i].id] =
fabreg->info[i].priv_id;
else
slave_iids[fabreg->info[i].id - (SLAVE_ID_KEY)]
= fabreg->info[i].priv_id;
} else
fabreg->info[i].priv_id = fabreg->info[i].id;
}
}
static int msm_bus_board_9615_get_iid(int id)
{
if ((id < SLAVE_ID_KEY && id >= NMASTERS) ||
id >= (SLAVE_ID_KEY + NSLAVES)) {
MSM_BUS_ERR("Cannot get iid. Invalid id %d passed\n", id);
return -EINVAL;
}
return ((id < SLAVE_ID_KEY) ? master_iids[id] : slave_iids[id -
SLAVE_ID_KEY]);
}
static struct msm_bus_board_algorithm msm_bus_board_algo = {
.board_nfab = NFAB_9615,
.get_iid = msm_bus_board_9615_get_iid,
.assign_iids = msm_bus_board_assign_iids,
};
struct msm_bus_fabric_registration msm_bus_9615_sys_fabric_pdata = {
.id = MSM_BUS_FAB_SYSTEM,
.name = "msm_sys_fab",
system_fabric_info,
ARRAY_SIZE(system_fabric_info),
.ahb = 0,
.fabclk[DUAL_CTX] = "bus_clk",
.fabclk[ACTIVE_CTX] = "bus_a_clk",
.haltid = MSM_RPM_ID_SYS_FABRIC_CFG_HALT_0,
.offset = MSM_RPM_ID_SYSTEM_FABRIC_ARB_0,
.nmasters = 12,
.nslaves = 10,
.ntieredslaves = 1,
.board_algo = &msm_bus_board_algo,
};
struct msm_bus_fabric_registration msm_bus_9615_def_fab_pdata = {
.id = MSM_BUS_FAB_DEFAULT,
.name = "msm_def_fab",
.ahb = 1,
.nmasters = 0,
.nslaves = 0,
.ntieredslaves = 0,
.board_algo = &msm_bus_board_algo,
};
int msm_bus_board_rpm_get_il_ids(uint16_t id[])
{
return -ENXIO;
}
void msm_bus_board_init(struct msm_bus_fabric_registration *pdata)
{
}