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 (route_port
== RIO_INVALID_ROUTE
)
30 route_port
= CPS_DEFAULT_ROUTE
;
32 if (table
== RIO_GLOBAL_TABLE
) {
33 rio_mport_write_config_32(mport
, destid
, hopcount
,
34 RIO_STD_RTE_CONF_DESTID_SEL_CSR
, route_destid
);
36 rio_mport_read_config_32(mport
, destid
, hopcount
,
37 RIO_STD_RTE_CONF_PORT_SEL_CSR
, &result
);
39 result
= (0xffffff00 & result
) | (u32
)route_port
;
40 rio_mport_write_config_32(mport
, destid
, hopcount
,
41 RIO_STD_RTE_CONF_PORT_SEL_CSR
, result
);
48 idtcps_route_get_entry(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
49 u16 table
, u16 route_destid
, u8
*route_port
)
53 if (table
== RIO_GLOBAL_TABLE
) {
54 rio_mport_write_config_32(mport
, destid
, hopcount
,
55 RIO_STD_RTE_CONF_DESTID_SEL_CSR
, route_destid
);
57 rio_mport_read_config_32(mport
, destid
, hopcount
,
58 RIO_STD_RTE_CONF_PORT_SEL_CSR
, &result
);
60 if (CPS_DEFAULT_ROUTE
== (u8
)result
||
61 CPS_NO_ROUTE
== (u8
)result
)
62 *route_port
= RIO_INVALID_ROUTE
;
64 *route_port
= (u8
)result
;
71 idtcps_route_clr_table(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
76 if (table
== RIO_GLOBAL_TABLE
) {
77 for (i
= 0x80000000; i
<= 0x800000ff;) {
78 rio_mport_write_config_32(mport
, destid
, hopcount
,
79 RIO_STD_RTE_CONF_DESTID_SEL_CSR
, i
);
80 rio_mport_write_config_32(mport
, destid
, hopcount
,
81 RIO_STD_RTE_CONF_PORT_SEL_CSR
,
82 (CPS_DEFAULT_ROUTE
<< 24) |
83 (CPS_DEFAULT_ROUTE
<< 16) |
84 (CPS_DEFAULT_ROUTE
<< 8) | CPS_DEFAULT_ROUTE
);
93 idtcps_set_domain(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
97 * Switch domain configuration operates only at global level
99 rio_mport_write_config_32(mport
, destid
, hopcount
,
100 IDTCPS_RIO_DOMAIN
, (u32
)sw_domain
);
105 idtcps_get_domain(struct rio_mport
*mport
, u16 destid
, u8 hopcount
,
111 * Switch domain configuration operates only at global level
113 rio_mport_read_config_32(mport
, destid
, hopcount
,
114 IDTCPS_RIO_DOMAIN
, ®val
);
116 *sw_domain
= (u8
)(regval
& 0xff);
121 static int idtcps_switch_init(struct rio_dev
*rdev
, int do_enum
)
123 pr_debug("RIO: %s for %s\n", __func__
, rio_name(rdev
));
124 rdev
->rswitch
->add_entry
= idtcps_route_add_entry
;
125 rdev
->rswitch
->get_entry
= idtcps_route_get_entry
;
126 rdev
->rswitch
->clr_table
= idtcps_route_clr_table
;
127 rdev
->rswitch
->set_domain
= idtcps_set_domain
;
128 rdev
->rswitch
->get_domain
= idtcps_get_domain
;
129 rdev
->rswitch
->em_init
= NULL
;
130 rdev
->rswitch
->em_handle
= NULL
;
133 /* set TVAL = ~50us */
134 rio_write_config_32(rdev
,
135 rdev
->phys_efptr
+ RIO_PORT_LINKTO_CTL_CSR
, 0x8e << 8);
136 /* Ensure that default routing is disabled on startup */
137 rio_write_config_32(rdev
,
138 RIO_STD_RTE_DEFAULT_PORT
, CPS_NO_ROUTE
);
144 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS6Q
, idtcps_switch_init
);
145 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS8
, idtcps_switch_init
);
146 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS10Q
, idtcps_switch_init
);
147 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS12
, idtcps_switch_init
);
148 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDTCPS16
, idtcps_switch_init
);
149 DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT
, RIO_DID_IDT70K200
, idtcps_switch_init
);