summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2007-09-17 23:25:46 +0200
committerMichael Brown2007-09-17 23:25:46 +0200
commitc818d47e258ae0571ff3dee143a1b76059fbcb30 (patch)
tree48c49e03a9a7074b2b0b3cb799201bccc697aaed /src
parentStarting the firmware directly now works. (diff)
downloadipxe-c818d47e258ae0571ff3dee143a1b76059fbcb30.tar.gz
ipxe-c818d47e258ae0571ff3dee143a1b76059fbcb30.tar.xz
ipxe-c818d47e258ae0571ff3dee143a1b76059fbcb30.zip
Restructured bits of initialisation (not testable at present)
Diffstat (limited to 'src')
-rw-r--r--src/drivers/net/mlx_ipoib/arbel.h18
-rw-r--r--src/drivers/net/mlx_ipoib/mt25218.c140
2 files changed, 116 insertions, 42 deletions
diff --git a/src/drivers/net/mlx_ipoib/arbel.h b/src/drivers/net/mlx_ipoib/arbel.h
index 564b669e..fb4264c0 100644
--- a/src/drivers/net/mlx_ipoib/arbel.h
+++ b/src/drivers/net/mlx_ipoib/arbel.h
@@ -156,12 +156,20 @@ union arbelprm_mad {
/** Arbel device limits */
struct arbel_dev_limits {
- /** Number of reserver UARs */
- unsigned long reserved_uars;
- /** Number of reserved CQs */
- unsigned long reserved_cqs;
/** Number of reserved QPs */
- unsigned long reserved_qps;
+ unsigned int reserved_qps;
+ /** Number of reserved EEs */
+ unsigned int reserved_ees;
+ /** Number of reserved MPTs */
+ unsigned int reserved_mpts;
+ /** Number of reserved MTTs */
+ unsigned int reserved_mtts;
+ /** Number of reserved CQs */
+ unsigned int reserved_cqs;
+ /** Number of reserved SRQs */
+ unsigned int reserved_srqs;
+ /** Number of reserver UARs */
+ unsigned int reserved_uars;
};
/** Alignment of Arbel send work queue entries */
diff --git a/src/drivers/net/mlx_ipoib/mt25218.c b/src/drivers/net/mlx_ipoib/mt25218.c
index 26677ab6..b9d2835d 100644
--- a/src/drivers/net/mlx_ipoib/mt25218.c
+++ b/src/drivers/net/mlx_ipoib/mt25218.c
@@ -1330,6 +1330,40 @@ static int arbel_get_pkey ( struct arbel *arbel, unsigned int *pkey ) {
return 0;
}
+/**
+ * Get MAD parameters
+ *
+ * @v arbel Arbel device
+ * @ret rc Return status code
+ */
+static int arbel_get_mad_params ( struct ib_device *ibdev ) {
+ struct arbel *arbel = ibdev->dev_priv;
+ int rc;
+
+ /* Get subnet manager LID */
+ if ( ( rc = arbel_get_sm_lid ( arbel, &ibdev->sm_lid ) ) != 0 ) {
+ DBGC ( arbel, "Arbel %p could not determine subnet manager "
+ "LID: %s\n", arbel, strerror ( rc ) );
+ return rc;
+ }
+
+ /* Get port GID */
+ if ( ( rc = arbel_get_port_gid ( arbel, &ibdev->port_gid ) ) != 0 ) {
+ DBGC ( arbel, "Arbel %p could not determine port GID: %s\n",
+ arbel, strerror ( rc ) );
+ return rc;
+ }
+
+ /* Get partition key */
+ if ( ( rc = arbel_get_pkey ( arbel, &ibdev->pkey ) ) != 0 ) {
+ DBGC ( arbel, "Arbel %p could not determine partition key: "
+ "%s\n", arbel, strerror ( rc ) );
+ return rc;
+ }
+
+ return 0;
+}
+
/***************************************************************************
*
* Firmware control
@@ -1426,6 +1460,62 @@ static void arbel_stop_firmware ( struct arbel *arbel ) {
arbel->firmware_area = UNULL;
}
+/***************************************************************************
+ *
+ * Infinihost Context Memory management
+ *
+ ***************************************************************************
+ */
+
+/**
+ * Get device limits
+ *
+ * @v arbel Arbel device
+ * @ret rc Return status code
+ */
+static int arbel_get_limits ( struct arbel *arbel ) {
+ struct arbelprm_query_dev_lim dev_lim;
+ int rc;
+
+ if ( ( rc = arbel_cmd_query_dev_lim ( arbel, &dev_lim ) ) != 0 ) {
+ DBGC ( arbel, "Arbel %p could not get device limits: %s\n",
+ arbel, strerror ( rc ) );
+ return rc;
+ }
+
+ arbel->limits.reserved_qps =
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_qps ) );
+ arbel->limits.reserved_ees =
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_ees ) );
+ arbel->limits.reserved_mtts =
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_mtts ) );
+ arbel->limits.reserved_cqs =
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_cqs ) );
+ arbel->limits.reserved_srqs =
+ ( 1 << MLX_GET ( &dev_lim, log2_rsvd_srqs ) );
+ arbel->limits.reserved_uars = MLX_GET ( &dev_lim, num_rsvd_uars );
+
+ return 0;
+}
+
+/**
+ * Allocate ICM areas
+ *
+ * @v arbel Arbel device
+ * @ret rc Return status code
+ */
+static int arbel_alloc_icm ( struct arbel *arbel ) {
+
+ return 0;
+}
+
+/***************************************************************************
+ *
+ * PCI interface
+ *
+ ***************************************************************************
+ */
+
/**
* Probe PCI device
*
@@ -1436,9 +1526,7 @@ static void arbel_stop_firmware ( struct arbel *arbel ) {
static int arbel_probe ( struct pci_device *pci,
const struct pci_device_id *id __unused ) {
struct ib_device *ibdev;
- struct arbelprm_query_dev_lim dev_lim;
struct arbel *arbel;
- udqp_t qph;
int rc;
/* Allocate Infiniband device */
@@ -1479,15 +1567,19 @@ static int arbel_probe ( struct pci_device *pci,
if ( ( rc = arbel_start_firmware ( arbel ) ) != 0 )
goto err_start_firmware;
+ /* Get device limits */
+ if ( ( rc = arbel_get_limits ( arbel ) ) != 0 )
+ goto err_get_limits;
while ( 1 ) {}
+#if 0
/* Initialise hardware */
if ( ( rc = ib_driver_init ( pci, &qph ) ) != 0 )
goto err_ib_driver_init;
/* Hack up IB structures */
-#if 0
+
arbel->config = memfree_pci_dev.cr_space;
arbel->uar = memfree_pci_dev.uar;
arbel->mailbox_in = dev_buffers_p->inprm_buf;
@@ -1497,38 +1589,11 @@ static int arbel_probe ( struct pci_device *pci,
arbel->reserved_lkey = dev_ib_data.mkey;
arbel->eqn = dev_ib_data.eq.eqn;
- /* Get device limits */
- if ( ( rc = arbel_cmd_query_dev_lim ( arbel, &dev_lim ) ) != 0 ) {
- DBGC ( arbel, "Arbel %p could not get device limits: %s\n",
- arbel, strerror ( rc ) );
- goto err_query_dev_lim;
- }
- arbel->limits.reserved_uars = MLX_GET ( &dev_lim, num_rsvd_uars );
- arbel->limits.reserved_cqs =
- ( 1 << MLX_GET ( &dev_lim, log2_rsvd_cqs ) );
- arbel->limits.reserved_qps =
- ( 1 << MLX_GET ( &dev_lim, log2_rsvd_qps ) );
-
- /* Get subnet manager LID */
- if ( ( rc = arbel_get_sm_lid ( arbel, &ibdev->sm_lid ) ) != 0 ) {
- DBGC ( arbel, "Arbel %p could not determine subnet manager "
- "LID: %s\n", arbel, strerror ( rc ) );
- goto err_get_sm_lid;
- }
- /* Get port GID */
- if ( ( rc = arbel_get_port_gid ( arbel, &ibdev->port_gid ) ) != 0 ) {
- DBGC ( arbel, "Arbel %p could not determine port GID: %s\n",
- arbel, strerror ( rc ) );
- goto err_get_port_gid;
- }
+ /* Get MAD parameters */
+ if ( ( rc = arbel_get_mad_params ( ibdev ) ) != 0 )
+ goto err_get_mad_params;
- /* Get partition key */
- if ( ( rc = arbel_get_pkey ( arbel, &ibdev->pkey ) ) != 0 ) {
- DBGC ( arbel, "Arbel %p could not determine partition key: "
- "%s\n", arbel, strerror ( rc ) );
- goto err_get_pkey;
- }
/* Add IPoIB device */
if ( ( rc = ipoib_probe ( ibdev ) ) != 0 ) {
@@ -1540,13 +1605,12 @@ static int arbel_probe ( struct pci_device *pci,
return 0;
err_ipoib_probe:
- err_get_pkey:
- err_get_port_gid:
- err_get_sm_lid:
- err_query_dev_lim:
+ err_get_mad_params:
ib_driver_close ( 0 );
err_ib_driver_init:
+
+ err_get_limits:
arbel_stop_firmware ( arbel );
err_start_firmware:
free_dma ( arbel->mailbox_out, ARBEL_MBOX_SIZE );
@@ -1567,6 +1631,8 @@ static void arbel_remove ( struct pci_device *pci ) {
struct ib_device *ibdev = pci_get_drvdata ( pci );
struct arbel *arbel = ibdev->dev_priv;
+
+#warning "check error sequence for probe()"
ipoib_remove ( ibdev );
ib_driver_close ( 0 );
arbel_stop_firmware ( arbel );