Revision 88045ac5
b/hw/spapr_pci.c | ||
---|---|---|
67 | 67 |
return ((arg >> 20) & 0xf00) | (arg & 0xff); |
68 | 68 |
} |
69 | 69 |
|
70 |
static uint32_t rtas_read_pci_config_do(PCIDevice *pci_dev, uint32_t addr, |
|
71 |
uint32_t limit, uint32_t len) |
|
72 |
{ |
|
73 |
if ((addr + len) <= limit) { |
|
74 |
return pci_host_config_read_common(pci_dev, addr, limit, len); |
|
75 |
} else { |
|
76 |
return ~0x0; |
|
77 |
} |
|
78 |
} |
|
79 |
|
|
80 |
static void rtas_write_pci_config_do(PCIDevice *pci_dev, uint32_t addr, |
|
81 |
uint32_t limit, uint32_t val, |
|
82 |
uint32_t len) |
|
83 |
{ |
|
84 |
if ((addr + len) <= limit) { |
|
85 |
pci_host_config_write_common(pci_dev, addr, limit, val, len); |
|
86 |
} |
|
87 |
} |
|
88 |
|
|
70 | 89 |
static void rtas_ibm_read_pci_config(sPAPREnvironment *spapr, |
71 | 90 |
uint32_t token, uint32_t nargs, |
72 | 91 |
target_ulong args, |
... | ... | |
82 | 101 |
} |
83 | 102 |
size = rtas_ld(args, 3); |
84 | 103 |
addr = rtas_pci_cfgaddr(rtas_ld(args, 0)); |
85 |
val = pci_host_config_read_common(dev, addr, pci_config_size(dev), size);
|
|
104 |
val = rtas_read_pci_config_do(dev, addr, pci_config_size(dev), size);
|
|
86 | 105 |
rtas_st(rets, 0, 0); |
87 | 106 |
rtas_st(rets, 1, val); |
88 | 107 |
} |
... | ... | |
101 | 120 |
} |
102 | 121 |
size = rtas_ld(args, 1); |
103 | 122 |
addr = rtas_pci_cfgaddr(rtas_ld(args, 0)); |
104 |
val = pci_host_config_read_common(dev, addr, pci_config_size(dev), size);
|
|
123 |
val = rtas_read_pci_config_do(dev, addr, pci_config_size(dev), size);
|
|
105 | 124 |
rtas_st(rets, 0, 0); |
106 | 125 |
rtas_st(rets, 1, val); |
107 | 126 |
} |
... | ... | |
122 | 141 |
val = rtas_ld(args, 4); |
123 | 142 |
size = rtas_ld(args, 3); |
124 | 143 |
addr = rtas_pci_cfgaddr(rtas_ld(args, 0)); |
125 |
pci_host_config_write_common(dev, addr, pci_config_size(dev), val, size);
|
|
144 |
rtas_write_pci_config_do(dev, addr, pci_config_size(dev), val, size);
|
|
126 | 145 |
rtas_st(rets, 0, 0); |
127 | 146 |
} |
128 | 147 |
|
... | ... | |
141 | 160 |
val = rtas_ld(args, 2); |
142 | 161 |
size = rtas_ld(args, 1); |
143 | 162 |
addr = rtas_pci_cfgaddr(rtas_ld(args, 0)); |
144 |
pci_host_config_write_common(dev, addr, pci_config_size(dev), val, size);
|
|
163 |
rtas_write_pci_config_do(dev, addr, pci_config_size(dev), val, size);
|
|
145 | 164 |
rtas_st(rets, 0, 0); |
146 | 165 |
} |
147 | 166 |
|
Also available in: Unified diff