s390x/css: Add an algorithm to find a free chpid
This introduces a function named css_find_free_chpid() to find a free channel path. Because virtio-ccw device used zero as its channel path number, it would be sensible to skip the reserved one and search upwards. Signed-off-by: Jing Liu <liujbjl@linux.vnet.ibm.com> Reviewed-by: QingFeng Hao <haoqf@linux.vnet.ibm.com> Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
ae92cbd542
commit
6c15e9bfb6
@ -1302,6 +1302,27 @@ bool css_schid_final(int m, uint8_t cssid, uint8_t ssid, uint16_t schid)
|
|||||||
(MAX_SCHID + 1) / sizeof(unsigned long));
|
(MAX_SCHID + 1) / sizeof(unsigned long));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int css_find_free_chpid(uint8_t cssid)
|
||||||
|
{
|
||||||
|
CssImage *css = channel_subsys.css[cssid];
|
||||||
|
unsigned int chpid;
|
||||||
|
|
||||||
|
if (!css) {
|
||||||
|
return MAX_CHPID + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (chpid = 0; chpid <= MAX_CHPID; chpid++) {
|
||||||
|
/* skip reserved chpid */
|
||||||
|
if (chpid == VIRTIO_CCW_CHPID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!css->chpids[chpid].in_use) {
|
||||||
|
return chpid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MAX_CHPID + 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int css_add_virtual_chpid(uint8_t cssid, uint8_t chpid, uint8_t type)
|
static int css_add_virtual_chpid(uint8_t cssid, uint8_t chpid, uint8_t type)
|
||||||
{
|
{
|
||||||
CssImage *css;
|
CssImage *css;
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#define MAX_CIWS 62
|
#define MAX_CIWS 62
|
||||||
|
|
||||||
#define VIRTUAL_CSSID 0xfe
|
#define VIRTUAL_CSSID 0xfe
|
||||||
|
#define VIRTIO_CCW_CHPID 0 /* used by convention */
|
||||||
|
|
||||||
typedef struct CIW {
|
typedef struct CIW {
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
@ -115,6 +116,7 @@ bool css_devno_used(uint8_t cssid, uint8_t ssid, uint16_t devno);
|
|||||||
void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid,
|
void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid,
|
||||||
uint16_t devno, SubchDev *sch);
|
uint16_t devno, SubchDev *sch);
|
||||||
void css_sch_build_virtual_schib(SubchDev *sch, uint8_t chpid, uint8_t type);
|
void css_sch_build_virtual_schib(SubchDev *sch, uint8_t chpid, uint8_t type);
|
||||||
|
unsigned int css_find_free_chpid(uint8_t cssid);
|
||||||
uint16_t css_build_subchannel_id(SubchDev *sch);
|
uint16_t css_build_subchannel_id(SubchDev *sch);
|
||||||
void css_reset(void);
|
void css_reset(void);
|
||||||
void css_reset_sch(SubchDev *sch);
|
void css_reset_sch(SubchDev *sch);
|
||||||
|
Loading…
Reference in New Issue
Block a user