0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <linux/pci.h>
0021 #include "pci-bridge-emul.h"
0022
0023 #define PCI_BRIDGE_CONF_END PCI_STD_HEADER_SIZEOF
0024 #define PCI_CAP_SSID_SIZEOF (PCI_SSVID_DEVICE_ID + 2)
0025 #define PCI_CAP_SSID_START PCI_BRIDGE_CONF_END
0026 #define PCI_CAP_SSID_END (PCI_CAP_SSID_START + PCI_CAP_SSID_SIZEOF)
0027 #define PCI_CAP_PCIE_SIZEOF (PCI_EXP_SLTSTA2 + 2)
0028 #define PCI_CAP_PCIE_START PCI_CAP_SSID_END
0029 #define PCI_CAP_PCIE_END (PCI_CAP_PCIE_START + PCI_CAP_PCIE_SIZEOF)
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 struct pci_bridge_reg_behavior {
0043
0044 u32 ro;
0045
0046
0047 u32 rw;
0048
0049
0050 u32 w1c;
0051 };
0052
0053 static const
0054 struct pci_bridge_reg_behavior pci_regs_behavior[PCI_STD_HEADER_SIZEOF / 4] = {
0055 [PCI_VENDOR_ID / 4] = { .ro = ~0 },
0056 [PCI_COMMAND / 4] = {
0057 .rw = (PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
0058 PCI_COMMAND_MASTER | PCI_COMMAND_PARITY |
0059 PCI_COMMAND_SERR),
0060 .ro = ((PCI_COMMAND_SPECIAL | PCI_COMMAND_INVALIDATE |
0061 PCI_COMMAND_VGA_PALETTE | PCI_COMMAND_WAIT |
0062 PCI_COMMAND_FAST_BACK) |
0063 (PCI_STATUS_CAP_LIST | PCI_STATUS_66MHZ |
0064 PCI_STATUS_FAST_BACK | PCI_STATUS_DEVSEL_MASK) << 16),
0065 .w1c = PCI_STATUS_ERROR_BITS << 16,
0066 },
0067 [PCI_CLASS_REVISION / 4] = { .ro = ~0 },
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 [PCI_CACHE_LINE_SIZE / 4] = { .ro = ~0 },
0086
0087
0088
0089
0090
0091 [PCI_BASE_ADDRESS_0 / 4] = { .ro = ~0 },
0092 [PCI_BASE_ADDRESS_1 / 4] = { .ro = ~0 },
0093
0094 [PCI_PRIMARY_BUS / 4] = {
0095
0096 .rw = GENMASK(24, 0),
0097
0098 .ro = GENMASK(31, 24),
0099 },
0100
0101 [PCI_IO_BASE / 4] = {
0102
0103 .rw = (GENMASK(15, 12) | GENMASK(7, 4)),
0104
0105
0106 .ro = (((PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK |
0107 PCI_STATUS_DEVSEL_MASK) << 16) |
0108 GENMASK(11, 8) | GENMASK(3, 0)),
0109
0110 .w1c = PCI_STATUS_ERROR_BITS << 16,
0111 },
0112
0113 [PCI_MEMORY_BASE / 4] = {
0114
0115 .rw = GENMASK(31, 20) | GENMASK(15, 4),
0116
0117
0118 .ro = GENMASK(19, 16) | GENMASK(3, 0),
0119 },
0120
0121 [PCI_PREF_MEMORY_BASE / 4] = {
0122
0123 .rw = GENMASK(31, 20) | GENMASK(15, 4),
0124
0125
0126 .ro = GENMASK(19, 16) | GENMASK(3, 0),
0127 },
0128
0129 [PCI_PREF_BASE_UPPER32 / 4] = {
0130 .rw = ~0,
0131 },
0132
0133 [PCI_PREF_LIMIT_UPPER32 / 4] = {
0134 .rw = ~0,
0135 },
0136
0137 [PCI_IO_BASE_UPPER16 / 4] = {
0138 .rw = ~0,
0139 },
0140
0141 [PCI_CAPABILITY_LIST / 4] = {
0142 .ro = GENMASK(7, 0),
0143 },
0144
0145
0146
0147
0148
0149
0150 [PCI_ROM_ADDRESS1 / 4] = {
0151 .ro = ~0,
0152 },
0153
0154
0155
0156
0157
0158
0159 [PCI_INTERRUPT_LINE / 4] = {
0160
0161 .rw = (GENMASK(7, 0) |
0162 ((PCI_BRIDGE_CTL_PARITY |
0163 PCI_BRIDGE_CTL_SERR |
0164 PCI_BRIDGE_CTL_ISA |
0165 PCI_BRIDGE_CTL_VGA |
0166 PCI_BRIDGE_CTL_MASTER_ABORT |
0167 PCI_BRIDGE_CTL_BUS_RESET |
0168 BIT(8) | BIT(9) | BIT(11)) << 16)),
0169
0170
0171 .ro = (GENMASK(15, 8) | ((PCI_BRIDGE_CTL_FAST_BACK) << 16)),
0172
0173 .w1c = BIT(10) << 16,
0174 },
0175 };
0176
0177 static const
0178 struct pci_bridge_reg_behavior pcie_cap_regs_behavior[PCI_CAP_PCIE_SIZEOF / 4] = {
0179 [PCI_CAP_LIST_ID / 4] = {
0180
0181
0182
0183
0184
0185 .ro = GENMASK(30, 0),
0186 },
0187
0188 [PCI_EXP_DEVCAP / 4] = {
0189
0190
0191
0192
0193
0194
0195 .ro = BIT(15) | GENMASK(5, 0),
0196 },
0197
0198 [PCI_EXP_DEVCTL / 4] = {
0199
0200
0201
0202
0203 .rw = GENMASK(14, 0),
0204
0205
0206
0207
0208
0209
0210 .w1c = GENMASK(3, 0) << 16,
0211 .ro = GENMASK(5, 4) << 16,
0212 },
0213
0214 [PCI_EXP_LNKCAP / 4] = {
0215
0216
0217
0218
0219 .ro = lower_32_bits(~(BIT(23) | PCI_EXP_LNKCAP_CLKPM)),
0220 },
0221
0222 [PCI_EXP_LNKCTL / 4] = {
0223
0224
0225
0226
0227
0228
0229
0230 .rw = GENMASK(15, 14) | GENMASK(11, 9) | GENMASK(7, 3) | GENMASK(1, 0),
0231 .ro = GENMASK(13, 0) << 16,
0232 .w1c = GENMASK(15, 14) << 16,
0233 },
0234
0235 [PCI_EXP_SLTCAP / 4] = {
0236 .ro = ~0,
0237 },
0238
0239 [PCI_EXP_SLTCTL / 4] = {
0240
0241
0242
0243
0244
0245
0246
0247 .rw = GENMASK(14, 0),
0248 .w1c = (PCI_EXP_SLTSTA_ABP | PCI_EXP_SLTSTA_PFD |
0249 PCI_EXP_SLTSTA_MRLSC | PCI_EXP_SLTSTA_PDC |
0250 PCI_EXP_SLTSTA_CC | PCI_EXP_SLTSTA_DLLSC) << 16,
0251 .ro = (PCI_EXP_SLTSTA_MRLSS | PCI_EXP_SLTSTA_PDS |
0252 PCI_EXP_SLTSTA_EIS) << 16,
0253 },
0254
0255 [PCI_EXP_RTCTL / 4] = {
0256
0257
0258
0259
0260
0261
0262 .rw = (PCI_EXP_RTCTL_SECEE | PCI_EXP_RTCTL_SENFEE |
0263 PCI_EXP_RTCTL_SEFEE | PCI_EXP_RTCTL_PMEIE |
0264 PCI_EXP_RTCTL_CRSSVE),
0265 .ro = PCI_EXP_RTCAP_CRSVIS << 16,
0266 },
0267
0268 [PCI_EXP_RTSTA / 4] = {
0269
0270
0271
0272
0273 .ro = GENMASK(15, 0) | PCI_EXP_RTSTA_PENDING,
0274 .w1c = PCI_EXP_RTSTA_PME,
0275 },
0276
0277 [PCI_EXP_DEVCAP2 / 4] = {
0278
0279
0280
0281
0282 .ro = BIT(31) | GENMASK(23, 0),
0283 },
0284
0285 [PCI_EXP_DEVCTL2 / 4] = {
0286
0287
0288
0289
0290
0291
0292 .rw = GENMASK(15, 12) | GENMASK(10, 0),
0293 },
0294
0295 [PCI_EXP_LNKCAP2 / 4] = {
0296
0297 .ro = BIT(31) | GENMASK(24, 1),
0298 },
0299
0300 [PCI_EXP_LNKCTL2 / 4] = {
0301
0302
0303
0304
0305
0306
0307 .rw = GENMASK(15, 0),
0308 .w1c = (BIT(15) | BIT(5)) << 16,
0309 .ro = (GENMASK(14, 12) | GENMASK(9, 6) | GENMASK(4, 0)) << 16,
0310 },
0311
0312 [PCI_EXP_SLTCAP2 / 4] = {
0313
0314 },
0315
0316 [PCI_EXP_SLTCTL2 / 4] = {
0317
0318 },
0319 };
0320
0321 static pci_bridge_emul_read_status_t
0322 pci_bridge_emul_read_ssid(struct pci_bridge_emul *bridge, int reg, u32 *value)
0323 {
0324 switch (reg) {
0325 case PCI_CAP_LIST_ID:
0326 *value = PCI_CAP_ID_SSVID |
0327 (bridge->has_pcie ? (PCI_CAP_PCIE_START << 8) : 0);
0328 return PCI_BRIDGE_EMUL_HANDLED;
0329
0330 case PCI_SSVID_VENDOR_ID:
0331 *value = bridge->subsystem_vendor_id |
0332 (bridge->subsystem_id << 16);
0333 return PCI_BRIDGE_EMUL_HANDLED;
0334
0335 default:
0336 return PCI_BRIDGE_EMUL_NOT_HANDLED;
0337 }
0338 }
0339
0340
0341
0342
0343
0344
0345
0346
0347 int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
0348 unsigned int flags)
0349 {
0350 BUILD_BUG_ON(sizeof(bridge->conf) != PCI_BRIDGE_CONF_END);
0351
0352
0353
0354
0355
0356
0357 bridge->conf.class_revision |=
0358 cpu_to_le32(PCI_CLASS_BRIDGE_PCI_NORMAL << 8);
0359 bridge->conf.header_type = PCI_HEADER_TYPE_BRIDGE;
0360 bridge->conf.cache_line_size = 0x10;
0361 bridge->conf.status = cpu_to_le16(PCI_STATUS_CAP_LIST);
0362 bridge->pci_regs_behavior = kmemdup(pci_regs_behavior,
0363 sizeof(pci_regs_behavior),
0364 GFP_KERNEL);
0365 if (!bridge->pci_regs_behavior)
0366 return -ENOMEM;
0367
0368 if (bridge->subsystem_vendor_id)
0369 bridge->conf.capabilities_pointer = PCI_CAP_SSID_START;
0370 else if (bridge->has_pcie)
0371 bridge->conf.capabilities_pointer = PCI_CAP_PCIE_START;
0372 else
0373 bridge->conf.capabilities_pointer = 0;
0374
0375 if (bridge->conf.capabilities_pointer)
0376 bridge->conf.status |= cpu_to_le16(PCI_STATUS_CAP_LIST);
0377
0378 if (bridge->has_pcie) {
0379 bridge->pcie_conf.cap_id = PCI_CAP_ID_EXP;
0380 bridge->pcie_conf.cap |= cpu_to_le16(PCI_EXP_TYPE_ROOT_PORT << 4);
0381 bridge->pcie_cap_regs_behavior =
0382 kmemdup(pcie_cap_regs_behavior,
0383 sizeof(pcie_cap_regs_behavior),
0384 GFP_KERNEL);
0385 if (!bridge->pcie_cap_regs_behavior) {
0386 kfree(bridge->pci_regs_behavior);
0387 return -ENOMEM;
0388 }
0389
0390 bridge->pci_regs_behavior[PCI_CACHE_LINE_SIZE / 4].ro &=
0391 ~GENMASK(15, 8);
0392 bridge->pci_regs_behavior[PCI_COMMAND / 4].ro &=
0393 ~((PCI_COMMAND_SPECIAL | PCI_COMMAND_INVALIDATE |
0394 PCI_COMMAND_VGA_PALETTE | PCI_COMMAND_WAIT |
0395 PCI_COMMAND_FAST_BACK) |
0396 (PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK |
0397 PCI_STATUS_DEVSEL_MASK) << 16);
0398 bridge->pci_regs_behavior[PCI_PRIMARY_BUS / 4].ro &=
0399 ~GENMASK(31, 24);
0400 bridge->pci_regs_behavior[PCI_IO_BASE / 4].ro &=
0401 ~((PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK |
0402 PCI_STATUS_DEVSEL_MASK) << 16);
0403 bridge->pci_regs_behavior[PCI_INTERRUPT_LINE / 4].rw &=
0404 ~((PCI_BRIDGE_CTL_MASTER_ABORT |
0405 BIT(8) | BIT(9) | BIT(11)) << 16);
0406 bridge->pci_regs_behavior[PCI_INTERRUPT_LINE / 4].ro &=
0407 ~((PCI_BRIDGE_CTL_FAST_BACK) << 16);
0408 bridge->pci_regs_behavior[PCI_INTERRUPT_LINE / 4].w1c &=
0409 ~(BIT(10) << 16);
0410 }
0411
0412 if (flags & PCI_BRIDGE_EMUL_NO_PREFMEM_FORWARD) {
0413 bridge->pci_regs_behavior[PCI_PREF_MEMORY_BASE / 4].ro = ~0;
0414 bridge->pci_regs_behavior[PCI_PREF_MEMORY_BASE / 4].rw = 0;
0415 }
0416
0417 if (flags & PCI_BRIDGE_EMUL_NO_IO_FORWARD) {
0418 bridge->pci_regs_behavior[PCI_COMMAND / 4].ro |= PCI_COMMAND_IO;
0419 bridge->pci_regs_behavior[PCI_COMMAND / 4].rw &= ~PCI_COMMAND_IO;
0420 bridge->pci_regs_behavior[PCI_IO_BASE / 4].ro |= GENMASK(15, 0);
0421 bridge->pci_regs_behavior[PCI_IO_BASE / 4].rw &= ~GENMASK(15, 0);
0422 bridge->pci_regs_behavior[PCI_IO_BASE_UPPER16 / 4].ro = ~0;
0423 bridge->pci_regs_behavior[PCI_IO_BASE_UPPER16 / 4].rw = 0;
0424 }
0425
0426 return 0;
0427 }
0428 EXPORT_SYMBOL_GPL(pci_bridge_emul_init);
0429
0430
0431
0432
0433
0434 void pci_bridge_emul_cleanup(struct pci_bridge_emul *bridge)
0435 {
0436 if (bridge->has_pcie)
0437 kfree(bridge->pcie_cap_regs_behavior);
0438 kfree(bridge->pci_regs_behavior);
0439 }
0440 EXPORT_SYMBOL_GPL(pci_bridge_emul_cleanup);
0441
0442
0443
0444
0445
0446
0447 int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where,
0448 int size, u32 *value)
0449 {
0450 int ret;
0451 int reg = where & ~3;
0452 pci_bridge_emul_read_status_t (*read_op)(struct pci_bridge_emul *bridge,
0453 int reg, u32 *value);
0454 __le32 *cfgspace;
0455 const struct pci_bridge_reg_behavior *behavior;
0456
0457 if (reg < PCI_BRIDGE_CONF_END) {
0458
0459 read_op = bridge->ops->read_base;
0460 cfgspace = (__le32 *) &bridge->conf;
0461 behavior = bridge->pci_regs_behavior;
0462 } else if (reg >= PCI_CAP_SSID_START && reg < PCI_CAP_SSID_END && bridge->subsystem_vendor_id) {
0463
0464 reg -= PCI_CAP_SSID_START;
0465 read_op = pci_bridge_emul_read_ssid;
0466 cfgspace = NULL;
0467 behavior = NULL;
0468 } else if (reg >= PCI_CAP_PCIE_START && reg < PCI_CAP_PCIE_END && bridge->has_pcie) {
0469
0470 reg -= PCI_CAP_PCIE_START;
0471 read_op = bridge->ops->read_pcie;
0472 cfgspace = (__le32 *) &bridge->pcie_conf;
0473 behavior = bridge->pcie_cap_regs_behavior;
0474 } else if (reg >= PCI_CFG_SPACE_SIZE && bridge->has_pcie) {
0475
0476 reg -= PCI_CFG_SPACE_SIZE;
0477 read_op = bridge->ops->read_ext;
0478 cfgspace = NULL;
0479 behavior = NULL;
0480 } else {
0481
0482 *value = 0;
0483 return PCIBIOS_SUCCESSFUL;
0484 }
0485
0486 if (read_op)
0487 ret = read_op(bridge, reg, value);
0488 else
0489 ret = PCI_BRIDGE_EMUL_NOT_HANDLED;
0490
0491 if (ret == PCI_BRIDGE_EMUL_NOT_HANDLED) {
0492 if (cfgspace)
0493 *value = le32_to_cpu(cfgspace[reg / 4]);
0494 else
0495 *value = 0;
0496 }
0497
0498
0499
0500
0501
0502 if (behavior)
0503 *value &= behavior[reg / 4].ro | behavior[reg / 4].rw |
0504 behavior[reg / 4].w1c;
0505
0506 if (size == 1)
0507 *value = (*value >> (8 * (where & 3))) & 0xff;
0508 else if (size == 2)
0509 *value = (*value >> (8 * (where & 3))) & 0xffff;
0510 else if (size != 4)
0511 return PCIBIOS_BAD_REGISTER_NUMBER;
0512
0513 return PCIBIOS_SUCCESSFUL;
0514 }
0515 EXPORT_SYMBOL_GPL(pci_bridge_emul_conf_read);
0516
0517
0518
0519
0520
0521
0522 int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where,
0523 int size, u32 value)
0524 {
0525 int reg = where & ~3;
0526 int mask, ret, old, new, shift;
0527 void (*write_op)(struct pci_bridge_emul *bridge, int reg,
0528 u32 old, u32 new, u32 mask);
0529 __le32 *cfgspace;
0530 const struct pci_bridge_reg_behavior *behavior;
0531
0532 ret = pci_bridge_emul_conf_read(bridge, reg, 4, &old);
0533 if (ret != PCIBIOS_SUCCESSFUL)
0534 return ret;
0535
0536 if (reg < PCI_BRIDGE_CONF_END) {
0537
0538 write_op = bridge->ops->write_base;
0539 cfgspace = (__le32 *) &bridge->conf;
0540 behavior = bridge->pci_regs_behavior;
0541 } else if (reg >= PCI_CAP_PCIE_START && reg < PCI_CAP_PCIE_END && bridge->has_pcie) {
0542
0543 reg -= PCI_CAP_PCIE_START;
0544 write_op = bridge->ops->write_pcie;
0545 cfgspace = (__le32 *) &bridge->pcie_conf;
0546 behavior = bridge->pcie_cap_regs_behavior;
0547 } else if (reg >= PCI_CFG_SPACE_SIZE && bridge->has_pcie) {
0548
0549 reg -= PCI_CFG_SPACE_SIZE;
0550 write_op = bridge->ops->write_ext;
0551 cfgspace = NULL;
0552 behavior = NULL;
0553 } else {
0554
0555 return PCIBIOS_SUCCESSFUL;
0556 }
0557
0558 shift = (where & 0x3) * 8;
0559
0560 if (size == 4)
0561 mask = 0xffffffff;
0562 else if (size == 2)
0563 mask = 0xffff << shift;
0564 else if (size == 1)
0565 mask = 0xff << shift;
0566 else
0567 return PCIBIOS_BAD_REGISTER_NUMBER;
0568
0569 if (behavior) {
0570
0571 new = old & (~mask | ~behavior[reg / 4].rw);
0572
0573
0574 new |= (value << shift) & (behavior[reg / 4].rw & mask);
0575
0576
0577 new &= ~((value << shift) & (behavior[reg / 4].w1c & mask));
0578 } else {
0579 new = old & ~mask;
0580 new |= (value << shift) & mask;
0581 }
0582
0583 if (cfgspace) {
0584
0585 cfgspace[reg / 4] = cpu_to_le32(new);
0586 }
0587
0588 if (behavior) {
0589
0590
0591
0592
0593 new &= ~(behavior[reg / 4].w1c & ~mask);
0594
0595
0596
0597
0598
0599 new |= (value << shift) & (behavior[reg / 4].w1c & mask);
0600 }
0601
0602 if (write_op)
0603 write_op(bridge, reg, old, new, mask);
0604
0605 return PCIBIOS_SUCCESSFUL;
0606 }
0607 EXPORT_SYMBOL_GPL(pci_bridge_emul_conf_write);