Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac4995b9 authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky
Browse files

s390/pci: add some new arch specific pci attributes



Add a bunch of s390 specific pci attributes to help
identifying pci functions.

Reviewed-by: default avatarGerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 93065d04
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -78,10 +78,16 @@ struct zpci_dev {
	enum zpci_state state;
	enum zpci_state state;
	u32		fid;		/* function ID, used by sclp */
	u32		fid;		/* function ID, used by sclp */
	u32		fh;		/* function handle, used by insn's */
	u32		fh;		/* function handle, used by insn's */
	u16		vfn;		/* virtual function number */
	u16		pchid;		/* physical channel ID */
	u16		pchid;		/* physical channel ID */
	u8		pfgid;		/* function group ID */
	u8		pfgid;		/* function group ID */
	u8		pft;		/* pci function type */
	u16		domain;
	u16		domain;


	u8 pfip[CLP_PFIP_NR_SEGMENTS];	/* pci function internal path */
	u32 uid;			/* user defined id */
	u8 util_str[CLP_UTIL_STR_LEN];	/* utility string */

	/* IRQ stuff */
	/* IRQ stuff */
	u64		msi_addr;	/* MSI address */
	u64		msi_addr;	/* MSI address */
	struct airq_iv *aibv;		/* adapter interrupt bit vector */
	struct airq_iv *aibv;		/* adapter interrupt bit vector */
+7 −3
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@ struct clp_fh_list_entry {
#define CLP_SET_DISABLE_PCI_FN	1	/* Yes, 1 disables it */
#define CLP_SET_DISABLE_PCI_FN	1	/* Yes, 1 disables it */


#define CLP_UTIL_STR_LEN	64
#define CLP_UTIL_STR_LEN	64
#define CLP_PFIP_NR_SEGMENTS	4


/* List PCI functions request */
/* List PCI functions request */
struct clp_req_list_pci {
struct clp_req_list_pci {
@@ -85,7 +86,7 @@ struct clp_rsp_query_pci {
	struct clp_rsp_hdr hdr;
	struct clp_rsp_hdr hdr;
	u32 fmt			:  4;	/* cmd request block format */
	u32 fmt			:  4;	/* cmd request block format */
	u32			: 28;
	u32			: 28;
	u64 reserved1;
	u64			: 64;
	u16 vfn;			/* virtual fn number */
	u16 vfn;			/* virtual fn number */
	u16			:  7;
	u16			:  7;
	u16 util_str_avail	:  1;	/* utility string available? */
	u16 util_str_avail	:  1;	/* utility string available? */
@@ -94,10 +95,13 @@ struct clp_rsp_query_pci {
	u8 bar_size[PCI_BAR_COUNT];
	u8 bar_size[PCI_BAR_COUNT];
	u16 pchid;
	u16 pchid;
	u32 bar[PCI_BAR_COUNT];
	u32 bar[PCI_BAR_COUNT];
	u64 reserved2;
	u8 pfip[CLP_PFIP_NR_SEGMENTS];	/* pci function internal path */
	u32			: 24;
	u8 pft;				/* pci function type */
	u64 sdma;			/* start dma as */
	u64 sdma;			/* start dma as */
	u64 edma;			/* end dma as */
	u64 edma;			/* end dma as */
	u64 reserved3[6];
	u32 reserved[11];
	u32 uid;			/* user defined id */
	u8 util_str[CLP_UTIL_STR_LEN];	/* utility string */
	u8 util_str[CLP_UTIL_STR_LEN];	/* utility string */
} __packed;
} __packed;


+10 −0
Original line number Original line Diff line number Diff line
@@ -114,6 +114,16 @@ static int clp_store_query_pci_fn(struct zpci_dev *zdev,
	zdev->end_dma = response->edma;
	zdev->end_dma = response->edma;
	zdev->pchid = response->pchid;
	zdev->pchid = response->pchid;
	zdev->pfgid = response->pfgid;
	zdev->pfgid = response->pfgid;
	zdev->pft = response->pft;
	zdev->vfn = response->vfn;
	zdev->uid = response->uid;

	memcpy(zdev->pfip, response->pfip, sizeof(zdev->pfip));
	if (response->util_str_avail) {
		memcpy(zdev->util_str, response->util_str,
		       sizeof(zdev->util_str));
	}

	return 0;
	return 0;
}
}


+42 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,13 @@ zpci_attr(function_id, "0x%08x\n", fid);
zpci_attr(function_handle, "0x%08x\n", fh);
zpci_attr(function_handle, "0x%08x\n", fh);
zpci_attr(pchid, "0x%04x\n", pchid);
zpci_attr(pchid, "0x%04x\n", pchid);
zpci_attr(pfgid, "0x%02x\n", pfgid);
zpci_attr(pfgid, "0x%02x\n", pfgid);
zpci_attr(vfn, "0x%04x\n", vfn);
zpci_attr(pft, "0x%02x\n", pft);
zpci_attr(uid, "0x%x\n", uid);
zpci_attr(segment0, "0x%02x\n", pfip[0]);
zpci_attr(segment1, "0x%02x\n", pfip[1]);
zpci_attr(segment2, "0x%02x\n", pfip[2]);
zpci_attr(segment3, "0x%02x\n", pfip[3]);


static ssize_t recover_store(struct device *dev, struct device_attribute *attr,
static ssize_t recover_store(struct device *dev, struct device_attribute *attr,
			     const char *buf, size_t count)
			     const char *buf, size_t count)
@@ -51,18 +58,53 @@ static ssize_t recover_store(struct device *dev, struct device_attribute *attr,
}
}
static DEVICE_ATTR_WO(recover);
static DEVICE_ATTR_WO(recover);


static ssize_t util_string_read(struct file *filp, struct kobject *kobj,
				struct bin_attribute *attr, char *buf,
				loff_t off, size_t count)
{
	struct device *dev = kobj_to_dev(kobj);
	struct pci_dev *pdev = to_pci_dev(dev);
	struct zpci_dev *zdev = get_zdev(pdev);

	return memory_read_from_buffer(buf, count, &off, zdev->util_str,
				       sizeof(zdev->util_str));
}
static BIN_ATTR_RO(util_string, CLP_UTIL_STR_LEN);
static struct bin_attribute *zpci_bin_attrs[] = {
	&bin_attr_util_string,
	NULL,
};

static struct attribute *zpci_dev_attrs[] = {
static struct attribute *zpci_dev_attrs[] = {
	&dev_attr_function_id.attr,
	&dev_attr_function_id.attr,
	&dev_attr_function_handle.attr,
	&dev_attr_function_handle.attr,
	&dev_attr_pchid.attr,
	&dev_attr_pchid.attr,
	&dev_attr_pfgid.attr,
	&dev_attr_pfgid.attr,
	&dev_attr_pft.attr,
	&dev_attr_vfn.attr,
	&dev_attr_uid.attr,
	&dev_attr_recover.attr,
	&dev_attr_recover.attr,
	NULL,
	NULL,
};
};
static struct attribute_group zpci_attr_group = {
static struct attribute_group zpci_attr_group = {
	.attrs = zpci_dev_attrs,
	.attrs = zpci_dev_attrs,
	.bin_attrs = zpci_bin_attrs,
};

static struct attribute *pfip_attrs[] = {
	&dev_attr_segment0.attr,
	&dev_attr_segment1.attr,
	&dev_attr_segment2.attr,
	&dev_attr_segment3.attr,
	NULL,
};
static struct attribute_group pfip_attr_group = {
	.name = "pfip",
	.attrs = pfip_attrs,
};
};

const struct attribute_group *zpci_attr_groups[] = {
const struct attribute_group *zpci_attr_groups[] = {
	&zpci_attr_group,
	&zpci_attr_group,
	&pfip_attr_group,
	NULL,
	NULL,
};
};