diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries/msi.c')
| -rw-r--r-- | arch/powerpc/platforms/pseries/msi.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c index 6d2f0abce6fa..0c882e83c4ce 100644 --- a/arch/powerpc/platforms/pseries/msi.c +++ b/arch/powerpc/platforms/pseries/msi.c | |||
| @@ -130,7 +130,8 @@ static int check_req(struct pci_dev *pdev, int nvec, char *prop_name) | |||
| 130 | { | 130 | { |
| 131 | struct device_node *dn; | 131 | struct device_node *dn; |
| 132 | struct pci_dn *pdn; | 132 | struct pci_dn *pdn; |
| 133 | const u32 *req_msi; | 133 | const __be32 *p; |
| 134 | u32 req_msi; | ||
| 134 | 135 | ||
| 135 | pdn = pci_get_pdn(pdev); | 136 | pdn = pci_get_pdn(pdev); |
| 136 | if (!pdn) | 137 | if (!pdn) |
| @@ -138,19 +139,20 @@ static int check_req(struct pci_dev *pdev, int nvec, char *prop_name) | |||
| 138 | 139 | ||
| 139 | dn = pdn->node; | 140 | dn = pdn->node; |
| 140 | 141 | ||
| 141 | req_msi = of_get_property(dn, prop_name, NULL); | 142 | p = of_get_property(dn, prop_name, NULL); |
| 142 | if (!req_msi) { | 143 | if (!p) { |
| 143 | pr_debug("rtas_msi: No %s on %s\n", prop_name, dn->full_name); | 144 | pr_debug("rtas_msi: No %s on %s\n", prop_name, dn->full_name); |
| 144 | return -ENOENT; | 145 | return -ENOENT; |
| 145 | } | 146 | } |
| 146 | 147 | ||
| 147 | if (*req_msi < nvec) { | 148 | req_msi = be32_to_cpup(p); |
| 149 | if (req_msi < nvec) { | ||
| 148 | pr_debug("rtas_msi: %s requests < %d MSIs\n", prop_name, nvec); | 150 | pr_debug("rtas_msi: %s requests < %d MSIs\n", prop_name, nvec); |
| 149 | 151 | ||
| 150 | if (*req_msi == 0) /* Be paranoid */ | 152 | if (req_msi == 0) /* Be paranoid */ |
| 151 | return -ENOSPC; | 153 | return -ENOSPC; |
| 152 | 154 | ||
| 153 | return *req_msi; | 155 | return req_msi; |
| 154 | } | 156 | } |
| 155 | 157 | ||
| 156 | return 0; | 158 | return 0; |
| @@ -171,7 +173,7 @@ static int check_req_msix(struct pci_dev *pdev, int nvec) | |||
| 171 | static struct device_node *find_pe_total_msi(struct pci_dev *dev, int *total) | 173 | static struct device_node *find_pe_total_msi(struct pci_dev *dev, int *total) |
| 172 | { | 174 | { |
| 173 | struct device_node *dn; | 175 | struct device_node *dn; |
| 174 | const u32 *p; | 176 | const __be32 *p; |
| 175 | 177 | ||
| 176 | dn = of_node_get(pci_device_to_OF_node(dev)); | 178 | dn = of_node_get(pci_device_to_OF_node(dev)); |
| 177 | while (dn) { | 179 | while (dn) { |
| @@ -179,7 +181,7 @@ static struct device_node *find_pe_total_msi(struct pci_dev *dev, int *total) | |||
| 179 | if (p) { | 181 | if (p) { |
| 180 | pr_debug("rtas_msi: found prop on dn %s\n", | 182 | pr_debug("rtas_msi: found prop on dn %s\n", |
| 181 | dn->full_name); | 183 | dn->full_name); |
| 182 | *total = *p; | 184 | *total = be32_to_cpup(p); |
| 183 | return dn; | 185 | return dn; |
| 184 | } | 186 | } |
| 185 | 187 | ||
| @@ -232,13 +234,13 @@ struct msi_counts { | |||
| 232 | static void *count_non_bridge_devices(struct device_node *dn, void *data) | 234 | static void *count_non_bridge_devices(struct device_node *dn, void *data) |
| 233 | { | 235 | { |
| 234 | struct msi_counts *counts = data; | 236 | struct msi_counts *counts = data; |
| 235 | const u32 *p; | 237 | const __be32 *p; |
| 236 | u32 class; | 238 | u32 class; |
| 237 | 239 | ||
| 238 | pr_debug("rtas_msi: counting %s\n", dn->full_name); | 240 | pr_debug("rtas_msi: counting %s\n", dn->full_name); |
| 239 | 241 | ||
| 240 | p = of_get_property(dn, "class-code", NULL); | 242 | p = of_get_property(dn, "class-code", NULL); |
| 241 | class = p ? *p : 0; | 243 | class = p ? be32_to_cpup(p) : 0; |
| 242 | 244 | ||
| 243 | if ((class >> 8) != PCI_CLASS_BRIDGE_PCI) | 245 | if ((class >> 8) != PCI_CLASS_BRIDGE_PCI) |
| 244 | counts->num_devices++; | 246 | counts->num_devices++; |
| @@ -249,7 +251,7 @@ static void *count_non_bridge_devices(struct device_node *dn, void *data) | |||
| 249 | static void *count_spare_msis(struct device_node *dn, void *data) | 251 | static void *count_spare_msis(struct device_node *dn, void *data) |
| 250 | { | 252 | { |
| 251 | struct msi_counts *counts = data; | 253 | struct msi_counts *counts = data; |
| 252 | const u32 *p; | 254 | const __be32 *p; |
| 253 | int req; | 255 | int req; |
| 254 | 256 | ||
| 255 | if (dn == counts->requestor) | 257 | if (dn == counts->requestor) |
| @@ -260,11 +262,11 @@ static void *count_spare_msis(struct device_node *dn, void *data) | |||
| 260 | req = 0; | 262 | req = 0; |
| 261 | p = of_get_property(dn, "ibm,req#msi", NULL); | 263 | p = of_get_property(dn, "ibm,req#msi", NULL); |
| 262 | if (p) | 264 | if (p) |
| 263 | req = *p; | 265 | req = be32_to_cpup(p); |
| 264 | 266 | ||
| 265 | p = of_get_property(dn, "ibm,req#msi-x", NULL); | 267 | p = of_get_property(dn, "ibm,req#msi-x", NULL); |
| 266 | if (p) | 268 | if (p) |
| 267 | req = max(req, (int)*p); | 269 | req = max(req, (int)be32_to_cpup(p)); |
| 268 | } | 270 | } |
| 269 | 271 | ||
| 270 | if (req < counts->quota) | 272 | if (req < counts->quota) |
