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