summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4v/sys/ncp.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/sun4v/sys/ncp.h')
-rw-r--r--usr/src/uts/sun4v/sys/ncp.h220
1 files changed, 167 insertions, 53 deletions
diff --git a/usr/src/uts/sun4v/sys/ncp.h b/usr/src/uts/sun4v/sys/ncp.h
index 7203f84fdd..491a7bf622 100644
--- a/usr/src/uts/sun4v/sys/ncp.h
+++ b/usr/src/uts/sun4v/sys/ncp.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -30,7 +29,12 @@
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
#include <sys/kmem.h>
+#include <sys/mdesc.h>
+#include <sys/crypto/common.h>
+#include <sys/crypto/spi.h>
#include <sys/ncs.h>
#ifdef __cplusplus
@@ -45,11 +49,6 @@ extern "C" {
#define FALSE 0
#define TRUE 1
-/*
- * XXX
- * NCP_MAX_NMAUS should come from OBP/HV
- * NCP_MAX_CPUS_PER_MAU should come from OBP/HV
- */
#define NCP_MAX_NMAUS 8
#define NCP_MAX_CPUS_PER_MAU 4
#define NCP_CPUID2MAUID(c) ((c) / NCP_MAX_CPUS_PER_MAU)
@@ -96,8 +95,6 @@ typedef struct ncp_minor ncp_minor_t;
typedef struct ncp_listnode ncp_listnode_t;
typedef struct ncp_request ncp_request_t;
typedef struct ncp_stat ncp_stat_t;
-typedef struct ncp_mau_queue ncp_mau_queue_t;
-typedef struct ncp_desc ncp_desc_t;
@@ -246,46 +243,16 @@ struct ncp_stat {
kstat_named_t ns_status;
kstat_named_t ns_algs[DS_MAX];
struct {
+ kstat_named_t ns_mauid;
+ kstat_named_t ns_mauhandle;
+ kstat_named_t ns_maustate;
kstat_named_t ns_submit;
kstat_named_t ns_qfull;
+ kstat_named_t ns_qbusy;
kstat_named_t ns_qupdate_failure;
} ns_mau[NCP_MAX_NMAUS];
};
-
-struct ncp {
- kmutex_t n_lock;
- kmem_cache_t *n_ds_cache;
- kmem_cache_t *n_mactl_cache;
- kmem_cache_t *n_mabuf_cache;
- dev_info_t *n_dip;
- minor_t n_minor;
- int n_nmaus;
- int n_max_nmaus;
- int *n_mauids;
- ncp_mau_queue_t *n_mau_q;
- int n_mau_q_size;
-
- ddi_taskq_t *n_taskq;
-
- unsigned n_flags; /* dev state flags */
-
- kstat_t *n_ksp;
- kstat_t *n_intrstats;
- u_longlong_t n_stats[DS_MAX];
- u_longlong_t n_qfull[NCP_MAX_NMAUS];
- u_longlong_t n_qupdate_failure[NCP_MAX_NMAUS];
-
- ulong_t n_pagesize;
- crypto_kcf_provider_handle_t n_prov;
-
- kmutex_t n_freereqslock;
- ncp_listnode_t n_freereqs; /* available requests */
-
- kmutex_t n_ctx_list_lock;
- ncp_listnode_t n_ctx_list;
-};
-
/*
* Device flags (ncp_t.ncp_flags)
*/
@@ -294,10 +261,25 @@ struct ncp {
/*
* IMPORTANT:
- * (NCP_MAQUEUE_NENTRIES * sizeof (ncs_hvdesc_t)) <= PAGESIZE
+ * NCP_MAQUEUE_NENTRIES *must* be a power-of-2.
+ * requirement: sizeof (ncs_hvdesc_t) == 64
*/
-#define NCP_MAQUEUE_NENTRIES 64
+#define NCP_MAQUEUE_NENTRIES (1 << 9) /* 512 */
#define NCP_MAQUEUE_WRAPMASK (NCP_MAQUEUE_NENTRIES - 1)
+#define NCP_MAQUEUE_SIZE (NCP_MAQUEUE_NENTRIES * sizeof (ncs_hvdesc_t))
+#define NCP_MAQUEUE_ALIGN (NCP_MAQUEUE_SIZE - 1)
+#define NCP_MAQUEUE_SLOTS_AVAIL(q) \
+ (((q)->nmq_head > (q)->nmq_tail) ? \
+ ((q)->nmq_head > (q)->nmq_tail - 1) : \
+ (NCP_MAQUEUE_NENTRIES - \
+ ((q)->nmq_tail - (q)->nmq_head) - 1))
+
+#define NCP_QINDEX_TO_QOFFSET(i) ((i) * sizeof (ncs_hvdesc_t))
+#define NCP_QOFFSET_TO_QINDEX(o) ((o) / sizeof (ncs_hvdesc_t))
+#define NCP_QINDEX_INCR(i) (((i) + 1) & NCP_MAQUEUE_WRAPMASK)
+#define NCP_QINDEX_IS_VALID(i) (((i) >= 0) && \
+ ((i) < NCP_MAQUEUE_NENTRIES))
+#define NCP_QTIMEOUT_SECONDS 15
typedef struct ncp_ma {
kmutex_t nma_lock;
@@ -305,24 +287,141 @@ typedef struct ncp_ma {
int nma_ref; /* # of descriptor references */
} ncp_ma_t;
+typedef struct ncp_desc ncp_desc_t;
struct ncp_desc {
ncs_hvdesc_t nd_hv;
ncp_desc_t *nd_link; /* to string related descriptors */
ncp_ma_t *nd_ma; /* referenced MA buffer */
};
+typedef struct ncp_descjob {
+ int dj_id;
+ kcondvar_t dj_cv;
+ ncp_desc_t *dj_jobp;
+ struct ncp_descjob *dj_prev;
+ struct ncp_descjob *dj_next;
+} ncp_descjob_t;
+
/*
* nmq_head, nmq_tail = indexes into nmq_desc[].
*/
-struct ncp_mau_queue {
- int nmq_id;
+typedef struct {
+ uint64_t nmq_mauhandle;
+ uint64_t nmq_devino;
+ int nmq_inum;
+ int nmq_mauid;
+ int nmq_init;
+ int nmq_busy_wait;
+ kcondvar_t nmq_busy_cv;
kmutex_t nmq_lock;
int nmq_head;
int nmq_tail;
uint_t nmq_wrapmask;
+ ncp_descjob_t **nmq_jobs;
+ size_t nmq_jobs_size;
ncs_hvdesc_t *nmq_desc; /* descriptor array */
- int nmq_desc_size;
- uint64_t nmq_njobs;
+ char *nmq_mem;
+ size_t nmq_memsize;
+ ncp_descjob_t *nmq_joblist;
+ int nmq_joblistcnt;
+ struct {
+ uint64_t qks_njobs;
+ uint64_t qks_qfull;
+ uint64_t qks_qbusy;
+ uint64_t qks_qfail;
+ } nmq_ks;
+} ncp_mau_queue_t;
+
+#define MAU_STATE_ERROR (-1)
+#define MAU_STATE_OFFLINE 0
+#define MAU_STATE_ONLINE 1
+
+typedef struct {
+ int mm_mauid;
+ int mm_cpulistsz;
+ int *mm_cpulist;
+ int mm_ncpus;
+ int mm_nextcpuidx;
+ /*
+ * Only protects mm_nextcpuidx field.
+ */
+ kmutex_t mm_lock;
+ /*
+ * xxx - maybe need RW lock for mm_state?
+ */
+ int mm_state; /* MAU_STATE_... */
+
+ ncp_mau_queue_t mm_queue;
+} mau_entry_t;
+
+typedef struct {
+ int mc_cpuid;
+ int mc_mauid;
+ /*
+ * xxx - maybe need RW lock for mm_state?
+ * Mirrors mm_state in mau_entry_t. Duplicated
+ * for speed so we don't have search mau_entry
+ * table. Field rarely updated.
+ */
+ int mc_state; /* MAU_STATE_... */
+} cpu_entry_t;
+
+typedef struct {
+ /*
+ * MAU stuff
+ */
+ int m_maulistsz;
+ mau_entry_t *m_maulist;
+ int m_nmaus;
+ int m_nextmauidx;
+ /*
+ * Only protects m_nextmauidx field.
+ */
+ kmutex_t m_lock;
+
+ /*
+ * CPU stuff
+ */
+ int m_cpulistsz;
+ cpu_entry_t *m_cpulist;
+ int m_ncpus;
+} ncp_mau2cpu_map_t;
+
+struct ncp {
+ uint_t n_hvapi_minor_version;
+ kmutex_t n_lock;
+ kmem_cache_t *n_ds_cache;
+ kmem_cache_t *n_mactl_cache;
+ kmem_cache_t *n_mabuf_cache;
+ dev_info_t *n_dip;
+ minor_t n_minor;
+
+ ddi_taskq_t *n_taskq;
+
+ unsigned n_flags; /* dev state flags */
+
+ kstat_t *n_ksp;
+ kstat_t *n_intrstats;
+ u_longlong_t n_stats[DS_MAX];
+
+ ddi_intr_handle_t *n_htable;
+ int n_intr_mid[NCP_MAX_NMAUS];
+ int n_intr_type;
+ int n_intr_cnt;
+ size_t n_intr_size;
+ uint_t n_intr_pri;
+
+ ulong_t n_pagesize;
+ crypto_kcf_provider_handle_t n_prov;
+
+ kmutex_t n_freereqslock;
+ ncp_listnode_t n_freereqs; /* available requests */
+
+ kmutex_t n_ctx_list_lock;
+ ncp_listnode_t n_ctx_list;
+
+ md_t *n_mdp;
+ ncp_mau2cpu_map_t n_maumap;
};
#endif /* _KERNEL */
@@ -343,14 +442,18 @@ struct ncp_mau_queue {
#define DMA_LDST 0x00000004
#define DNCS_QTAIL 0x00000008
#define DATTACH 0x00000010
-#define DMOD 0x00000040 /* _init/_fini/_info/attach/detach */
-#define DENTRY 0x00000080 /* crypto routine entry/exit points */
+#define DMD 0x00000020
+#define DHV 0x00000040
+#define DINTR 0x00000080
+#define DMOD 0x00000100 /* _init/_fini/_info/attach/detach */
+#define DENTRY 0x00000200 /* crypto routine entry/exit points */
#define DALL 0xFFFFFFFF
#define DBG0 ncp_dprintf
#define DBG1 ncp_dprintf
#define DBG2 ncp_dprintf
#define DBG3 ncp_dprintf
+#define DBG4 ncp_dprintf
#define DBGCALL(flag, func) { if (ncp_dflagset(flag)) (void) func; }
void ncp_dprintf(ncp_t *, int, const char *, ...);
@@ -363,6 +466,7 @@ int ncp_dflagset(int);
#define DBG1(vca, lvl, fmt, arg1)
#define DBG2(vca, lvl, fmt, arg1, arg2)
#define DBG3(vca, lvl, fmt, arg1, arg2, arg3)
+#define DBG4(vca, lvl, fmt, arg1, arg2, arg3, arg4)
#define DBGCALL(flag, func)
#endif /* !defined(DEBUG) */
@@ -404,6 +508,16 @@ int ncp_dsaatomic(crypto_provider_handle_t, crypto_session_id_t,
crypto_data_t *, int, crypto_req_handle_t, int);
/*
+ * ncp_md.
+ */
+int ncp_init_mau2cpu_map(ncp_t *);
+void ncp_deinit_mau2cpu_map(ncp_t *);
+int ncp_map_cpu_to_mau(ncp_t *, int);
+int ncp_map_mau_to_cpu(ncp_t *, int);
+int ncp_map_nextmau(ncp_t *);
+mau_entry_t *ncp_map_findmau(ncp_t *, int);
+
+/*
* ncp_kstat.c
*/
void ncp_ksinit(ncp_t *);