11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IBM ASM Service Processor Device Driver
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version.
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful,
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details.
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) IBM Corporation, 2004
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
20d36b691077dc59c74efec0d54ed21b86f7a2a21aAl Viro * Author: Max Asböck <amax@us.ibm.com>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Condor service processor specific hardware definitions */
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __IBMASM_CONDOR_H__
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __IBMASM_CONDOR_H__
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VENDORID_IBM	0x1014
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVICEID_RSA	0x010F
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define GET_MFA_ADDR(x)  (x & 0xFFFFFF00)
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAILBOX_FULL(x)  (x & 0x00000001)
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NO_MFAS_AVAILABLE     0xFFFFFFFF
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INBOUND_QUEUE_PORT   0x40  /* contains address of next free MFA */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OUTBOUND_QUEUE_PORT  0x44  /* contains address of posted MFA    */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SP_INTR_MASK	0x00000008
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define UART_INTR_MASK	0x00000010
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INTR_STATUS_REGISTER   0x13A0
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INTR_CONTROL_REGISTER  0x13A4
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SCOUT_COM_A_BASE         0x0000
513110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov#define SCOUT_COM_B_BASE         0x0100
523110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov#define SCOUT_COM_C_BASE         0x0200
533110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov#define SCOUT_COM_D_BASE         0x0300
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int sp_interrupt_pending(void __iomem *base_address)
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return SP_INTR_MASK & readl(base_address + INTR_STATUS_REGISTER);
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int uart_interrupt_pending(void __iomem *base_address)
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return UART_INTR_MASK & readl(base_address + INTR_STATUS_REGISTER);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ibmasm_enable_interrupts(void __iomem *base_address, int mask)
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void __iomem *ctrl_reg = base_address + INTR_CONTROL_REGISTER;
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	writel( readl(ctrl_reg) & ~mask, ctrl_reg);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ibmasm_disable_interrupts(void __iomem *base_address, int mask)
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void __iomem *ctrl_reg = base_address + INTR_CONTROL_REGISTER;
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	writel( readl(ctrl_reg) | mask, ctrl_reg);
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void enable_sp_interrupts(void __iomem *base_address)
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ibmasm_enable_interrupts(base_address, SP_INTR_MASK);
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void disable_sp_interrupts(void __iomem *base_address)
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ibmasm_disable_interrupts(base_address, SP_INTR_MASK);
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void enable_uart_interrupts(void __iomem *base_address)
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
893110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov	ibmasm_enable_interrupts(base_address, UART_INTR_MASK);
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void disable_uart_interrupts(void __iomem *base_address)
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
943110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov	ibmasm_disable_interrupts(base_address, UART_INTR_MASK);
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define valid_mfa(mfa)	( (mfa) != NO_MFAS_AVAILABLE )
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u32 get_mfa_outbound(void __iomem *base_address)
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retry;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 mfa;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (retry=0; retry<=10; retry++) {
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mfa = readl(base_address + OUTBOUND_QUEUE_PORT);
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (valid_mfa(mfa))
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return mfa;
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void set_mfa_outbound(void __iomem *base_address, u32 mfa)
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1143110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov	writel(mfa, base_address + OUTBOUND_QUEUE_PORT);
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline u32 get_mfa_inbound(void __iomem *base_address)
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 mfa = readl(base_address + INBOUND_QUEUE_PORT);
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (MAILBOX_FULL(mfa))
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return mfa;
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void set_mfa_inbound(void __iomem *base_address, u32 mfa)
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1293110dc7a8660ea1617afac2a55e3d18ae6ce141bDmitry Torokhov	writel(mfa, base_address + INBOUND_QUEUE_PORT);
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline struct i2o_message *get_i2o_message(void __iomem *base_address, u32 mfa)
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (struct i2o_message *)(GET_MFA_ADDR(mfa) + base_address);
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __IBMASM_CONDOR_H__ */
138