* [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7
@ 2016-07-05 7:56 Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 1/8] pc-bios/s390-ccw: Pass selected SCSI device to IPL Cornelia Huck
` (7 more replies)
0 siblings, 8 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Cornelia Huck
The following patches (and the s390x pci patches already on the
list) make up the last batch of s390x patches I plan to do for
2.7 (except for bug fixes that may crop up, of course).
We have several fixes/enhancements in the boot code and a bit
of refactoring in the css code that makes the future addition
of device types easier.
Alexander Yarygin (1):
s390x/ipl: Support IPL from selected SCSI device
Cornelia Huck (1):
pc-bios/s390-ccw.img: rebuild image
David Hildenbrand (1):
s390x/ipl: fix reboots for migration from different bios
Eugene (jno) Dvurechenski (1):
pc-bios/s390-ccw: Pass selected SCSI device to IPL
Jing Liu (2):
s390x/css: Factor out virtual css bridge and bus
s390x/css: Unplug handler of virtual css bridge
Sascha Silbe (2):
s390x/css: factor out some generic code from
virtio_ccw_device_realize()
s390x/css: use define for "virtual-css-bridge" literal
hw/s390x/Makefile.objs | 2 +
hw/s390x/ccw-device.c | 27 ++++
hw/s390x/ccw-device.h | 43 +++++++
hw/s390x/css-bridge.c | 124 +++++++++++++++++++
hw/s390x/css.c | 143 ++++++++++++++++++++++
hw/s390x/ipl.c | 37 +++++-
hw/s390x/ipl.h | 15 +++
hw/s390x/s390-virtio-ccw.c | 3 +-
hw/s390x/virtio-ccw.c | 271 ++++++++---------------------------------
hw/s390x/virtio-ccw.h | 20 +--
include/hw/s390x/css-bridge.h | 31 +++++
include/hw/s390x/css.h | 18 +++
pc-bios/s390-ccw.img | Bin 26424 -> 26440 bytes
pc-bios/s390-ccw/iplb.h | 12 ++
pc-bios/s390-ccw/main.c | 12 ++
pc-bios/s390-ccw/virtio-scsi.c | 11 ++
pc-bios/s390-ccw/virtio.h | 2 +
17 files changed, 531 insertions(+), 240 deletions(-)
create mode 100644 hw/s390x/ccw-device.c
create mode 100644 hw/s390x/ccw-device.h
create mode 100644 hw/s390x/css-bridge.c
create mode 100644 include/hw/s390x/css-bridge.h
--
2.9.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 1/8] pc-bios/s390-ccw: Pass selected SCSI device to IPL
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 2/8] pc-bios/s390-ccw.img: rebuild image Cornelia Huck
` (6 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel
Cc: borntraeger, agraf, jfrei, Eugene (jno) Dvurechenski,
Alexander Yarygin, Cornelia Huck
From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com>
There is ,bootindex=%d argument to specify the lookup order of
boot devices.
If a bootindex assigned to the device, then IPL Parameter Info Block
is created for that device when it is IPLed from.
If it is a mere SCSI device (not FCP), then IPIB is created with a
special SCSI type and its fields are used to store SCSI address of the
device. This new ipl block is private to qemu for now.
If the device to IPL from is specified this way, then SCSI bus lookup
is bypassed and prescribed devices uses the address specified.
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Alexander Yarygin <yarygin@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
pc-bios/s390-ccw/iplb.h | 12 ++++++++++++
pc-bios/s390-ccw/main.c | 12 ++++++++++++
pc-bios/s390-ccw/virtio-scsi.c | 11 +++++++++++
pc-bios/s390-ccw/virtio.h | 2 ++
4 files changed, 37 insertions(+)
diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index 1cf509f..86abc56 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -43,6 +43,16 @@ struct IplBlockFcp {
} __attribute__ ((packed));
typedef struct IplBlockFcp IplBlockFcp;
+struct IplBlockQemuScsi {
+ uint32_t lun;
+ uint16_t target;
+ uint16_t channel;
+ uint8_t reserved0[77];
+ uint8_t ssid;
+ uint16_t devno;
+} __attribute__ ((packed));
+typedef struct IplBlockQemuScsi IplBlockQemuScsi;
+
struct IplParameterBlock {
uint32_t len;
uint8_t reserved0[3];
@@ -55,6 +65,7 @@ struct IplParameterBlock {
union {
IplBlockCcw ccw;
IplBlockFcp fcp;
+ IplBlockQemuScsi scsi;
};
} __attribute__ ((packed));
typedef struct IplParameterBlock IplParameterBlock;
@@ -63,6 +74,7 @@ extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
#define S390_IPL_TYPE_FCP 0x00
#define S390_IPL_TYPE_CCW 0x02
+#define S390_IPL_TYPE_QEMU_SCSI 0xff
static inline bool store_iplb(IplParameterBlock *iplb)
{
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 9446ecc..345b848 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -84,6 +84,18 @@ static void virtio_setup(void)
debug_print_int("ssid ", blk_schid.ssid);
found = find_dev(&schib, dev_no);
break;
+ case S390_IPL_TYPE_QEMU_SCSI:
+ {
+ VDev *vdev = virtio_get_device();
+
+ vdev->scsi_device_selected = true;
+ vdev->selected_scsi_device.channel = iplb.scsi.channel;
+ vdev->selected_scsi_device.target = iplb.scsi.target;
+ vdev->selected_scsi_device.lun = iplb.scsi.lun;
+ blk_schid.ssid = iplb.scsi.ssid & 0x3;
+ found = find_dev(&schib, iplb.scsi.devno);
+ break;
+ }
default:
panic("List-directed IPL not supported yet!\n");
}
diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c
index 3bb48e9..d850a8d 100644
--- a/pc-bios/s390-ccw/virtio-scsi.c
+++ b/pc-bios/s390-ccw/virtio-scsi.c
@@ -204,6 +204,17 @@ static void virtio_scsi_locate_device(VDev *vdev)
debug_print_int("config.scsi.max_target ", vdev->config.scsi.max_target);
debug_print_int("config.scsi.max_lun ", vdev->config.scsi.max_lun);
+ if (vdev->scsi_device_selected) {
+ sdev->channel = vdev->selected_scsi_device.channel;
+ sdev->target = vdev->selected_scsi_device.target;
+ sdev->lun = vdev->selected_scsi_device.lun;
+
+ IPL_check(sdev->channel == 0, "non-zero channel requested");
+ IPL_check(sdev->target <= vdev->config.scsi.max_target, "target# high");
+ IPL_check(sdev->lun <= vdev->config.scsi.max_lun, "LUN# high");
+ return;
+ }
+
for (target = 0; target <= vdev->config.scsi.max_target; target++) {
sdev->channel = channel;
sdev->target = target; /* sdev->lun will be 0 here */
diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h
index 3c6e915..eb35ea5 100644
--- a/pc-bios/s390-ccw/virtio.h
+++ b/pc-bios/s390-ccw/virtio.h
@@ -274,6 +274,8 @@ struct VDev {
uint64_t scsi_last_block;
uint32_t scsi_dev_cyls;
uint8_t scsi_dev_heads;
+ bool scsi_device_selected;
+ ScsiDevice selected_scsi_device;
};
typedef struct VDev VDev;
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 2/8] pc-bios/s390-ccw.img: rebuild image
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 1/8] pc-bios/s390-ccw: Pass selected SCSI device to IPL Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 3/8] s390x/ipl: Support IPL from selected SCSI device Cornelia Huck
` (5 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Cornelia Huck
Contains:
- pc-bios/s390-ccw: Pass selected SCSI device to IPL
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
pc-bios/s390-ccw.img | Bin 26424 -> 26440 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index ea5fd9a4797530e79e88f591f66c4de8e93a604e..089f6ba5e924c17796cccac4ecbfa7a78b00ba22 100644
GIT binary patch
delta 7745
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
delta 7225
zcmZ`;d34itw*UT;G)Y&IbW79HCT%G#ODVLJvM0z=wi2W;1sTn-J#Y~Eu=r4cM6L7C
zgPgWs;D9n%7Yw3D3dMOv5uy(jN5slnWUFRSjxaL`q83?x?{jZxVVv{&NAAt{-ut=t
zd++^j>7gS^%Mqn6(-PGpB7e>ZnbT5V^hQjjDe|q-RNvlDF-nuN&N99|GIp2BCgsh<
zweudG<$6ROySnZ4w`=$P_<3#5vvRTKYg^Reh&q2Nz)OgHUuKjZEn(JaQ}MZ7ThXOj
zZNFm@7oi3?)(tW@{mZDfxJEj4sdA|<){^mp|Av|$xF|&Y7Wzzyl52I74ZAJb{u(h#
zw(F9;aV&i<0O$-O^Un~U)t7j2D}ca;Kej<*ii5?tpxyL{s4FirEvdA(ifyGrJZBf?
z00J1eqRP}Hwxy`oQ!H+9dy_=5%N}~2QI^49t@_t0dy}B=iF4@FGLA+oL@a%YJxxy2
ze`fXnWj;WB{BY*aFh7X+%x_p{7mx2_{;fbrh-Y*C*VLJEfWBV&yF93WMcE=37=|mG
z<?Dum#M+~=n1=|MR8{?!EW6*5?S^#6WJb{kO_1s?UkDq8&Je!5GvpSzfmZl>L}nPh
zQ~LXF{G%h_6XK;yuA;CpX!n_fjy!j3r$j0*P?BtWPiVtNlknGyBto^#AdT2#%)i6@
z7wq}J<PXLPdA8=D-2<n=CXZF<juwVan?#@*W(R`yPyp_W;BK9q6+OLRF1zwjwnQR9
zq@8ED2aw;>%*|k6A={#}%;Wr<g%WHJH3Gv8j6u>EbI_JnMT#*e*!&>#UlO13xcn~W
zfwW8>d5NWs%x_@nNI5Gue~I;$%j2>0@CsI`VSX8_WCSj%>a8nCet^DPzh~Jz)|<%u
zgRF<%f?k{d+HHom9%GrC^&;*k5TAZchGK2bj8$mdGJk<EQ6gR}^p6(`8N{!mjEj8A
z_=`FId|?inLfbLbM$Bd1UY)3?X3SVCC&c}S@~zw**Hbwnzm7}y1~w>ms?9XA?Ee|N
z-E*hzOG6!0cmEop*q$bTo8R1<BC<Pu#{JAbqpbOu<nv@{?M|^ozsUTj%&+I*NAM&Q
zSaUf`c}Yb-o6BE5W>qh%7Le-A>!|j2G!uf_yi{(A@0-35llaeI6Hm$`#Gl<RpWP9t
z12;vs$M-Yb$4HxHO2R13pA+P)gv?&4PZO?DWy$@_Unk!78vA(EpN7`Qw9?)3)r2XN
zKkAy8nR|-cHFYT4wJ=68^Sc>iHe>Xm_V;ZIIyqWI<J(Ey>f0wrbUSWKd6x|akU=W1
zTVo&M(@x4hrU9BQvC?C**;1Y&EyHcr+RA(fYrQJhn^q0nO<@HcKusZ8%<a3urSKMJ
z*v6J)*z#qz952V3^E9as$|dFrw&ZVF@(^p4Ge48HwDPFAT9fjn9Bs)bvc%HeFosgT
z@v3aF<lNWJ{?6U?m;3;Y=-bFT<vjC8iMOt#Wc)gb_>EsM-$04octAE<l6&uAoL%?e
z^kdt%8RtFb-(VcKEK78xZS`A)2)aWpBG+vS?eXtLnK1p;yXCUPp6OftX?D@D16|u&
zDE?ISCK{s`d0SmC_ar`OOX8&KIq50CV{lG-Dw3X5VoO@bL$U0ew-9|4@u@rI6G<by
zs}ufTcwT7HM`#-AGBQb;L{L$@Xp*lp&s%irBb0*c!?7%QjVG0{>|L@+{)+jX>~bdS
z6+mwSO~U1L%0bB+Y>92GGoAI<Ge3p+l<V@l<XN^v?vbc;7B66NGK&w$St&CUC(#bQ
zo~xs~z&c~(Cn-}5Lx^9$Q)Z;*DDl#nnw)ANTV1{XnuubXHI&8m&&tKAY2FniGcLbd
zGs};xT}>!S+)=uR*=rI_;+Mbq_X{odk(JaxiDgwdIcAz#t2=jn%W<}z%GMW{pGbW2
zPi+112Bo#8OLu?ZVhREq%E~8Lc_1rakTz@fYzyziy6!BF;HI+pL&mBPwzjUqeuwxC
zgVK(6p+3t%8n*g~c<oKLdV{SVBYu5vxyhR8wd_BkZLMw+{u=d1R-eb}ZFG{OR!=qz
z2)zz!V%Y%f+?R;6@Y2$L%%hL8#R1}z7qNrEuxMbt5|;5noiv^Kw^$E664}Eq2c{**
zB`wEBUlnK+Le|L{X*mzACQZYWcMD?Xj?;4BNxZvhxj4x-!uk0JDuiX!32o!-yN9ot
zQ?H%PF-~CLd`2eYj7-ZIV&)T2>tgXp7DtM3ks;sRAR6c3l-W#j$s6F$zfjM}Tv=$#
z@XBP4(Q;3Wbqo^EfFqbUFu#idpQ0F(Mpw0>Sy~&rt_bGkq^Y^en!I*2SD4?(Rtuo3
z>nyAJA=W($d4Wjc)M`$$vX7PBw8^_#LydIkC-X9D_(Wc{<)mh_;VvvZzS3!UH%iQq
zebRG=rm~FBuEZV8uj>p3sWqaMzccXP<(EU{kvmb+S3H?0`F#2zO@mohX5@@h$u#Qb
z-F%pypb_O40!w_5`7rY@QLsP#ksuO1sF~oJ@dB$qEB9xlP5qLw4&Q^t^;14&doGsp
zA@hG^tf7oGoR0naU0sNUeAgr|#WKJ96Sl<9&}JTj*47-za(GbP|E5E={`YcU_wKF=
zb~^E{({7(}&|}Gw<tp<|=6@ik*WRmYs>5wk2$Ly*)~zp;w#@!x@>q{gFD<S?s(QPQ
zbPCcq+<|v)8!v}0(QSjr`0{jZ6>I5vBwN;H4)I#BEy2wU6o7YN%ku;+j$pkS(GxXd
z2Dz>K=s;Fo5;|mV(B4Q_(jtttkf!e4d#1vtxoG0>H!;o*<}2Ap?o3Rjv&*{i#YXhw
zn~jB=T5xw*(9{Shfy}l4L-E$FcV#07<kBlwWI0>|8G0#0momSI`9$XDVk(T9aGt+E
zz_KCC^8sL1<=0vHr3oMK5O3m^h`5AQ%`j8dAKwAY9)p3JJh8}MCNe0LrYu=zFR|vE
zA{jP>4TfNAXknyZ6QgCVy)WGb?K#RRdD7k^`7@U4I<*OGXR|apdTA`Xnuj^YDT-Ov
zX6Gns^Y-j3iapPWI}6<8>G1q17IlW(2E*kGo%m)&?#cbiTnAacNFf>N_E;m&_pr)$
zdh}D~fg7hdWnSJ+<&r#^H&r<x^LyrLx_vL*J^L!_n^*T7t!U!T$%Fah9axa6`p<!w
z<v;JbNce)A7qB_|WMRQdOTvaoH+Obe&T_f0AZ*}dWM7vVy>sNLUc-&?S16S1k1?=H
z`ICIHcXdkqa#|?a6Ug3eZ|cJe4@i5T<k$-TVDYzr6Vi#&*~g~I?jdLQ8RzW_)$#^i
z=ruBQ{K`g%QQbxzrre+_jN7zpG~RsqR40cDm||SzgnuTkGtj(I8#FZ`Z7luTpD8r3
zI|gb**U^3^;vJ;-_cDK#pm!s;gX0WvvIEXc#8bsEe}KapasI#*98L$7SX#Y%Uy{zg
z7nGUOURYV?D1^lTY;)t_8P79Z)S4+qbw2qpV6Rox4&H0ycy)E~UK_JfzFnB@btvRG
z;u4dH-1DAg^E@^m$L0r#k3**eYCrKY3yHr{hJsmGuh{>VaQYvn*9vrauZ_cj37&6$
zF>cnk2kTmK?U?DoTt=(U1SSK@9)SD)E@$X9#Lwoxj-db|&q=fufz)yUy_jFk0pt^Z
zx#Mn*?WlCWOs^hy7Z~tuI4+BMz75A{+29zq64S2oPI&$2tWnPJ*uh{qiumX&ti6xN
zxj8#ZiMJyk*a^ym&Tu|n&P#buyT)4BBM{K|*Zy4;dz670{#GoNGx8X>@5SNeXb^X=
zx<Na4j0uhsrLU;Wrk_KmzwkXT*2(;7@)rG!JX%z2Fw#D>^IaL&zd&h}rTr%vW0zxx
zRGuo5&-Z^^`9SIhtS*V+A2VY6_;1_};n{^-H{OnTYNKUdB`kdst%j`NQB$bRF3|3Z
zZ=U?ifJye4b9nc(i`>gog-*l;-8ja5Q1U~`34>Q<c5#`-XGVAaDJYzAXmt$7?39a(
zGc+-8$>)oUW9jMm8adIOk%x+hrjIAy@co@5!5c2`JQ8$GGP7ie#(+C+$w=j-e6eJG
zT=a2R_a#tWPV<m~sY=@6NaVQ9Dy!?To3&!E17P$h`EaR2DV1wW^Ss8NFdb#}CjX6F
zhwi8&BP&nRPZ-E|$Yl-*Ono<=9LnmKgGHQ>YDbmGb-6?6Cz`RpKp6%dn=3mc(4Cj?
zL>8{%kZ{$7%kXf4TO{%jK8r$a{0LW8_kv}U$aQ*s)f%WY;U^9^{TOj7Hf)6Bd?B3n
zYT+-_7=!LGoVkm_2^=2w<8T>VR*7P_JM6^9qPR`r(Xd$TwujvfjbUShCL9xNM6z-r
z)j&EAM}QUxmHsM?5mp|50dVO_om+*t2UAjv&EO`w+;F}~;MXo}njZvBjj^K6V#c`{
zBkKG$no)Z-c<|SXiI=USNW@<@<1-FnUBax;6wwY>QRosK6xum*McMt8MqF^{JOng9
z<gZ1utKZY;EiKZ4d1FL*^7?_SA{?*E^))8E8#3{dtJTc6nBmHL!q6)0MmVR}g7V}Q
zX&>zHT7&jo6{6ny)HXZ~k}dv&YC*7(63Y0z^L#%BFPRMgc(r4%QH&xKCp@U9BYKEv
z8~ym^A1ai~#X>9MgNco}qPR`fI{$W|r59$#ic?WkjiXuNGSmVaHM~{{ovSDxSsE|&
z$dtf~Us+|M3EhkbXm8YC13I2Ye%dGhF*w~j0;#3~`|N1?pvRsd>JE&=Dy~(=S$1HG
z#!6qS)xS>Qd8Aa)1e9}R{o^d+4Y)OeuOwb~oA~dJ_@6_9cBm}*=^;$-Y4$d2uR}bI
zRBU-hh|yRJzeK{9Zx5N~^-(*}T3=~IYoMW!2DBR@<?0*ugX^rmp3rVp1x-FweS`4D
zV#(@Jc`ApIW7<j@H-hL7EuUD*ljkZ;tx0@p)hGo)6N0V7hzTQ6u*#CYq1_7%_@Sy>
zP*5)Lb6}J|9kb{uuJZ^N&VYB4s$P9delm2J&V}VAjl*V}XeE+YJzhA-@?Kdp%wb68
z2wZZ@uptXbC|+UHOjg{&yp?$EN5o%jz_aX41cNu}?GpdBTY*Xs!d-$A*4%yrvcLSM
zp+k{|)}KN{hp3?yD>bxN&u2>bAhN{`9X<fCi}&?+Dz2%G<`4S2QPtaOWJah!Hx8ki
zLJ0G1Qa_ma*LfV*X^d}$`y0F)=&(#hS9`t!<a5ZRQPfAq(3(AU7`za9Ys5J0qGGB2
zu|>;j7A>{UoB!CNx%2G{mM&j14==F5h`eUaNKb6@#tFj}?@HvSP*vZn!!ydNs{3$(
zP&TRR2PV*VQ0z8J2WUCuPEZeM6=(p|r>gs%piQd!VH0RbRSy**uM1W6FwyO*dL#r2
zoUeeR1O74K=sc==q74*s?@1B_RP|&#C=^ctFv_T^Z5WTrSJl&-K&w^tYZ`9^1wd2_
zC<2XY1tmEGJOhV%=%0a}-U+$}6oH;;1%>@tALts;L!iJpZ^!x(s#iS^Ljxi^4}qav
zRWG<fSEy>c6|@BujtrMT1K0?Ks(zCX3jJ@IK;8H;yd2brrAOZp(Dx*V{w2_8ldAp@
z0`=fL_kcFxrUSfajPYNRoHRL8^InTwJbA3`eOL&1?fT0Aw^CK#&zFZMXX;z3QHpXI
znw)KWpHz~%^n}O-e-@fT_NmCzyk90OD+=}RuR-n~md+_Da%)Adet!#QzLLM5ub8bl
z7?8uJjL;nN$(2(|HJ=;h9*{4L^2(I4nj`J9#65Nh6-`v!;|2j~N28b?jJ1fdFBmkn
zF<+F&c4;6C?L5dk<Q{jP=4g>T>(101?T|O!V>QR^a`e=~0mnB%+t_8n)6fl5)#C`Z
z^Zz$21(vQ7<39QN)I81cP4e*6LhlI@-T5yMYat1`gV5^0x6wQj`Jizm<OI#&x8v6^
zUWM@;|EeDqhjA**z527!UAgE^J91wo<m30xw4Jg-C*~g8KG4~M&Nay^_ZMnTt&kbh
zKw9ObX(KdkRdVgL!U1gyp+Dyy8^outMVGhyX1oOBz&edOOe@u#u9CTxh5FM0%w`@}
zZb@Z{?OYp-YVH9;stk+K!DVt^WuE?m2}|)4Sv@&P-mEOue?y5~%*GYdOZ4At$Jc9-
zrkI|q|JDPCf5lg8R9lob>apgF)3c+SO*1Yj(mU7CobZrIiRt_|o59$e?|DIK{`e0C
zT20v|8JbsU8E%Zk(MjXlWYPS>n0x+#w{U)G%tUyhzlk2Xeg3CPyR2R?i2gCRU?e^-
REf^VXXR#0svS_aL{{VwpXafKM
--
2.9.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 3/8] s390x/ipl: Support IPL from selected SCSI device
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 1/8] pc-bios/s390-ccw: Pass selected SCSI device to IPL Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 2/8] pc-bios/s390-ccw.img: rebuild image Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 4/8] s390x/ipl: fix reboots for migration from different bios Cornelia Huck
` (4 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Alexander Yarygin, Cornelia Huck
From: Alexander Yarygin <yarygin@linux.vnet.ibm.com>
If bootindex is specified for a device, we need to IPL from
it. Currently it works for ccw devices, but not for SCSI. To be able to
IPL from the specific device, pc-bios needs to know its address.
For this reason we add special QEMU_SCSI IPL type into the IPLB
structure, that contains the scsi device address.
We enhance the ipl block with a currently qemu-only parameter block
that allows us to specify a concrete scsi device.
Signed-off-by: Alexander Yarygin <yarygin@linux.vnet.ibm.com>
Reviewed-by: Eric Farman <farman@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
hw/s390x/ipl.c | 18 ++++++++++++++++++
hw/s390x/ipl.h | 13 +++++++++++++
2 files changed, 31 insertions(+)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index e6bf7cf..78998cd 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -217,6 +217,8 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
OBJECT(qdev_get_parent_bus(dev_st)->parent),
TYPE_VIRTIO_CCW_DEVICE);
+ SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st),
+ TYPE_SCSI_DEVICE);
if (ccw_dev) {
ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN);
ipl->iplb.blk0_len =
@@ -225,6 +227,22 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
ipl->iplb.ccw.devno = cpu_to_be16(ccw_dev->sch->devno);
ipl->iplb.ccw.ssid = ccw_dev->sch->ssid & 3;
return true;
+ } else if (sd) {
+ SCSIBus *bus = scsi_bus_from_device(sd);
+ VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus);
+ VirtIOSCSICcw *scsi_ccw = container_of(vdev, VirtIOSCSICcw, vdev);
+ VirtioCcwDevice *ccw = &scsi_ccw->parent_obj;
+
+ ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN);
+ ipl->iplb.blk0_len =
+ cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN - S390_IPLB_HEADER_LEN);
+ ipl->iplb.pbt = S390_IPL_TYPE_QEMU_SCSI;
+ ipl->iplb.scsi.lun = cpu_to_be32(sd->lun);
+ ipl->iplb.scsi.target = cpu_to_be16(sd->id);
+ ipl->iplb.scsi.channel = cpu_to_be16(sd->channel);
+ ipl->iplb.scsi.devno = cpu_to_be16(ccw->sch->devno);
+ ipl->iplb.scsi.ssid = ccw->sch->ssid & 3;
+ return true;
}
}
diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index 9aa4d94..ed3f2c8 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -46,6 +46,16 @@ struct IplBlockFcp {
} QEMU_PACKED;
typedef struct IplBlockFcp IplBlockFcp;
+struct IplBlockQemuScsi {
+ uint32_t lun;
+ uint16_t target;
+ uint16_t channel;
+ uint8_t reserved0[77];
+ uint8_t ssid;
+ uint16_t devno;
+} QEMU_PACKED;
+typedef struct IplBlockQemuScsi IplBlockQemuScsi;
+
union IplParameterBlock {
struct {
uint32_t len;
@@ -59,6 +69,7 @@ union IplParameterBlock {
union {
IplBlockCcw ccw;
IplBlockFcp fcp;
+ IplBlockQemuScsi scsi;
};
} QEMU_PACKED;
struct {
@@ -102,10 +113,12 @@ typedef struct S390IPLState S390IPLState;
#define S390_IPL_TYPE_FCP 0x00
#define S390_IPL_TYPE_CCW 0x02
+#define S390_IPL_TYPE_QEMU_SCSI 0xff
#define S390_IPLB_HEADER_LEN 8
#define S390_IPLB_MIN_CCW_LEN 200
#define S390_IPLB_MIN_FCP_LEN 384
+#define S390_IPLB_MIN_QEMU_SCSI_LEN 200
static inline bool iplb_valid_len(IplParameterBlock *iplb)
{
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 4/8] s390x/ipl: fix reboots for migration from different bios
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
` (2 preceding siblings ...)
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 3/8] s390x/ipl: Support IPL from selected SCSI device Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 5/8] s390x/css: factor out some generic code from virtio_ccw_device_realize() Cornelia Huck
` (3 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel
Cc: borntraeger, agraf, jfrei, David Hildenbrand, qemu-stable,
Cornelia Huck
From: David Hildenbrand <dahi@linux.vnet.ibm.com>
When migrating from a different QEMU version, the start_address and
bios_start_address may differ. During migration these values are migrated
and overwrite the values that were detected by QEMU itself.
On a reboot, QEMU will reload its own BIOS, but use the migrated start
addresses, which does not work if the values differ.
Fix this by not relying on the migrated values anymore, but still
provide them during migration, so existing QEMUs continue to work.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
hw/s390x/ipl.c | 11 +++++++++--
hw/s390x/ipl.h | 2 ++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 78998cd..a54284c 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -69,8 +69,8 @@ static const VMStateDescription vmstate_ipl = {
.version_id = 0,
.minimum_version_id = 0,
.fields = (VMStateField[]) {
- VMSTATE_UINT64(start_addr, S390IPLState),
- VMSTATE_UINT64(bios_start_addr, S390IPLState),
+ VMSTATE_UINT64(compat_start_addr, S390IPLState),
+ VMSTATE_UINT64(compat_bios_start_addr, S390IPLState),
VMSTATE_STRUCT(iplb, S390IPLState, 0, vmstate_iplb, IplParameterBlock),
VMSTATE_BOOL(iplb_valid, S390IPLState),
VMSTATE_UINT8(cssid, S390IPLState),
@@ -192,6 +192,13 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
stq_p(rom_ptr(INITRD_PARM_SIZE), initrd_size);
}
}
+ /*
+ * Don't ever use the migrated values, they could come from a different
+ * BIOS and therefore don't work. But still migrate the values, so
+ * QEMUs relying on it don't break.
+ */
+ ipl->compat_start_addr = ipl->start_addr;
+ ipl->compat_bios_start_addr = ipl->bios_start_addr;
qemu_register_reset(qdev_reset_all_fn, dev);
error:
error_propagate(errp, err);
diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index ed3f2c8..c891095 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -93,7 +93,9 @@ struct S390IPLState {
/*< private >*/
DeviceState parent_obj;
uint64_t start_addr;
+ uint64_t compat_start_addr;
uint64_t bios_start_addr;
+ uint64_t compat_bios_start_addr;
bool enforce_bios;
IplParameterBlock iplb;
bool iplb_valid;
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 5/8] s390x/css: factor out some generic code from virtio_ccw_device_realize()
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
` (3 preceding siblings ...)
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 4/8] s390x/ipl: fix reboots for migration from different bios Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 6/8] s390x/css: use define for "virtual-css-bridge" literal Cornelia Huck
` (2 subsequent siblings)
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Sascha Silbe, Cornelia Huck
From: Sascha Silbe <silbe@linux.vnet.ibm.com>
A lot of what virtio_ccw_device_realize() does isn't specific to
virtio; it would apply to emulated CCW as well. Factor it out to make
it easier to implement emulated CCW devices later on.
Signed-off-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
hw/s390x/css.c | 143 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/s390x/virtio-ccw.c | 122 +++++------------------------------------
hw/s390x/virtio-ccw.h | 2 -
include/hw/s390x/css.h | 18 +++++++
4 files changed, 175 insertions(+), 110 deletions(-)
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 7666881..54991f5 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -1340,6 +1340,116 @@ SubchDev *css_find_subch(uint8_t m, uint8_t cssid, uint8_t ssid, uint16_t schid)
return channel_subsys.css[real_cssid]->sch_set[ssid]->sch[schid];
}
+/**
+ * Return free device number in subchannel set.
+ *
+ * Return index of the first free device number in the subchannel set
+ * identified by @p cssid and @p ssid, beginning the search at @p
+ * start and wrapping around at MAX_DEVNO. Return a value exceeding
+ * MAX_SCHID if there are no free device numbers in the subchannel
+ * set.
+ */
+static uint32_t css_find_free_devno(uint8_t cssid, uint8_t ssid,
+ uint16_t start)
+{
+ uint32_t round;
+
+ for (round = 0; round <= MAX_DEVNO; round++) {
+ uint16_t devno = (start + round) % MAX_DEVNO;
+
+ if (!css_devno_used(cssid, ssid, devno)) {
+ return devno;
+ }
+ }
+ return MAX_DEVNO + 1;
+}
+
+/**
+ * Return first free subchannel (id) in subchannel set.
+ *
+ * Return index of the first free subchannel in the subchannel set
+ * identified by @p cssid and @p ssid, if there is any. Return a value
+ * exceeding MAX_SCHID if there are no free subchannels in the
+ * subchannel set.
+ */
+static uint32_t css_find_free_subch(uint8_t cssid, uint8_t ssid)
+{
+ uint32_t schid;
+
+ for (schid = 0; schid <= MAX_SCHID; schid++) {
+ if (!css_find_subch(1, cssid, ssid, schid)) {
+ return schid;
+ }
+ }
+ return MAX_SCHID + 1;
+}
+
+/**
+ * Return first free subchannel (id) in subchannel set for a device number
+ *
+ * Verify the device number @p devno is not used yet in the subchannel
+ * set identified by @p cssid and @p ssid. Set @p schid to the index
+ * of the first free subchannel in the subchannel set, if there is
+ * any. Return true if everything succeeded and false otherwise.
+ */
+static bool css_find_free_subch_for_devno(uint8_t cssid, uint8_t ssid,
+ uint16_t devno, uint16_t *schid,
+ Error **errp)
+{
+ uint32_t free_schid;
+
+ assert(schid);
+ if (css_devno_used(cssid, ssid, devno)) {
+ error_setg(errp, "Device %x.%x.%04x already exists",
+ cssid, ssid, devno);
+ return false;
+ }
+ free_schid = css_find_free_subch(cssid, ssid);
+ if (free_schid > MAX_SCHID) {
+ error_setg(errp, "No free subchannel found for %x.%x.%04x",
+ cssid, ssid, devno);
+ return false;
+ }
+ *schid = free_schid;
+ return true;
+}
+
+/**
+ * Return first free subchannel (id) and device number
+ *
+ * Locate the first free subchannel and first free device number in
+ * any of the subchannel sets of the channel subsystem identified by
+ * @p cssid. Return false if no free subchannel / device number could
+ * be found. Otherwise set @p ssid, @p devno and @p schid to identify
+ * the available subchannel and device number and return true.
+ *
+ * May modify @p ssid, @p devno and / or @p schid even if no free
+ * subchannel / device number could be found.
+ */
+static bool css_find_free_subch_and_devno(uint8_t cssid, uint8_t *ssid,
+ uint16_t *devno, uint16_t *schid,
+ Error **errp)
+{
+ uint32_t free_schid, free_devno;
+
+ assert(ssid && devno && schid);
+ for (*ssid = 0; *ssid <= MAX_SSID; (*ssid)++) {
+ free_schid = css_find_free_subch(cssid, *ssid);
+ if (free_schid > MAX_SCHID) {
+ continue;
+ }
+ free_devno = css_find_free_devno(cssid, *ssid, free_schid);
+ if (free_devno > MAX_DEVNO) {
+ continue;
+ }
+ *schid = free_schid;
+ *devno = free_devno;
+ return true;
+ }
+ error_setg(errp, "Virtual channel subsystem is full!");
+ return false;
+}
+
bool css_subch_visible(SubchDev *sch)
{
if (sch->ssid > channel_subsys.max_ssid) {
@@ -1762,3 +1872,36 @@ PropertyInfo css_devid_propinfo = {
.get = get_css_devid,
.set = set_css_devid,
};
+
+SubchDev *css_create_virtual_sch(CssDevId bus_id, Error **errp)
+{
+ uint16_t schid = 0;
+ SubchDev *sch;
+
+ if (bus_id.valid) {
+ /* Enforce use of virtual cssid. */
+ if (bus_id.cssid != VIRTUAL_CSSID) {
+ error_setg(errp, "cssid %hhx not valid for virtual devices",
+ bus_id.cssid);
+ return NULL;
+ }
+ if (!css_find_free_subch_for_devno(bus_id.cssid, bus_id.ssid,
+ bus_id.devid, &schid, errp)) {
+ return NULL;
+ }
+ } else {
+ bus_id.cssid = VIRTUAL_CSSID;
+ if (!css_find_free_subch_and_devno(bus_id.cssid, &bus_id.ssid,
+ &bus_id.devid, &schid, errp)) {
+ return NULL;
+ }
+ }
+
+ sch = g_malloc0(sizeof(*sch));
+ sch->cssid = bus_id.cssid;
+ sch->ssid = bus_id.ssid;
+ sch->devno = bus_id.devid;
+ sch->schid = schid;
+ css_subch_assign(sch->cssid, sch->ssid, schid, sch->devno, sch);
+ return sch;
+}
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 8b709e3..67d7867 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -703,116 +703,27 @@ static void virtio_sch_disable_cb(SubchDev *sch)
static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
{
- unsigned int schid;
- bool found = false;
- SubchDev *sch;
- Error *err = NULL;
VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
+ SubchDev *sch = css_create_virtual_sch(dev->bus_id, errp);
+ Error *err = NULL;
- sch = g_malloc0(sizeof(SubchDev));
-
- sch->driver_data = dev;
- dev->sch = sch;
-
- dev->indicators = NULL;
-
- /* Initialize subchannel structure. */
- sch->channel_prog = 0x0;
- sch->last_cmd_valid = false;
- sch->thinint_active = false;
- /*
- * Use a device number if provided. Otherwise, fall back to subchannel
- * number.
- */
- if (dev->bus_id.valid) {
- /* Enforce use of virtual cssid. */
- if (dev->bus_id.cssid != VIRTUAL_CSSID) {
- error_setg(errp, "cssid %x not valid for virtio devices",
- dev->bus_id.cssid);
- goto out_err;
- }
- if (css_devno_used(dev->bus_id.cssid, dev->bus_id.ssid,
- dev->bus_id.devid)) {
- error_setg(errp, "Device %x.%x.%04x already exists",
- dev->bus_id.cssid, dev->bus_id.ssid,
- dev->bus_id.devid);
- goto out_err;
- }
- sch->cssid = dev->bus_id.cssid;
- sch->ssid = dev->bus_id.ssid;
- sch->devno = dev->bus_id.devid;
-
- /* Find the next free id. */
- for (schid = 0; schid <= MAX_SCHID; schid++) {
- if (!css_find_subch(1, sch->cssid, sch->ssid, schid)) {
- sch->schid = schid;
- css_subch_assign(sch->cssid, sch->ssid, sch->schid,
- sch->devno, sch);
- found = true;
- break;
- }
- }
- if (!found) {
- error_setg(errp, "No free subchannel found for %x.%x.%04x",
- sch->cssid, sch->ssid, sch->devno);
- goto out_err;
- }
- trace_virtio_ccw_new_device(sch->cssid, sch->ssid, sch->schid,
- sch->devno, "user-configured");
- } else {
- unsigned int cssid = VIRTUAL_CSSID, ssid, devno;
-
- for (ssid = 0; ssid <= MAX_SSID; ssid++) {
- for (schid = 0; schid <= MAX_SCHID; schid++) {
- if (!css_find_subch(1, cssid, ssid, schid)) {
- sch->cssid = cssid;
- sch->ssid = ssid;
- sch->schid = schid;
- devno = schid;
- /*
- * If the devno is already taken, look further in this
- * subchannel set.
- */
- while (css_devno_used(cssid, ssid, devno)) {
- if (devno == MAX_SCHID) {
- devno = 0;
- } else if (devno == schid - 1) {
- error_setg(errp, "No free devno found");
- goto out_err;
- } else {
- devno++;
- }
- }
- sch->devno = devno;
- css_subch_assign(cssid, ssid, schid, devno, sch);
- found = true;
- break;
- }
- }
- if (found) {
- break;
- }
- }
- if (!found) {
- error_setg(errp, "Virtual channel subsystem is full!");
- goto out_err;
- }
- trace_virtio_ccw_new_device(cssid, ssid, schid, devno,
- "auto-configured");
+ if (!sch) {
+ return;
}
- /* Build initial schib. */
- css_sch_build_virtual_schib(sch, 0, VIRTIO_CCW_CHPID_TYPE);
-
+ sch->driver_data = dev;
sch->ccw_cb = virtio_ccw_cb;
sch->disable_cb = virtio_sch_disable_cb;
-
- /* Build senseid data. */
- memset(&sch->id, 0, sizeof(SenseId));
sch->id.reserved = 0xff;
sch->id.cu_type = VIRTIO_CCW_CU_TYPE;
-
+ dev->sch = sch;
+ dev->indicators = NULL;
dev->revision = -1;
+ css_sch_build_virtual_schib(sch, 0, VIRTIO_CCW_CHPID_TYPE);
+
+ trace_virtio_ccw_new_device(
+ sch->cssid, sch->ssid, sch->schid, sch->devno,
+ dev->bus_id.valid ? "user-configured" : "auto-configured");
if (k->realize) {
k->realize(dev, &err);
@@ -820,14 +731,9 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
if (err) {
error_propagate(errp, err);
css_subch_assign(sch->cssid, sch->ssid, sch->schid, sch->devno, NULL);
- goto out_err;
+ dev->sch = NULL;
+ g_free(sch);
}
-
- return;
-
-out_err:
- dev->sch = NULL;
- g_free(sch);
}
static int virtio_ccw_exit(VirtioCcwDevice *dev)
diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h
index 0bfb5d9..7243fb0 100644
--- a/hw/s390x/virtio-ccw.h
+++ b/hw/s390x/virtio-ccw.h
@@ -27,8 +27,6 @@
#include <hw/s390x/s390_flic.h>
#include <hw/s390x/css.h>
-#define VIRTUAL_CSSID 0xfe
-
#define VIRTIO_CCW_CU_TYPE 0x3832
#define VIRTIO_CCW_CHPID_TYPE 0x32
diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h
index 38f4d77..1da63e3 100644
--- a/include/hw/s390x/css.h
+++ b/include/hw/s390x/css.h
@@ -17,6 +17,7 @@
#include "hw/s390x/ioinst.h"
/* Channel subsystem constants. */
+#define MAX_DEVNO 65535
#define MAX_SCHID 65535
#define MAX_SSID 3
#define MAX_CSSID 254 /* 255 is reserved */
@@ -24,6 +25,8 @@
#define MAX_CIWS 62
+#define VIRTUAL_CSSID 0xfe
+
typedef struct CIW {
uint8_t type;
uint8_t command;
@@ -169,4 +172,19 @@ extern PropertyInfo css_devid_propinfo;
#define DEFINE_PROP_CSS_DEV_ID(_n, _s, _f) \
DEFINE_PROP(_n, _s, _f, css_devid_propinfo, CssDevId)
+/**
+ * Create a subchannel for the given bus id.
+ *
+ * If @p bus_id is valid, verify that it uses the virtual channel
+ * subsystem id and is not already in use, and find a free subchannel
+ * id for it. If @p bus_id is not valid, find a free subchannel id and
+ * device number across all subchannel sets. If either of the former
+ * actions succeed, allocate a subchannel structure, initialise it
+ * with the bus id, subchannel id and device number, register it with
+ * the CSS and return it. Otherwise return NULL.
+ *
+ * The caller becomes owner of the returned subchannel structure and
+ * is responsible for unregistering and freeing it.
+ */
+SubchDev *css_create_virtual_sch(CssDevId bus_id, Error **errp);
#endif
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 6/8] s390x/css: use define for "virtual-css-bridge" literal
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
` (4 preceding siblings ...)
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 5/8] s390x/css: factor out some generic code from virtio_ccw_device_realize() Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 8/8] s390x/css: Unplug handler of virtual css bridge Cornelia Huck
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Sascha Silbe, Cornelia Huck
From: Sascha Silbe <silbe@linux.vnet.ibm.com>
Introduce a TYPE_* define (like we already use for a couple of other
QOM types) for the name of the virtual CSS bridge QOM type instead of
sprinkling the same string literal over several source files.
Signed-off-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
hw/s390x/s390-virtio-ccw.c | 2 +-
hw/s390x/virtio-ccw.c | 4 ++--
hw/s390x/virtio-ccw.h | 3 +++
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 52f079a..3b79e96 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -29,7 +29,7 @@
#include "hw/s390x/s390-virtio-ccw.h"
static const char *const reset_dev_types[] = {
- "virtual-css-bridge",
+ TYPE_VIRTUAL_CSS_BRIDGE,
"s390-sclp-event-facility",
"s390-flic",
"diag288",
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 67d7867..0afc0d3 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -130,7 +130,7 @@ VirtualCssBus *virtual_css_bus_init(void)
DeviceState *dev;
/* Create bridge device */
- dev = qdev_create(NULL, "virtual-css-bridge");
+ dev = qdev_create(NULL, TYPE_VIRTUAL_CSS_BRIDGE);
qdev_init_nofail(dev);
/* Create bus on bridge device */
@@ -1626,7 +1626,7 @@ static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
}
static const TypeInfo virtual_css_bridge_info = {
- .name = "virtual-css-bridge",
+ .name = TYPE_VIRTUAL_CSS_BRIDGE,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(SysBusDevice),
.class_init = virtual_css_bridge_class_init,
diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h
index 7243fb0..6144625 100644
--- a/hw/s390x/virtio-ccw.h
+++ b/hw/s390x/virtio-ccw.h
@@ -101,6 +101,9 @@ static inline int virtio_ccw_rev_max(VirtioCcwDevice *dev)
return dev->max_rev;
}
+/* virtual css bridge type */
+#define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge"
+
/* virtual css bus type */
typedef struct VirtualCssBus {
BusState parent_obj;
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
` (5 preceding siblings ...)
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 6/8] s390x/css: use define for "virtual-css-bridge" literal Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
2016-07-05 8:30 ` Jing Liu
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 8/8] s390x/css: Unplug handler of virtual css bridge Cornelia Huck
7 siblings, 1 reply; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Jing Liu, Cornelia Huck
From: Jing Liu <liujbjl@linux.vnet.ibm.com>
Currently, common base layers virtual css bridge and bus are
defined in hw/s390x/virtio-ccw.c(h). In order to support
multiple types of devices in the virtual channel subsystem,
especially non virtio-ccw, refactoring work needs to be done.
This work is just a pure code move without any functional change
except dropping an empty function virtual_css_bridge_init() and
virtio_ccw_busdev_unplug() changing. virtio_ccw_busdev_unplug()
is specific to virtio-ccw but gets referenced from the common
virtual css bridge code. To keep the functional changes to a
minimum we export this function from virtio-ccw.c and continue
to reference it inside virtual_css_bridge_class_init()
(now living in hw/s390x/css-bridge.c). A follow-up patch will
clean this up.
Signed-off-by: Jing Liu <liujbjl@linux.vnet.ibm.com>
Reviewed-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
hw/s390x/Makefile.objs | 1 +
hw/s390x/css-bridge.c | 89 +++++++++++++++++++++++++++++++++++++++++++
hw/s390x/s390-virtio-ccw.c | 1 +
hw/s390x/virtio-ccw.c | 79 ++------------------------------------
hw/s390x/virtio-ccw.h | 14 +------
include/hw/s390x/css-bridge.h | 31 +++++++++++++++
6 files changed, 127 insertions(+), 88 deletions(-)
create mode 100644 hw/s390x/css-bridge.c
create mode 100644 include/hw/s390x/css-bridge.h
diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
index 2203617..141ce1a 100644
--- a/hw/s390x/Makefile.objs
+++ b/hw/s390x/Makefile.objs
@@ -8,6 +8,7 @@ obj-y += ipl.o
obj-y += css.o
obj-y += s390-virtio-ccw.o
obj-y += virtio-ccw.o
+obj-y += css-bridge.o
obj-y += s390-pci-bus.o s390-pci-inst.o
obj-y += s390-skeys.o
obj-$(CONFIG_KVM) += s390-skeys-kvm.o
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
new file mode 100644
index 0000000..e74cc1c
--- /dev/null
+++ b/hw/s390x/css-bridge.c
@@ -0,0 +1,89 @@
+/*
+ * css bridge implementation
+ *
+ * Copyright 2012,2016 IBM Corp.
+ * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
+ * Pierre Morel <pmorel@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "virtio-ccw.h"
+#include "hw/hotplug.h"
+#include "hw/sysbus.h"
+#include "qemu/bitops.h"
+#include "hw/s390x/css.h"
+#include "hw/s390x/css-bridge.h"
+
+static void virtual_css_bus_reset(BusState *qbus)
+{
+ /* This should actually be modelled via the generic css */
+ css_reset();
+}
+
+static void virtual_css_bus_class_init(ObjectClass *klass, void *data)
+{
+ BusClass *k = BUS_CLASS(klass);
+
+ k->reset = virtual_css_bus_reset;
+}
+
+static const TypeInfo virtual_css_bus_info = {
+ .name = TYPE_VIRTUAL_CSS_BUS,
+ .parent = TYPE_BUS,
+ .instance_size = sizeof(VirtualCssBus),
+ .class_init = virtual_css_bus_class_init,
+};
+
+VirtualCssBus *virtual_css_bus_init(void)
+{
+ VirtualCssBus *cbus;
+ BusState *bus;
+ DeviceState *dev;
+
+ /* Create bridge device */
+ dev = qdev_create(NULL, TYPE_VIRTUAL_CSS_BRIDGE);
+ qdev_init_nofail(dev);
+
+ /* Create bus on bridge device */
+ bus = qbus_create(TYPE_VIRTUAL_CSS_BUS, dev, "virtual-css");
+ cbus = VIRTUAL_CSS_BUS(bus);
+
+ /* Enable hotplugging */
+ qbus_set_hotplug_handler(bus, dev, &error_abort);
+
+ return cbus;
+ }
+
+/***************** Virtual-css Bus Bridge Device ********************/
+
+static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
+{
+ HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
+ DeviceClass *dc = DEVICE_CLASS(klass);
+
+ hc->unplug = virtio_ccw_busdev_unplug;
+ set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
+}
+
+static const TypeInfo virtual_css_bridge_info = {
+ .name = TYPE_VIRTUAL_CSS_BRIDGE,
+ .parent = TYPE_SYS_BUS_DEVICE,
+ .instance_size = sizeof(SysBusDevice),
+ .class_init = virtual_css_bridge_class_init,
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_HOTPLUG_HANDLER },
+ { }
+ }
+};
+
+static void virtual_css_register(void)
+{
+ type_register_static(&virtual_css_bridge_info);
+ type_register_static(&virtual_css_bus_info);
+}
+
+type_init(virtual_css_register)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 3b79e96..caf0a68 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -27,6 +27,7 @@
#include "hw/compat.h"
#include "ipl.h"
#include "hw/s390x/s390-virtio-ccw.h"
+#include "hw/s390x/css-bridge.h"
static const char *const reset_dev_types[] = {
TYPE_VIRTUAL_CSS_BRIDGE,
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 0afc0d3..8f1a0e8 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -33,31 +33,11 @@
#include "hw/s390x/css.h"
#include "virtio-ccw.h"
#include "trace.h"
+#include "hw/s390x/css-bridge.h"
static void virtio_ccw_bus_new(VirtioBusState *bus, size_t bus_size,
VirtioCcwDevice *dev);
-static void virtual_css_bus_reset(BusState *qbus)
-{
- /* This should actually be modelled via the generic css */
- css_reset();
-}
-
-
-static void virtual_css_bus_class_init(ObjectClass *klass, void *data)
-{
- BusClass *k = BUS_CLASS(klass);
-
- k->reset = virtual_css_bus_reset;
-}
-
-static const TypeInfo virtual_css_bus_info = {
- .name = TYPE_VIRTUAL_CSS_BUS,
- .parent = TYPE_BUS,
- .instance_size = sizeof(VirtualCssBus),
- .class_init = virtual_css_bus_class_init,
-};
-
VirtIODevice *virtio_ccw_get_vdev(SubchDev *sch)
{
VirtIODevice *vdev = NULL;
@@ -123,26 +103,6 @@ static int virtio_ccw_ioeventfd_assign(DeviceState *d, EventNotifier *notifier,
return s390_assign_subch_ioeventfd(notifier, sch_id, n, assign);
}
-VirtualCssBus *virtual_css_bus_init(void)
-{
- VirtualCssBus *cbus;
- BusState *bus;
- DeviceState *dev;
-
- /* Create bridge device */
- dev = qdev_create(NULL, TYPE_VIRTUAL_CSS_BRIDGE);
- qdev_init_nofail(dev);
-
- /* Create bus on bridge device */
- bus = qbus_create(TYPE_VIRTUAL_CSS_BUS, dev, "virtual-css");
- cbus = VIRTUAL_CSS_BUS(bus);
-
- /* Enable hotplugging */
- qbus_set_hotplug_handler(bus, dev, &error_abort);
-
- return cbus;
-}
-
/* Communication blocks used by several channel commands. */
typedef struct VqInfoBlockLegacy {
uint64_t queue;
@@ -1565,8 +1525,8 @@ static int virtio_ccw_busdev_exit(DeviceState *dev)
return _info->exit(_dev);
}
-static void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
- DeviceState *dev, Error **errp)
+void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
+ DeviceState *dev, Error **errp)
{
VirtioCcwDevice *_dev = (VirtioCcwDevice *)dev;
SubchDev *sch = _dev->sch;
@@ -1605,37 +1565,6 @@ static const TypeInfo virtio_ccw_device_info = {
.abstract = true,
};
-/***************** Virtual-css Bus Bridge Device ********************/
-/* Only required to have the virtio bus as child in the system bus */
-
-static int virtual_css_bridge_init(SysBusDevice *dev)
-{
- /* nothing */
- return 0;
-}
-
-static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
-{
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
- HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
- DeviceClass *dc = DEVICE_CLASS(klass);
-
- k->init = virtual_css_bridge_init;
- hc->unplug = virtio_ccw_busdev_unplug;
- set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
-}
-
-static const TypeInfo virtual_css_bridge_info = {
- .name = TYPE_VIRTUAL_CSS_BRIDGE,
- .parent = TYPE_SYS_BUS_DEVICE,
- .instance_size = sizeof(SysBusDevice),
- .class_init = virtual_css_bridge_class_init,
- .interfaces = (InterfaceInfo[]) {
- { TYPE_HOTPLUG_HANDLER },
- { }
- }
-};
-
/* virtio-ccw-bus */
static void virtio_ccw_bus_new(VirtioBusState *bus, size_t bus_size,
@@ -1730,7 +1659,6 @@ static const TypeInfo virtio_ccw_9p_info = {
static void virtio_ccw_register(void)
{
type_register_static(&virtio_ccw_bus_info);
- type_register_static(&virtual_css_bus_info);
type_register_static(&virtio_ccw_device_info);
type_register_static(&virtio_ccw_serial);
type_register_static(&virtio_ccw_blk);
@@ -1741,7 +1669,6 @@ static void virtio_ccw_register(void)
type_register_static(&vhost_ccw_scsi);
#endif
type_register_static(&virtio_ccw_rng);
- type_register_static(&virtual_css_bridge_info);
#ifdef CONFIG_VIRTFS
type_register_static(&virtio_ccw_9p_info);
#endif
diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h
index 6144625..11023aa 100644
--- a/hw/s390x/virtio-ccw.h
+++ b/hw/s390x/virtio-ccw.h
@@ -101,17 +101,8 @@ static inline int virtio_ccw_rev_max(VirtioCcwDevice *dev)
return dev->max_rev;
}
-/* virtual css bridge type */
-#define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge"
-
-/* virtual css bus type */
-typedef struct VirtualCssBus {
- BusState parent_obj;
-} VirtualCssBus;
-
-#define TYPE_VIRTUAL_CSS_BUS "virtual-css-bus"
-#define VIRTUAL_CSS_BUS(obj) \
- OBJECT_CHECK(VirtualCssBus, (obj), TYPE_VIRTUAL_CSS_BUS)
+void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
+ DeviceState *dev, Error **errp);
/* virtio-scsi-ccw */
@@ -192,7 +183,6 @@ typedef struct VirtIORNGCcw {
VirtIORNG vdev;
} VirtIORNGCcw;
-VirtualCssBus *virtual_css_bus_init(void);
void virtio_ccw_device_update_status(SubchDev *sch);
VirtIODevice *virtio_ccw_get_vdev(SubchDev *sch);
diff --git a/include/hw/s390x/css-bridge.h b/include/hw/s390x/css-bridge.h
new file mode 100644
index 0000000..ad73c1f
--- /dev/null
+++ b/include/hw/s390x/css-bridge.h
@@ -0,0 +1,31 @@
+/*
+ * virtual css bridge definition
+ *
+ * Copyright 2012,2016 IBM Corp.
+ * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
+ * Pierre Morel <pmorel@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+
+#ifndef HW_S390X_CSS_BRIDGE_H
+#define HW_S390X_CSS_BRIDGE_H
+#include "qom/object.h"
+#include "hw/qdev-core.h"
+
+/* virtual css bridge */
+#define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge"
+
+/* virtual css bus type */
+typedef struct VirtualCssBus {
+ BusState parent_obj;
+} VirtualCssBus;
+
+#define TYPE_VIRTUAL_CSS_BUS "virtual-css-bus"
+#define VIRTUAL_CSS_BUS(obj) \
+ OBJECT_CHECK(VirtualCssBus, (obj), TYPE_VIRTUAL_CSS_BUS)
+VirtualCssBus *virtual_css_bus_init(void);
+
+#endif
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH for-2.7 8/8] s390x/css: Unplug handler of virtual css bridge
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
` (6 preceding siblings ...)
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus Cornelia Huck
@ 2016-07-05 7:56 ` Cornelia Huck
7 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 7:56 UTC (permalink / raw)
To: qemu-devel; +Cc: borntraeger, agraf, jfrei, Jing Liu, Cornelia Huck
From: Jing Liu <liujbjl@linux.vnet.ibm.com>
The previous patch moved virtual css bridge and bus out from
virtio-ccw, but kept the direct reference of virtio-ccw specific
unplug function inside css-bridge.c.
To make the virtual css bus and bridge useful for non-virtio devices,
this introduces a common unplug function pointer "unplug" to call
specific virtio-ccw unplug parts. Thus, the tight coupling to
virtio-ccw can be removed.
This unplug pointer is a member of CCWDeviceClass, which is introduced
as an abstract device layer called "ccw-device". This layer is between
DeviceState and specific devices which are plugged in virtual css bus,
like virtio-ccw device. The specific unplug handlers should be assigned
to "unplug" during initialization.
Signed-off-by: Jing Liu <liujbjl@linux.vnet.ibm.com>
Reviewed-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
hw/s390x/Makefile.objs | 1 +
hw/s390x/ccw-device.c | 27 ++++++++++++++++
hw/s390x/ccw-device.h | 43 +++++++++++++++++++++++++
hw/s390x/css-bridge.c | 39 +++++++++++++++++++++--
hw/s390x/ipl.c | 14 ++++----
hw/s390x/virtio-ccw.c | 86 ++++++++++++++++++++++++++------------------------
hw/s390x/virtio-ccw.h | 11 +++----
7 files changed, 164 insertions(+), 57 deletions(-)
create mode 100644 hw/s390x/ccw-device.c
create mode 100644 hw/s390x/ccw-device.h
diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
index 141ce1a..41ac4ec 100644
--- a/hw/s390x/Makefile.objs
+++ b/hw/s390x/Makefile.objs
@@ -9,6 +9,7 @@ obj-y += css.o
obj-y += s390-virtio-ccw.o
obj-y += virtio-ccw.o
obj-y += css-bridge.o
+obj-y += ccw-device.o
obj-y += s390-pci-bus.o s390-pci-inst.o
obj-y += s390-skeys.o
obj-$(CONFIG_KVM) += s390-skeys-kvm.o
diff --git a/hw/s390x/ccw-device.c b/hw/s390x/ccw-device.c
new file mode 100644
index 0000000..28ea204
--- /dev/null
+++ b/hw/s390x/ccw-device.c
@@ -0,0 +1,27 @@
+/*
+ * Common device infrastructure for devices in the virtual css
+ *
+ * Copyright 2016 IBM Corp.
+ * Author(s): Jing Liu <liujbjl@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+#include "qemu/osdep.h"
+#include "ccw-device.h"
+
+static const TypeInfo ccw_device_info = {
+ .name = TYPE_CCW_DEVICE,
+ .parent = TYPE_DEVICE,
+ .instance_size = sizeof(CcwDevice),
+ .class_size = sizeof(CCWDeviceClass),
+ .abstract = true,
+};
+
+static void ccw_device_register(void)
+{
+ type_register_static(&ccw_device_info);
+}
+
+type_init(ccw_device_register)
diff --git a/hw/s390x/ccw-device.h b/hw/s390x/ccw-device.h
new file mode 100644
index 0000000..59ba01b
--- /dev/null
+++ b/hw/s390x/ccw-device.h
@@ -0,0 +1,43 @@
+/*
+ * Common device infrastructure for devices in the virtual css
+ *
+ * Copyright 2016 IBM Corp.
+ * Author(s): Jing Liu <liujbjl@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+
+#ifndef HW_S390X_CCW_DEVICE_H
+#define HW_S390X_CCW_DEVICE_H
+#include "qom/object.h"
+#include "hw/qdev-core.h"
+#include "hw/s390x/css.h"
+
+typedef struct CcwDevice {
+ DeviceState parent_obj;
+ SubchDev *sch;
+ /* <cssid>.<ssid>.<device number> */
+ CssDevId bus_id;
+} CcwDevice;
+
+typedef struct CCWDeviceClass {
+ DeviceClass parent_class;
+ void (*unplug)(HotplugHandler *, DeviceState *, Error **);
+} CCWDeviceClass;
+
+static inline CcwDevice *to_ccw_dev_fast(DeviceState *d)
+{
+ return container_of(d, CcwDevice, parent_obj);
+}
+
+#define TYPE_CCW_DEVICE "ccw-device"
+
+#define CCW_DEVICE(obj) OBJECT_CHECK(CcwDevice, (obj), TYPE_CCW_DEVICE)
+#define CCW_DEVICE_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(CCWDeviceClass, (obj), TYPE_CCW_DEVICE)
+#define CCW_DEVICE_CLASS(klass) \
+ OBJECT_CLASS_CHECK(CCWDeviceClass, (klass), TYPE_CCW_DEVICE)
+
+#endif
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index e74cc1c..e4c24e2 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -11,13 +11,48 @@
*/
#include "qemu/osdep.h"
#include "qapi/error.h"
-#include "virtio-ccw.h"
#include "hw/hotplug.h"
#include "hw/sysbus.h"
#include "qemu/bitops.h"
#include "hw/s390x/css.h"
+#include "ccw-device.h"
#include "hw/s390x/css-bridge.h"
+/*
+ * Invoke device-specific unplug handler, disable the subchannel
+ * (including sending a channel report to the guest) and remove the
+ * device from the virtual css bus.
+ */
+static void ccw_device_unplug(HotplugHandler *hotplug_dev,
+ DeviceState *dev, Error **errp)
+{
+ CcwDevice *ccw_dev = CCW_DEVICE(dev);
+ CCWDeviceClass *k = CCW_DEVICE_GET_CLASS(ccw_dev);
+ SubchDev *sch = ccw_dev->sch;
+ Error *err = NULL;
+
+ if (k->unplug) {
+ k->unplug(hotplug_dev, dev, &err);
+ if (err) {
+ error_propagate(errp, err);
+ return;
+ }
+ }
+
+ /*
+ * We should arrive here only for device_del, since we don't support
+ * direct hot(un)plug of channels.
+ */
+ assert(sch != NULL);
+ /* Subchannel is now disabled and no longer valid. */
+ sch->curr_status.pmcw.flags &= ~(PMCW_FLAGS_MASK_ENA |
+ PMCW_FLAGS_MASK_DNV);
+
+ css_generate_sch_crws(sch->cssid, sch->ssid, sch->schid, 1, 0);
+
+ object_unparent(OBJECT(dev));
+}
+
static void virtual_css_bus_reset(BusState *qbus)
{
/* This should actually be modelled via the generic css */
@@ -65,7 +100,7 @@ static void virtual_css_bridge_class_init(ObjectClass *klass, void *data)
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
DeviceClass *dc = DEVICE_CLASS(klass);
- hc->unplug = virtio_ccw_busdev_unplug;
+ hc->unplug = ccw_device_unplug;
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
}
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index a54284c..2e2664f 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -221,12 +221,14 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
dev_st = get_boot_device(0);
if (dev_st) {
- VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast(
- OBJECT(qdev_get_parent_bus(dev_st)->parent),
+ VirtioCcwDevice *virtio_ccw_dev = (VirtioCcwDevice *)
+ object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent),
TYPE_VIRTIO_CCW_DEVICE);
SCSIDevice *sd = (SCSIDevice *) object_dynamic_cast(OBJECT(dev_st),
TYPE_SCSI_DEVICE);
- if (ccw_dev) {
+ if (virtio_ccw_dev) {
+ CcwDevice *ccw_dev = CCW_DEVICE(virtio_ccw_dev);
+
ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_CCW_LEN);
ipl->iplb.blk0_len =
cpu_to_be32(S390_IPLB_MIN_CCW_LEN - S390_IPLB_HEADER_LEN);
@@ -238,7 +240,7 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
SCSIBus *bus = scsi_bus_from_device(sd);
VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus);
VirtIOSCSICcw *scsi_ccw = container_of(vdev, VirtIOSCSICcw, vdev);
- VirtioCcwDevice *ccw = &scsi_ccw->parent_obj;
+ CcwDevice *ccw_dev = CCW_DEVICE(scsi_ccw);
ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN);
ipl->iplb.blk0_len =
@@ -247,8 +249,8 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
ipl->iplb.scsi.lun = cpu_to_be32(sd->lun);
ipl->iplb.scsi.target = cpu_to_be16(sd->id);
ipl->iplb.scsi.channel = cpu_to_be16(sd->channel);
- ipl->iplb.scsi.devno = cpu_to_be16(ccw->sch->devno);
- ipl->iplb.scsi.ssid = ccw->sch->ssid & 3;
+ ipl->iplb.scsi.devno = cpu_to_be16(ccw_dev->sch->devno);
+ ipl->iplb.scsi.ssid = ccw_dev->sch->ssid & 3;
return true;
}
}
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 8f1a0e8..a554a24 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -97,7 +97,8 @@ static int virtio_ccw_ioeventfd_assign(DeviceState *d, EventNotifier *notifier,
int n, bool assign)
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
- SubchDev *sch = dev->sch;
+ CcwDevice *ccw_dev = CCW_DEVICE(dev);
+ SubchDev *sch = ccw_dev->sch;
uint32_t sch_id = (css_build_subchannel_id(sch) << 16) | sch->schid;
return s390_assign_subch_ioeventfd(notifier, sch_id, n, assign);
@@ -194,6 +195,8 @@ static int virtio_ccw_set_vqs(SubchDev *sch, VqInfoBlock *info,
static void virtio_ccw_reset_virtio(VirtioCcwDevice *dev, VirtIODevice *vdev)
{
+ CcwDevice *ccw_dev = CCW_DEVICE(dev);
+
virtio_ccw_stop_ioeventfd(dev);
virtio_reset(vdev);
if (dev->indicators) {
@@ -208,7 +211,7 @@ static void virtio_ccw_reset_virtio(VirtioCcwDevice *dev, VirtIODevice *vdev)
release_indicator(&dev->routes.adapter, dev->summary_indicator);
dev->summary_indicator = NULL;
}
- dev->sch->thinint_active = false;
+ ccw_dev->sch->thinint_active = false;
}
static int virtio_ccw_handle_set_vq(SubchDev *sch, CCW1 ccw, bool check_len,
@@ -664,7 +667,8 @@ static void virtio_sch_disable_cb(SubchDev *sch)
static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
{
VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
- SubchDev *sch = css_create_virtual_sch(dev->bus_id, errp);
+ CcwDevice *ccw_dev = CCW_DEVICE(dev);
+ SubchDev *sch = css_create_virtual_sch(ccw_dev->bus_id, errp);
Error *err = NULL;
if (!sch) {
@@ -676,14 +680,14 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
sch->disable_cb = virtio_sch_disable_cb;
sch->id.reserved = 0xff;
sch->id.cu_type = VIRTIO_CCW_CU_TYPE;
- dev->sch = sch;
+ ccw_dev->sch = sch;
dev->indicators = NULL;
dev->revision = -1;
css_sch_build_virtual_schib(sch, 0, VIRTIO_CCW_CHPID_TYPE);
trace_virtio_ccw_new_device(
sch->cssid, sch->ssid, sch->schid, sch->devno,
- dev->bus_id.valid ? "user-configured" : "auto-configured");
+ ccw_dev->bus_id.valid ? "user-configured" : "auto-configured");
if (k->realize) {
k->realize(dev, &err);
@@ -691,14 +695,15 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
if (err) {
error_propagate(errp, err);
css_subch_assign(sch->cssid, sch->ssid, sch->schid, sch->devno, NULL);
- dev->sch = NULL;
+ ccw_dev->sch = NULL;
g_free(sch);
}
}
static int virtio_ccw_exit(VirtioCcwDevice *dev)
{
- SubchDev *sch = dev->sch;
+ CcwDevice *ccw_dev = CCW_DEVICE(dev);
+ SubchDev *sch = ccw_dev->sch;
if (sch) {
css_subch_assign(sch->cssid, sch->ssid, sch->schid, sch->devno, NULL);
@@ -879,7 +884,9 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
*/
static inline VirtioCcwDevice *to_virtio_ccw_dev_fast(DeviceState *d)
{
- return container_of(d, VirtioCcwDevice, parent_obj);
+ CcwDevice *ccw_dev = to_ccw_dev_fast(d);
+
+ return container_of(ccw_dev, VirtioCcwDevice, parent_obj);
}
static uint8_t virtio_set_ind_atomic(SubchDev *sch, uint64_t ind_loc,
@@ -908,7 +915,8 @@ static uint8_t virtio_set_ind_atomic(SubchDev *sch, uint64_t ind_loc,
static void virtio_ccw_notify(DeviceState *d, uint16_t vector)
{
VirtioCcwDevice *dev = to_virtio_ccw_dev_fast(d);
- SubchDev *sch = dev->sch;
+ CcwDevice *ccw_dev = to_ccw_dev_fast(d);
+ SubchDev *sch = ccw_dev->sch;
uint64_t indicators;
/* queue indicators + secondary indicators */
@@ -966,9 +974,10 @@ static void virtio_ccw_reset(DeviceState *d)
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
+ CcwDevice *ccw_dev = CCW_DEVICE(d);
virtio_ccw_reset_virtio(dev, vdev);
- css_reset_sch(dev->sch);
+ css_reset_sch(ccw_dev->sch);
}
static void virtio_ccw_vmstate_change(DeviceState *d, bool running)
@@ -984,7 +993,7 @@ static void virtio_ccw_vmstate_change(DeviceState *d, bool running)
static bool virtio_ccw_query_guest_notifiers(DeviceState *d)
{
- VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
+ CcwDevice *dev = CCW_DEVICE(d);
return !!(dev->sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ENA);
}
@@ -992,8 +1001,9 @@ static bool virtio_ccw_query_guest_notifiers(DeviceState *d)
static int virtio_ccw_get_mappings(VirtioCcwDevice *dev)
{
int r;
+ CcwDevice *ccw_dev = CCW_DEVICE(dev);
- if (!dev->sch->thinint_active) {
+ if (!ccw_dev->sch->thinint_active) {
return -EINVAL;
}
@@ -1115,7 +1125,8 @@ static int virtio_ccw_set_guest_notifiers(DeviceState *d, int nvqs,
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
- bool with_irqfd = dev->sch->thinint_active && kvm_irqfds_enabled();
+ CcwDevice *ccw_dev = CCW_DEVICE(d);
+ bool with_irqfd = ccw_dev->sch->thinint_active && kvm_irqfds_enabled();
int r, n;
if (with_irqfd && assigned) {
@@ -1174,7 +1185,8 @@ static int virtio_ccw_load_queue(DeviceState *d, int n, QEMUFile *f)
static void virtio_ccw_save_config(DeviceState *d, QEMUFile *f)
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
- SubchDev *s = dev->sch;
+ CcwDevice *ccw_dev = CCW_DEVICE(d);
+ SubchDev *s = ccw_dev->sch;
VirtIODevice *vdev = virtio_ccw_get_vdev(s);
subch_device_save(s, f);
@@ -1208,7 +1220,8 @@ static void virtio_ccw_save_config(DeviceState *d, QEMUFile *f)
static int virtio_ccw_load_config(DeviceState *d, QEMUFile *f)
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
- SubchDev *s = dev->sch;
+ CcwDevice *ccw_dev = CCW_DEVICE(d);
+ SubchDev *s = ccw_dev->sch;
VirtIODevice *vdev = virtio_ccw_get_vdev(s);
int len;
@@ -1253,7 +1266,8 @@ static void virtio_ccw_device_plugged(DeviceState *d, Error **errp)
{
VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d);
VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
- SubchDev *sch = dev->sch;
+ CcwDevice *ccw_dev = CCW_DEVICE(d);
+ SubchDev *sch = ccw_dev->sch;
int n = virtio_get_num_queues(vdev);
if (virtio_get_num_queues(vdev) > VIRTIO_CCW_QUEUE_MAX) {
@@ -1297,7 +1311,7 @@ static void virtio_ccw_device_unplugged(DeviceState *d)
/**************** Virtio-ccw Bus Device Descriptions *******************/
static Property virtio_ccw_net_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
@@ -1326,7 +1340,7 @@ static const TypeInfo virtio_ccw_net = {
};
static Property virtio_ccw_blk_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
@@ -1355,7 +1369,7 @@ static const TypeInfo virtio_ccw_blk = {
};
static Property virtio_ccw_serial_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
@@ -1384,7 +1398,7 @@ static const TypeInfo virtio_ccw_serial = {
};
static Property virtio_ccw_balloon_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
@@ -1413,7 +1427,7 @@ static const TypeInfo virtio_ccw_balloon = {
};
static Property virtio_ccw_scsi_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
@@ -1443,7 +1457,7 @@ static const TypeInfo virtio_ccw_scsi = {
#ifdef CONFIG_VHOST_SCSI
static Property vhost_ccw_scsi_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
VIRTIO_CCW_MAX_REV),
DEFINE_PROP_END_OF_LIST(),
@@ -1481,7 +1495,7 @@ static void virtio_ccw_rng_instance_init(Object *obj)
}
static Property virtio_ccw_rng_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
@@ -1525,32 +1539,20 @@ static int virtio_ccw_busdev_exit(DeviceState *dev)
return _info->exit(_dev);
}
-void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
- DeviceState *dev, Error **errp)
+static void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
+ DeviceState *dev, Error **errp)
{
- VirtioCcwDevice *_dev = (VirtioCcwDevice *)dev;
- SubchDev *sch = _dev->sch;
+ VirtioCcwDevice *_dev = to_virtio_ccw_dev_fast(dev);
virtio_ccw_stop_ioeventfd(_dev);
-
- /*
- * We should arrive here only for device_del, since we don't support
- * direct hot(un)plug of channels, but only through virtio.
- */
- assert(sch != NULL);
- /* Subchannel is now disabled and no longer valid. */
- sch->curr_status.pmcw.flags &= ~(PMCW_FLAGS_MASK_ENA |
- PMCW_FLAGS_MASK_DNV);
-
- css_generate_sch_crws(sch->cssid, sch->ssid, sch->schid, 1, 0);
-
- object_unparent(OBJECT(dev));
}
static void virtio_ccw_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ CCWDeviceClass *k = CCW_DEVICE_CLASS(dc);
+ k->unplug = virtio_ccw_busdev_unplug;
dc->realize = virtio_ccw_busdev_realize;
dc->exit = virtio_ccw_busdev_exit;
dc->bus_type = TYPE_VIRTUAL_CSS_BUS;
@@ -1558,7 +1560,7 @@ static void virtio_ccw_device_class_init(ObjectClass *klass, void *data)
static const TypeInfo virtio_ccw_device_info = {
.name = TYPE_VIRTIO_CCW_DEVICE,
- .parent = TYPE_DEVICE,
+ .parent = TYPE_CCW_DEVICE,
.instance_size = sizeof(VirtioCcwDevice),
.class_init = virtio_ccw_device_class_init,
.class_size = sizeof(VirtIOCCWDeviceClass),
@@ -1610,7 +1612,7 @@ static const TypeInfo virtio_ccw_bus_info = {
#ifdef CONFIG_VIRTFS
static Property virtio_ccw_9p_properties[] = {
- DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, bus_id),
+ DEFINE_PROP_CSS_DEV_ID("devno", VirtioCcwDevice, parent_obj.bus_id),
DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h
index 11023aa..3f76443 100644
--- a/hw/s390x/virtio-ccw.h
+++ b/hw/s390x/virtio-ccw.h
@@ -26,6 +26,8 @@
#include <hw/s390x/s390_flic.h>
#include <hw/s390x/css.h>
+#include "ccw-device.h"
+#include "hw/s390x/css-bridge.h"
#define VIRTIO_CCW_CU_TYPE 0x3832
#define VIRTIO_CCW_CHPID_TYPE 0x32
@@ -65,7 +67,7 @@ typedef struct VirtioBusClass VirtioCcwBusClass;
typedef struct VirtioCcwDevice VirtioCcwDevice;
typedef struct VirtIOCCWDeviceClass {
- DeviceClass parent_class;
+ CCWDeviceClass parent_class;
void (*realize)(VirtioCcwDevice *dev, Error **errp);
int (*exit)(VirtioCcwDevice *dev);
} VirtIOCCWDeviceClass;
@@ -76,9 +78,7 @@ typedef struct VirtIOCCWDeviceClass {
#define VIRTIO_CCW_FLAG_USE_IOEVENTFD (1 << VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT)
struct VirtioCcwDevice {
- DeviceState parent_obj;
- SubchDev *sch;
- CssDevId bus_id;
+ CcwDevice parent_obj;
int revision;
uint32_t max_rev;
VirtioBusState bus;
@@ -101,9 +101,6 @@ static inline int virtio_ccw_rev_max(VirtioCcwDevice *dev)
return dev->max_rev;
}
-void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
- DeviceState *dev, Error **errp);
-
/* virtio-scsi-ccw */
#define TYPE_VIRTIO_SCSI_CCW "virtio-scsi-ccw"
--
2.9.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus Cornelia Huck
@ 2016-07-05 8:30 ` Jing Liu
2016-07-05 12:14 ` Cornelia Huck
0 siblings, 1 reply; 11+ messages in thread
From: Jing Liu @ 2016-07-05 8:30 UTC (permalink / raw)
To: Cornelia Huck, qemu-devel; +Cc: borntraeger, agraf, jfrei
Dear Conny,
On 07/05/2016 03:56 PM, Cornelia Huck wrote:
> +
> +static const TypeInfo virtual_css_bridge_info = {
> + .name = TYPE_VIRTUAL_CSS_BRIDGE,
> + .parent = TYPE_SYS_BUS_DEVICE,
> + .instance_size = sizeof(SysBusDevice),
So we do not use VirtualCssBridge macro which includes max_queue for 2.7?
Just curious that in this way, how to deal with the compat for 2.6, 2.5 ...?
Jing
> + .class_init = virtual_css_bridge_class_init,
> + .interfaces = (InterfaceInfo[]) {
> + { TYPE_HOTPLUG_HANDLER },
> + { }
> + }
> +};
> -
> -static const TypeInfo virtual_css_bridge_info = {
> - .name = TYPE_VIRTUAL_CSS_BRIDGE,
> - .parent = TYPE_SYS_BUS_DEVICE,
> - .instance_size = sizeof(SysBusDevice),
> - .class_init = virtual_css_bridge_class_init,
> - .interfaces = (InterfaceInfo[]) {
> - { TYPE_HOTPLUG_HANDLER },
> - { }
> - }
> -};
> -
> /* virtio-ccw-bus */
>
>
> -/* virtual css bridge type */
> -#define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge"
> -
> -/* virtual css bus type */
> -typedef struct VirtualCssBus {
> - BusState parent_obj;
> -} VirtualCssBus;
> -
> -#define TYPE_VIRTUAL_CSS_BUS "virtual-css-bus"
> -#define VIRTUAL_CSS_BUS(obj) \
> - OBJECT_CHECK(VirtualCssBus, (obj), TYPE_VIRTUAL_CSS_BUS)
> +void virtio_ccw_busdev_unplug(HotplugHandler *hotplug_dev,
> + DeviceState *dev, Error **errp);
>
> /* virtio-scsi-ccw */
>
> @@ -192,7 +183,6 @@ typedef struct VirtIORNGCcw {
> VirtIORNG vdev;
> } VirtIORNGCcw;
>
> -VirtualCssBus *virtual_css_bus_init(void);
> void virtio_ccw_device_update_status(SubchDev *sch);
> VirtIODevice *virtio_ccw_get_vdev(SubchDev *sch);
>
> diff --git a/include/hw/s390x/css-bridge.h b/include/hw/s390x/css-bridge.h
> new file mode 100644
> index 0000000..ad73c1f
> --- /dev/null
> +++ b/include/hw/s390x/css-bridge.h
> @@ -0,0 +1,31 @@
> +/*
> + * virtual css bridge definition
> + *
> + * Copyright 2012,2016 IBM Corp.
> + * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
> + * Pierre Morel <pmorel@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or (at
> + * your option) any later version. See the COPYING file in the top-level
> + * directory.
> + */
> +
> +#ifndef HW_S390X_CSS_BRIDGE_H
> +#define HW_S390X_CSS_BRIDGE_H
> +#include "qom/object.h"
> +#include "hw/qdev-core.h"
> +
> +/* virtual css bridge */
> +#define TYPE_VIRTUAL_CSS_BRIDGE "virtual-css-bridge"
> +
> +/* virtual css bus type */
> +typedef struct VirtualCssBus {
> + BusState parent_obj;
> +} VirtualCssBus;
> +
> +#define TYPE_VIRTUAL_CSS_BUS "virtual-css-bus"
> +#define VIRTUAL_CSS_BUS(obj) \
> + OBJECT_CHECK(VirtualCssBus, (obj), TYPE_VIRTUAL_CSS_BUS)
> +VirtualCssBus *virtual_css_bus_init(void);
> +
> +#endif
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus
2016-07-05 8:30 ` Jing Liu
@ 2016-07-05 12:14 ` Cornelia Huck
0 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2016-07-05 12:14 UTC (permalink / raw)
To: Jing Liu; +Cc: qemu-devel, borntraeger, agraf, jfrei
On Tue, 5 Jul 2016 16:30:35 +0800
Jing Liu <liujbjl@linux.vnet.ibm.com> wrote:
> Dear Conny,
>
> On 07/05/2016 03:56 PM, Cornelia Huck wrote:
>
> > +
> > +static const TypeInfo virtual_css_bridge_info = {
> > + .name = TYPE_VIRTUAL_CSS_BRIDGE,
> > + .parent = TYPE_SYS_BUS_DEVICE,
> > + .instance_size = sizeof(SysBusDevice),
>
> So we do not use VirtualCssBridge macro which includes max_queue for 2.7?
> Just curious that in this way, how to deal with the compat for 2.6, 2.5 ...?
We don't have to deal with compat for code I have not included for
upstream yet.
(I have not yet made up my mind exactly on how we want to support the
maximum number of virtqueues as other transports while keeping
backwards compatibility.)
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2016-07-05 12:14 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-07-05 7:56 [Qemu-devel] [PATCH for-2.7 0/8] More s390x patches for 2.7 Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 1/8] pc-bios/s390-ccw: Pass selected SCSI device to IPL Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 2/8] pc-bios/s390-ccw.img: rebuild image Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 3/8] s390x/ipl: Support IPL from selected SCSI device Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 4/8] s390x/ipl: fix reboots for migration from different bios Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 5/8] s390x/css: factor out some generic code from virtio_ccw_device_realize() Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 6/8] s390x/css: use define for "virtual-css-bridge" literal Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 7/8] s390x/css: Factor out virtual css bridge and bus Cornelia Huck
2016-07-05 8:30 ` Jing Liu
2016-07-05 12:14 ` Cornelia Huck
2016-07-05 7:56 ` [Qemu-devel] [PATCH for-2.7 8/8] s390x/css: Unplug handler of virtual css bridge Cornelia Huck
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.