2 * IDT CPS RapidIO switches support
4 * Copyright 2009-2010 Integrated Device Technology, Inc.
5 * Alexandre Bounine <alexandre.bounine@idt.com>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
13 #include <linux/rio.h>
14 #include <linux/rio_drv.h>
15 #include <linux/rio_ids.h>
18 #define CPS_DEFAULT_ROUTE 0xde
19 #define CPS_NO_ROUTE 0xdf
21 #define IDTCPS_RIO_DOMAIN 0xf20020
24 idtcps_route_add_entry(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
25 u16 table
, u16 route_destid
, u8 route_port
)
29 if (table
== RIO_GLOBAL_TABLE
) {
30 rio_mport_write_config_32(mport
, destid
, hopcount
,
31 RIO_STD_RTE_CONF_DESTID_SEL_CSR
, route_destid
);
33 rio_mport_read_config_32(mport
, destid
, hopcount
,
34 RIO_STD_RTE_CONF_PORT_SEL_CSR
, &result
);
36 result
= (0xffffff00 & result
) | (u32
)route_port
;
37 rio_mport_write_config_32(mport
, destid
, hopcount
,
38 RIO_STD_RTE_CONF_PORT_SEL_CSR
, result
);
45 idtcps_route_get_entry(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
46 u16 table
, u16 route_destid
, u8
*route_port
)
50 if (table
== RIO_GLOBAL_TABLE
) {
51 rio_mport_write_config_32(mport
, destid
, hopcount
,
52 RIO_STD_RTE_CONF_DESTID_SEL_CSR
, route_destid
);
54 rio_mport_read_config_32(mport
, destid
, hopcount
,
55 RIO_STD_RTE_CONF_PORT_SEL_CSR
, &result
);
57 if (CPS_DEFAULT_ROUTE
== (u8
)result
||
58 CPS_NO_ROUTE
== (u8
)result
)
59 *route_port
= RIO_INVALID_ROUTE
;
61 *route_port
= (u8
)result
;
68 idtcps_route_clr_table(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
73 if (table
== RIO_GLOBAL_TABLE
) {
74 for (i
= 0x80000000; i
<= 0x800000ff;) {
75 rio_mport_write_config_32(mport
, destid
, hopcount
,
76 RIO_STD_RTE_CONF_DESTID_SEL_CSR
, i
);
77 rio_mport_write_config_32(mport
, destid
, hopcount
,
78 RIO_STD_RTE_CONF_PORT_SEL_CSR
,
79 (CPS_DEFAULT_ROUTE
<< 24) |
80 (CPS_DEFAULT_ROUTE
<< 16) |
81 (CPS_DEFAULT_ROUTE
<< 8) | CPS_DEFAULT_ROUTE
);
90 idtcps_set_domain(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
94 * Switch domain configuration operates only at global level
96 rio_mport_write_config_32(mport
, destid
, hopcount
,
97 IDTCPS_RIO_DOMAIN
, (u32
)sw_domain
);
102 idtcps_get_domain(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
108 * Switch domain configuration operates only at global level
110 rio_mport_read_config_32(mport
, destid
, hopcount
,
111 IDTCPS_RIO_DOMAIN
, ®val
);
113 *sw_domain
= (u8
)(regval
& 0xff);
118 static int idtcps_switch_init(struct rio_dev
*rdev
, int do_enum
)
120 struct rio_mport
*mport
= rdev
->net
->hport
;
121 u16 destid
= rdev
->rswitch
->destid
;
122 u8 hopcount
= rdev
->rswitch
->hopcount
;
124 pr_debug("RIO: %s for %s\n", __func__
, rio_name(rdev
));
125 rdev
->rswitch
->add_entry
= idtcps_route_add_entry
;
126 rdev
->rswitch
->get_entry
= idtcps_route_get_entry
;
127 rdev
->rswitch
->clr_table
= idtcps_route_clr_table
;
128 rdev
->rswitch
->set_domain
= idtcps_set_domain
;
129 rdev
->rswitch
->get_domain
= idtcps_get_domain
;
130 rdev
->rswitch
->em_init
= NULL
;
131 rdev
->rswitch
->em_handle
= NULL
;
134 /* set TVAL = ~50us */
135 rio_mport_write_config_32(mport
, destid
, hopcount
,
136 rdev
->phys_efptr
+ RIO_PORT_LINKTO_CTL_CSR
, 0x8e << 8);
142 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS6Q
, idtcps_switch_init
);
143 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS8
, idtcps_switch_init
);
144 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS10Q
, idtcps_switch_init
);
145 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS12
, idtcps_switch_init
);
146 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS16
, idtcps_switch_init
);
147 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDT70K200
, idtcps_switch_init
);