summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorDoug Gilbert <dgilbert@us.ibm.com>2011-11-04 12:12:01 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-01-05 11:06:04 -0600
commit7de0708eac63bb81786c2a5e794c5d6fbef069c4 (patch)
treeb47aeb4c9827851d61b44d5cb922704f73257693 /src/include
parent048789fdce6b406de3b7149f8171afd63eea1829 (diff)
downloadtalos-hostboot-7de0708eac63bb81786c2a5e794c5d6fbef069c4.tar.gz
talos-hostboot-7de0708eac63bb81786c2a5e794c5d6fbef069c4.zip
Interrupt presenter implementation
Change-Id: If6b499d819b71298b8a64e096e1eb83c639ad645 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/517 Tested-by: Jenkins Server Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/kernel/intmsghandler.H99
-rw-r--r--src/include/sys/interrupt.h39
-rw-r--r--src/include/sys/misc.h6
-rw-r--r--src/include/sys/mmio.h1
-rw-r--r--src/include/sys/msg.h20
-rw-r--r--src/include/usr/hbotcompid.H8
-rw-r--r--src/include/usr/initservice/initsvcreasoncodes.H1
-rw-r--r--src/include/usr/intr/interrupt.H79
-rw-r--r--src/include/usr/intr/intr_reasoncodes.H45
9 files changed, 295 insertions, 3 deletions
diff --git a/src/include/kernel/intmsghandler.H b/src/include/kernel/intmsghandler.H
new file mode 100644
index 000000000..52eadde27
--- /dev/null
+++ b/src/include/kernel/intmsghandler.H
@@ -0,0 +1,99 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/kernel/intmsghandler.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+#ifndef __KERNEL_INTERRUPTMSGHDLR_H
+#define __KERNEL_INTERRUPTMSGHDLR_H
+
+#include <stdint.h>
+#include <kernel/types.h>
+#include <kernel/msghandler.H>
+#include <kernel/msg.H>
+
+/**
+ * @class InterruptMsgHdlr
+ * @brief Class to handle sending a message to user space for
+ * an External Interrupt.
+ *
+ * This class extends from the base MessageHandler so the base send/receive
+ * message functions can be utilized. It overrides how to handle the message
+ * responses
+ */
+class InterruptMsgHdlr : public MessageHandler
+{
+ public:
+
+ // Notes:
+ // All external interrupts are routed to one cpu core
+ // External Interrupts are only processed one at a time
+ // So we don't need a spinlock
+ /**
+ * Constructor
+ */
+ InterruptMsgHdlr(MessageQueue * i_msgQ)
+ : MessageHandler(NULL,i_msgQ) {} // TODO need splinlock?
+
+ /**
+ * Destructor.
+ */
+ virtual ~InterruptMsgHdlr() {};
+
+ /**
+ * Handle response to 'send message'
+ *
+ * @param[in] i_type - The message type previously sent.
+ * @param[in] i_key - The key value for the received message.
+ * @param[in] i_task - The deferred task.
+ * @param[in] i_rc - The response rc from userspace.
+ *
+ * @return HandleResult - The desired behavior on the 'recv message'
+ * interface for this <key, task> pair.
+ */
+ virtual HandleResult handleResponse(msg_sys_types_t i_type,void* i_key,
+ task_t* i_task,int i_rc);
+
+
+ /**
+ * Create the InterruptMsgHdlr to handle external interrupts
+ * @param[in] i_msgQ The message queue
+ */
+ static void create(MessageQueue * i_msgQ);
+
+ /**
+ * Handle an external interrupt from HW
+ */
+ static void handleInterrupt();
+
+ /**
+ * Add cpu core - set up the external interrupt registers
+ * @param[in] i_pir The cpu id of the core to to set-up
+ * @note should be called when ever a new core becomes active
+ */
+ static void addCpuCore(uint64_t i_pir);
+
+ private:
+
+ static InterruptMsgHdlr * cv_instance;
+};
+
+
+#endif
+
diff --git a/src/include/sys/interrupt.h b/src/include/sys/interrupt.h
new file mode 100644
index 000000000..59a1a17e3
--- /dev/null
+++ b/src/include/sys/interrupt.h
@@ -0,0 +1,39 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/sys/interrupt.h $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+#ifndef __INTERRUPT_H
+#define __INTERRUPT_H
+
+
+extern const char* INTR_MSGQ;
+
+/**
+ * INTR constants
+ */
+enum
+{
+ ICPBAR_SCOM_ADDR = 0x020109c9, //!< for P8, P7 = 0x02011C09
+ // This BAR value agrees with simics (for now)
+ ICPBAR_VAL = 0x03FBFF90, //!< ICPBAR value bits[0:29]>>34
+};
+
+#endif
diff --git a/src/include/sys/misc.h b/src/include/sys/misc.h
index f30a408ca..59b6c10bd 100644
--- a/src/include/sys/misc.h
+++ b/src/include/sys/misc.h
@@ -86,6 +86,12 @@ ProcessorCoreType cpu_core_type();
*/
uint8_t cpu_dd_level();
+/** @fn cpu_thread_count()
+ * @breif Get the number of threads per cpu for this proctype
+ * @return # of threads per cpu
+ */
+size_t cpu_thread_count();
+
#ifdef __cplusplus
}
#endif
diff --git a/src/include/sys/mmio.h b/src/include/sys/mmio.h
index 740b080c2..aca9286a5 100644
--- a/src/include/sys/mmio.h
+++ b/src/include/sys/mmio.h
@@ -38,6 +38,7 @@ extern "C"
*/
enum SEG_DATA_SIZES
{
+ THIRTYTWO_MB = (32*MEGABYTE),
THIRTYTWO_GB = (32*GIGABYTE),
};
diff --git a/src/include/sys/msg.h b/src/include/sys/msg.h
index be7ba397a..f58e3c8f1 100644
--- a/src/include/sys/msg.h
+++ b/src/include/sys/msg.h
@@ -57,6 +57,19 @@ enum msg_sys_types_t
MSG_MM_RP_READ,
MSG_MM_RP_WRITE,
MSG_MM_RP_PERM,
+
+ MSG_INTR_EXTERN, //!< Msg sent from kernel to user space on ext intr
+ MSG_INTR_ADD_CPU, //!< Add cpu core, data[0] = cpuid (PIR)
+};
+
+// System-defined root queue types
+/** @enum msg_root_queue_types_t
+ * @brief Message queue types that the kernel tracks
+ */
+enum msg_root_queue_types_t
+{
+ MSGQ_ROOT_VFS,
+ MSGQ_ROOT_INTR,
};
/** @var msg_sys_types_t::MSG_MM_RP_READ
@@ -229,9 +242,10 @@ msg_t* msg_wait(msg_q_t q);
*
* @return true if asynchronous message
*/
-ALWAYS_INLINE
- inline uint32_t msg_is_async(msg_t* msg)
- { return 0 == msg->__reserved__async; }
+ ALWAYS_INLINE
+inline uint32_t msg_is_async(msg_t* msg)
+{ return 0 == msg->__reserved__async; }
+
#ifdef __cplusplus
}
diff --git a/src/include/usr/hbotcompid.H b/src/include/usr/hbotcompid.H
index 48d6c71c5..a4102001c 100644
--- a/src/include/usr/hbotcompid.H
+++ b/src/include/usr/hbotcompid.H
@@ -172,6 +172,14 @@ const compId_t EEPROM_COMP_ID = 0x0E00;
const char EEPROM_COMP_NAME[] = "eeprom";
//@}
+/** @name INTR
+ * Interrupt presenter component
+ */
+//@{
+const compId_t INTR_COMP_ID = 0x0F00;
+const char INTR_COMP_NAME[] = "intr";
+//@}
+
// ----------------------------------------------------------
// CXXTEST Unit Test, reserve compid near the end...
/** @name CXXTEST
diff --git a/src/include/usr/initservice/initsvcreasoncodes.H b/src/include/usr/initservice/initsvcreasoncodes.H
index 1ed76efdd..6cbaa81c7 100644
--- a/src/include/usr/initservice/initsvcreasoncodes.H
+++ b/src/include/usr/initservice/initsvcreasoncodes.H
@@ -63,6 +63,7 @@ enum InitServiceModuleID
START_FSISCOM_ERRL_ID = 0x17,
START_TARGETING_ERRL_ID = 0x18,
START_I2C_ERRL_ID = 0x19,
+ START_INTR_ERRL_ID = 0x1A,
// Internal InitService codes
diff --git a/src/include/usr/intr/interrupt.H b/src/include/usr/intr/interrupt.H
new file mode 100644
index 000000000..142917df2
--- /dev/null
+++ b/src/include/usr/intr/interrupt.H
@@ -0,0 +1,79 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/intr/interrupt.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+#ifndef INTERRUPT_H
+#define INTERRUPT_H
+
+#include <sys/msg.h>
+#include <errl/errltypes.H>
+#include <sys/interrupt.h>
+
+namespace INTR
+{
+
+
+ /**
+ * External Interrupt Types (XISR)
+ */
+ enum ext_intr_t
+ {
+ NO_INTERRUPT = 0, //!< no interrupt present
+ INTERPROC = 2, //!< Inter processor interrupt
+ FSP_MAILBOX = 0x25, //!< TODO find this value
+ ATTENTION = 0x26, //!< TODO find this value
+ };
+
+ /**
+ * Msg types for intrRp from usr space
+ */
+ enum msg_intr_types_t
+ {
+ MSG_INTR_ADD_CPU_USR = 1, //!< Add cpu core, data[0] = cpuid (PIR)
+ MSG_INTR_REGISTER_MSGQ, //!< Register a msgQ
+ MSG_INTR_ENABLE, //!< Enable external Interrupts
+ MSG_INTR_DISABLE, //!< Disable external interrupts
+ };
+
+
+ /**
+ * Register a message queue to recieve external interrupts
+ * @param[in] i_msgQ The message queue
+ * @param[in] i_type The type of interrupt (XISR value)
+ * @return errlHndl_t on error.
+ */
+ errlHndl_t registerMsgQ(msg_q_t i_msgQ, ext_intr_t i_type);
+
+ /**
+ * Enable hardware to report external interrupts
+ * @return errlHndl_t on error.
+ */
+ errlHndl_t enableExternalInterrupts();
+
+ /**
+ * Disable hardware from reporting external interrupts
+ * @return errlHndl_t on error.
+ */
+ errlHndl_t disableExternalInterrupts();
+
+};
+
+#endif
diff --git a/src/include/usr/intr/intr_reasoncodes.H b/src/include/usr/intr/intr_reasoncodes.H
new file mode 100644
index 000000000..98070196b
--- /dev/null
+++ b/src/include/usr/intr/intr_reasoncodes.H
@@ -0,0 +1,45 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/intr/intr_reasoncodes.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2011
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+#ifndef INTR_REASONCODES_H
+#define INTR_REASONCODES_H
+
+#include <hbotcompid.H>
+
+namespace INTR
+{
+ enum IntrModuleID
+ {
+ UNDEFINED_MODULE_ERRL_ID = 0,
+ INTR_MODULE_ID,
+ };
+
+ enum IntrReasonCode
+ {
+ INTR_ALREADY_REGISTERED = INTR_COMP_ID | 0x01,
+ INTR_REGISTRY_NOT_READY = INTR_COMP_ID | 0x02,
+ INTR_RP_NOT_INITIALIZED = INTR_COMP_ID | 0x03,
+ INTR_BAD_VIRTUAL_IO_ADDRESS = INTR_COMP_ID | 0x04,
+ };
+};
+
+#endif
OpenPOWER on IntegriCloud