Update hptiop(4) to version 1.8, which added support for HighPoint

RocketRAID 4500 series.

Many thanks to HighPoint Technologies for their continued support
of FreeBSD!

Submitted by:	HighPoint Technologies
MFC after:	3 days
This commit is contained in:
Xin LI 2012-10-25 17:29:11 +00:00
parent ff473561da
commit 022a7377d0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=242086
3 changed files with 854 additions and 21 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd August 5, 2012
.Dd October 25, 2012
.Dt HPTIOP 4
.Os
.Sh NAME
@ -58,6 +58,10 @@ driver supports the following SAS and SATA RAID controllers:
.Pp
.Bl -bullet -compact
.It
HighPoint RocketRAID 4522
.It
HighPoint RocketRAID 4520
.It
HighPoint RocketRAID 4322
.It
HighPoint RocketRAID 4321

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/*
* HighPoint RR3xxx/4xxx RAID Driver for FreeBSD
* Copyright (C) 2007-2008 HighPoint Technologies, Inc. All Rights Reserved.
* Copyright (C) 2007-2012 HighPoint Technologies, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -115,6 +115,68 @@ struct hpt_iopmv_regs {
u_int32_t outbound_intmask;
};
#define CL_POINTER_TOGGLE 0x00004000
#define CPU_TO_F0_DRBL_MSG_A_BIT 0x02000000
#pragma pack(1)
struct hpt_iopmu_mvfrey {
u_int32_t reserved[0x4000 / 4];
/* hpt_frey_com_reg */
u_int32_t inbound_base; /* 0x4000 : 0 */
u_int32_t inbound_base_high; /* 4 */
u_int32_t reserved2[(0x18 - 8)/ 4];
u_int32_t inbound_write_ptr; /* 0x18 */
u_int32_t inbound_read_ptr; /* 0x1c */
u_int32_t reserved3[(0x2c - 0x20) / 4];
u_int32_t inbound_conf_ctl; /* 0x2c */
u_int32_t reserved4[(0x50 - 0x30) / 4];
u_int32_t outbound_base; /* 0x50 */
u_int32_t outbound_base_high; /* 0x54 */
u_int32_t outbound_shadow_base; /* 0x58 */
u_int32_t outbound_shadow_base_high; /* 0x5c */
u_int32_t reserved5[(0x68 - 0x60) / 4];
u_int32_t outbound_write; /* 0x68 */
u_int32_t reserved6[(0x70 - 0x6c) / 4];
u_int32_t outbound_read; /* 0x70 */
u_int32_t reserved7[(0x88 - 0x74) / 4];
u_int32_t isr_cause; /* 0x88 */
u_int32_t isr_enable; /* 0x8c */
u_int32_t reserved8[(0x10200 - 0x4090) / 4];
/* hpt_frey_intr_ctl intr_ctl */
u_int32_t main_int_cuase; /* 0x10200: 0 */
u_int32_t main_irq_enable; /* 4 */
u_int32_t main_fiq_enable; /* 8 */
u_int32_t pcie_f0_int_enable; /* 0xc */
u_int32_t pcie_f1_int_enable; /* 0x10 */
u_int32_t pcie_f2_int_enable; /* 0x14 */
u_int32_t pcie_f3_int_enable; /* 0x18 */
u_int32_t reserved9[(0x10400 - 0x1021c) / 4];
/* hpt_frey_msg_drbl */
u_int32_t f0_to_cpu_msg_a; /* 0x10400: 0 */
u_int32_t reserved10[(0x20 - 4) / 4];
u_int32_t cpu_to_f0_msg_a; /* 0x20 */
u_int32_t reserved11[(0x80 - 0x24) / 4];
u_int32_t f0_doorbell; /* 0x80 */
u_int32_t f0_doorbell_enable; /* 0x84 */
};
struct mvfrey_inlist_entry {
u_int64_t addr;
u_int32_t intrfc_len;
u_int32_t reserved;
};
struct mvfrey_outlist_entry {
u_int32_t val;
};
#pragma pack()
#define MVIOP_IOCTLCFG_SIZE 0x800
#define MVIOP_MU_QUEUE_ADDR_HOST_MASK (~(0x1full))
#define MVIOP_MU_QUEUE_ADDR_HOST_BIT 4
@ -136,6 +198,8 @@ struct hpt_iopmv_regs {
#define MVIOP_REQUEST_NUMBER_START_BIT 16
#define MVFREYIOPMU_QUEUE_REQUEST_RESULT_BIT 0x40000000
enum hpt_iopmu_message {
/* host-to-iop messages */
IOPMU_INBOUND_MSG0_NOP = 0,
@ -144,6 +208,7 @@ enum hpt_iopmu_message {
IOPMU_INBOUND_MSG0_SHUTDOWN,
IOPMU_INBOUND_MSG0_STOP_BACKGROUND_TASK,
IOPMU_INBOUND_MSG0_START_BACKGROUND_TASK,
IOPMU_INBOUND_MSG0_RESET_COMM,
IOPMU_INBOUND_MSG0_MAX = 0xff,
/* iop-to-host messages */
IOPMU_OUTBOUND_MSG0_REGISTER_DEVICE_0 = 0x100,
@ -159,6 +224,8 @@ enum hpt_iopmu_message {
#define IOP_REQUEST_FLAG_REMAPPED 4
#define IOP_REQUEST_FLAG_OUTPUT_CONTEXT 8
#define IOP_REQUEST_FLAG_ADDR_BITS 0x40 /* flags[31:16] is phy_addr[47:32] */
enum hpt_iop_request_type {
IOP_REQUEST_TYPE_GET_CONFIG = 0,
IOP_REQUEST_TYPE_SET_CONFIG,
@ -179,6 +246,7 @@ enum hpt_iop_result_type {
IOP_RESULT_CHECK_CONDITION,
};
#pragma pack(1)
struct hpt_iop_request_header {
u_int32_t size;
u_int32_t type;
@ -287,6 +355,21 @@ struct hpt_iop_hba {
struct hpt_iopmv_regs *regs;
struct hpt_iopmu_mv *mu;
} mv;
struct {
struct hpt_iop_request_get_config *config;
struct hpt_iopmu_mvfrey *mu;
int internal_mem_size;
int list_count;
struct mvfrey_inlist_entry *inlist;
u_int64_t inlist_phy;
u_int32_t inlist_wptr;
struct mvfrey_outlist_entry *outlist;
u_int64_t outlist_phy;
u_int32_t *outlist_cptr; /* copy pointer shadow */
u_int64_t outlist_cptr_phy;
u_int32_t outlist_rptr;
} mvfrey;
} u;
struct hpt_iop_hba *next;
@ -335,7 +418,8 @@ struct hpt_iop_hba {
struct resource *ctlcfg_res;
void *ctlcfg_handle;
u_int64_t ctlcfgcmd_phy;
u_int32_t config_done;
u_int32_t config_done; /* can be negative value */
u_int32_t initialized:1;
/* other resources */
struct cam_sim *sim;
@ -350,8 +434,17 @@ struct hpt_iop_hba {
u_int32_t flag;
struct hpt_iop_srb* srb[HPT_SRB_MAX_QUEUE_SIZE];
};
#pragma pack()
enum hptiop_family {
INTEL_BASED_IOP = 0,
MV_BASED_IOP,
MVFREY_BASED_IOP,
UNKNOWN_BASED_IOP = 0xf
};
struct hptiop_adapter_ops {
enum hptiop_family family;
int (*iop_wait_ready)(struct hpt_iop_hba *hba, u_int32_t millisec);
int (*internal_memalloc)(struct hpt_iop_hba *hba);
int (*internal_memfree)(struct hpt_iop_hba *hba);
@ -366,7 +459,8 @@ struct hptiop_adapter_ops {
int (*iop_intr)(struct hpt_iop_hba *hba);
void (*post_msg)(struct hpt_iop_hba *hba, u_int32_t msg);
void (*post_req)(struct hpt_iop_hba *hba, struct hpt_iop_srb *srb, bus_dma_segment_t *segs, int nsegs);
int (*do_ioctl)(struct hpt_iop_hba *hba, struct hpt_iop_ioctl_param * pParams);
int (*do_ioctl)(struct hpt_iop_hba *hba, struct hpt_iop_ioctl_param * pParams);
int (*reset_comm)(struct hpt_iop_hba *hba);
};
struct hpt_iop_srb {