diff options
Diffstat (limited to 'drivers/rapidio/switches/tsi57x.c')
-rw-r--r-- | drivers/rapidio/switches/tsi57x.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/rapidio/switches/tsi57x.c b/drivers/rapidio/switches/tsi57x.c index 2e902d3..d34df72 100644 --- a/drivers/rapidio/switches/tsi57x.c +++ b/drivers/rapidio/switches/tsi57x.c @@ -30,13 +30,17 @@ #define SPP_ROUTE_CFG_PORT(n) (0x11074 + 0x100*n) #define TSI578_SP_MODE(n) (0x11004 + n*0x100) +#define TSI578_SP_MODE_GLBL 0x10004 #define TSI578_SP_MODE_PW_DIS 0x08000000 +#define TSI578_SP_MODE_LUT_512 0x01000000 #define TSI578_SP_CTL_INDEP(n) (0x13004 + n*0x100) #define TSI578_SP_LUT_PEINF(n) (0x13010 + n*0x100) #define TSI578_SP_CS_TX(n) (0x13014 + n*0x100) #define TSI578_SP_INT_STATUS(n) (0x13018 + n*0x100) +#define TSI578_GLBL_ROUTE_BASE 0x10078 + static int tsi57x_route_add_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 route_port) @@ -113,6 +117,45 @@ tsi57x_route_clr_table(struct rio_mport *mport, u16 destid, u8 hopcount, } static int +tsi57x_set_domain(struct rio_mport *mport, u16 destid, u8 hopcount, + u8 sw_domain) +{ + u32 regval; + + /* + * Switch domain configuration operates only at global level + */ + + /* Turn off flat (LUT_512) mode */ + rio_mport_read_config_32(mport, destid, hopcount, + TSI578_SP_MODE_GLBL, ®val); + rio_mport_write_config_32(mport, destid, hopcount, TSI578_SP_MODE_GLBL, + regval & ~TSI578_SP_MODE_LUT_512); + /* Set switch domain base */ + rio_mport_write_config_32(mport, destid, hopcount, + TSI578_GLBL_ROUTE_BASE, + (u32)(sw_domain << 24)); + return 0; +} + +static int +tsi57x_get_domain(struct rio_mport *mport, u16 destid, u8 hopcount, + u8 *sw_domain) +{ + u32 regval; + + /* + * Switch domain configuration operates only at global level + */ + rio_mport_read_config_32(mport, destid, hopcount, + TSI578_GLBL_ROUTE_BASE, ®val); + + *sw_domain = (u8)(regval >> 24); + + return 0; +} + +static int tsi57x_em_init(struct rio_dev *rdev) { struct rio_mport *mport = rdev->net->hport; @@ -258,6 +301,8 @@ static int tsi57x_switch_init(struct rio_dev *rdev, int do_enum) rdev->rswitch->add_entry = tsi57x_route_add_entry; rdev->rswitch->get_entry = tsi57x_route_get_entry; rdev->rswitch->clr_table = tsi57x_route_clr_table; + rdev->rswitch->set_domain = tsi57x_set_domain; + rdev->rswitch->get_domain = tsi57x_get_domain; rdev->rswitch->em_init = tsi57x_em_init; rdev->rswitch->em_handle = tsi57x_em_handler; |