310
FIELD(ICSR, PRIORITY, 11, 5)
311
FIELD(ICSR, IAFFID, 32, 16)
312
313
+static GICv5SPIState *spi_for_selr(GICv5Common *cs, GICv5Domain domain)
314
+{
315
+ /*
316
+ * If the IRS_SPI_SELR value specifies an SPI that can be managed in
317
+ * this domain, return a pointer to its GICv5SPIState; otherwise
318
+ * return NULL.
319
+ */
320
+ uint32_t id = FIELD_EX32(cs->irs_spi_selr[domain], IRS_SPI_SELR, ID);
321
+ GICv5SPIState *spi = gicv5_raw_spi_state(cs, id);
322
+
323
+ if (spi && (domain == GICV5_ID_EL3 || domain == spi->domain)) {
324
+ return spi;
325
+ }
326
+ return NULL;
327
+}
328
+
329
static MemTxAttrs irs_txattrs(GICv5Common *cs, GICv5Domain domain)
330
{
331
/*
1026
case A_IRS_IST_CFGR:
1027
*data = cs->irs_ist_cfgr[domain];
1028
return true;
1029
+
1030
+ case A_IRS_SPI_STATUSR:
1031
+ /*
1032
+ * QEMU writes to IRS_SPI_{CFGR,DOMAINR,SELR,VMR} take effect
1033
+ * instantaneously, so the guest can never see the IDLE bit as 0.
1034
+ */
1035
+ v = FIELD_DP32(v, IRS_SPI_STATUSR, V,
1036
+ spi_for_selr(cs, domain) != NULL);
1037
+ v = FIELD_DP32(v, IRS_SPI_STATUSR, IDLE, 1);
1038
+ *data = v;
1039
+ return true;
1040
+
1041
+ case A_IRS_SPI_CFGR:
1042
+ {
1043
+ GICv5SPIState *spi = spi_for_selr(cs, domain);
1044
+
1045
+ if (spi) {
1046
+ v = FIELD_DP32(v, IRS_SPI_CFGR, TM, spi->tm);
1047
+ }
1048
+ *data = v;
1049
+ return true;
1050
+ }
1051
+ case A_IRS_SPI_DOMAINR:
1052
+ if (domain == GICV5_ID_EL3) {
1053
+ /* This is RAZ/WI except for the EL3 domain */
1054
+ GICv5SPIState *spi = spi_for_selr(cs, domain);
1055
+ if (spi) {
1056
+ v = FIELD_DP32(v, IRS_SPI_DOMAINR, DOMAIN, spi->domain);
1057
+ }
1058
+ }
1059
+ *data = v;
1060
+ return true;
1061
}
1062
1063
return false;
1089
case A_IRS_MAP_L2_ISTR:
1090
irs_map_l2_istr_write(s, domain, data);
1091
return true;
1092
+ case A_IRS_SPI_SELR:
1093
+ cs->irs_spi_selr[domain] = data;
1094
+ return true;
1095
+ case A_IRS_SPI_CFGR:
1096
+ {
1097
+ GICv5SPIState *spi = spi_for_selr(cs, domain);
1098
+ if (spi) {
1099
+ spi->tm = FIELD_EX32(data, IRS_SPI_CFGR, TM);
1100
+ }
1101
+ return true;
1102
+ }
1103
+ case A_IRS_SPI_DOMAINR:
1104
+ if (domain == GICV5_ID_EL3) {
1105
+ /* this is RAZ/WI except for the EL3 domain */
1106
+ GICv5SPIState *spi = spi_for_selr(cs, domain);
1107
+ if (spi) {
1108
+ spi->domain = FIELD_EX32(data, IRS_SPI_DOMAINR, DOMAIN);
1109
+ }
1110
+ }
1111
+ return true;
1112
}
1113
1114
return false;