| @@ -839,7 +839,7 @@ static void remove_ddw(struct device_node *np, bool remove_prop) · 838 unmodified lines |
| 839 | np, ret); | 839 | np, ret); |
| 840 | } | 840 | } |
| 841 | | 841 | |
| 842 | static u64 find_existing_ddw(struct device_node *pdn) | 842 | static u64 find_existing_ddw(struct device_node *pdn, int *window_shift) |
| 843 | { | 843 | { |
| 844 | struct direct_window *window; | 844 | struct direct_window *window; |
| 845 | const struct dynamic_dma_window_prop *direct64; | 845 | const struct dynamic_dma_window_prop *direct64; |
| @@ -851,6 +851,7 @@ static u64 find_existing_ddw(struct device_node *pdn) · 5 unmodified lines |
| 851 | if (window->device == pdn) { | 851 | if (window->device == pdn) { |
| 852 | direct64 = window->prop; | 852 | direct64 = window->prop; |
| 853 | dma_addr = be64_to_cpu(direct64->dma_base); | 853 | dma_addr = be64_to_cpu(direct64->dma_base); |
| | 854 | *window_shift = be32_to_cpu(direct64->window_shift); |
| 854 | break; | 855 | break; |
| 855 | } | 856 | } |
| 856 | } | 857 | } |
| @@ -1111,11 +1112,12 @@ static void reset_dma_window(struct pci_dev *dev, struct device_node *par_dn) · 254 unmodified lines |
| 1111 | */ | 1112 | */ |
| 1112 | static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn) | 1113 | static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn) |
| 1113 | { | 1114 | { |
| 1114 | int len, ret; | 1115 | int len = 0, ret; |
| | 1116 | int max_ram_len = order_base_2(ddw_memory_hotplug_max()); |
| 1115 | struct ddw_query_response query; | 1117 | struct ddw_query_response query; |
| 1116 | struct ddw_create_response create; | 1118 | struct ddw_create_response create; |
| 1117 | int page_shift; | 1119 | int page_shift; |
| 1118 | u64 dma_addr, max_addr; | 1120 | u64 dma_addr; |
| 1119 | struct device_node *dn; | 1121 | struct device_node *dn; |
| 1120 | u32 ddw_avail[DDW_APPLICABLE_SIZE]; | 1122 | u32 ddw_avail[DDW_APPLICABLE_SIZE]; |
| 1121 | struct direct_window *window; | 1123 | struct direct_window *window; |
| @@ -1123,10 +1125,15 @@ static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn) · 1 unmodified line |
| 1123 | struct dynamic_dma_window_prop *ddwprop; | 1125 | struct dynamic_dma_window_prop *ddwprop; |
| 1124 | struct failed_ddw_pdn *fpdn; | 1126 | struct failed_ddw_pdn *fpdn; |
| 1125 | bool default_win_removed = false; | 1127 | bool default_win_removed = false; |
| | 1128 | bool pmem_present; |
| | 1129 | |
| | 1130 | dn = of_find_node_by_type(NULL, "ibm,pmemory"); |
| | 1131 | pmem_present = dn != NULL; |
| | 1132 | of_node_put(dn); |
| 1126 | | 1133 | |
| 1127 | mutex_lock(&direct_window_init_mutex); | 1134 | mutex_lock(&direct_window_init_mutex); |
| 1128 | | 1135 | |
| 1129 | dma_addr = find_existing_ddw(pdn); | 1136 | dma_addr = find_existing_ddw(pdn, &len); |
| 1130 | if (dma_addr != 0) | 1137 | if (dma_addr != 0) |
| 1131 | goto out_unlock; | 1138 | goto out_unlock; |
| 1132 | | 1139 | |
| @@ -1212,14 +1219,29 @@ static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn) · 79 unmodified lines |
| 1212 | } | 1219 | } |
| 1213 | /* verify the window * number of ptes will map the partition */ | 1220 | /* verify the window * number of ptes will map the partition */ |
| 1214 | /* check largest block * page size > max memory hotplug addr */ | 1221 | /* check largest block * page size > max memory hotplug addr */ |
| 1215 | max_addr = ddw_memory_hotplug_max(); | 1222 | /* |
| 1216 | if (query.largest_available_block < (max_addr >> page_shift)) { | 1223 | * The "ibm,pmemory" can appear anywhere in the address space. |
| 1217 | dev_dbg(&dev->dev, "can't map partition max 0x%llx with %llu " | 1224 | * Assuming it is still backed by page structs, try MAX_PHYSMEM_BITS |
| 1218 | "%llu-sized pages\n", max_addr, query.largest_available_block, | 1225 | * for the upper limit and fallback to max RAM otherwise but this |
| 1219 | 1ULL << page_shift); | 1226 | * disables device::dma_ops_bypass. |
| | 1227 | */ |
| | 1228 | len = max_ram_len; |
| | 1229 | if (pmem_present) { |
| | 1230 | if (query.largest_available_block >= |
| | 1231 | (1ULL << (MAX_PHYSMEM_BITS - page_shift))) |
| | 1232 | len = MAX_PHYSMEM_BITS - page_shift; |
| | 1233 | else |
| | 1234 | dev_info(&dev->dev, "Skipping ibm,pmemory"); |
| | 1235 | } |
| | 1236 | |
| | 1237 | if (query.largest_available_block < (1ULL << (len - page_shift))) { |
| | 1238 | dev_dbg(&dev->dev, |
| | 1239 | "can't map partition max 0x%llx with %llu %llu-sized pages\n", |
| | 1240 | 1ULL << len, |
| | 1241 | query.largest_available_block, |
| | 1242 | 1ULL << page_shift); |
| 1220 | goto out_failed; | 1243 | goto out_failed; |
| 1221 | } | 1244 | } |
| 1222 | len = order_base_2(max_addr); | | |
| 1223 | win64 = kzalloc(sizeof(struct property), GFP_KERNEL); | 1245 | win64 = kzalloc(sizeof(struct property), GFP_KERNEL); |
| 1224 | if (!win64) { | 1246 | if (!win64) { |
| 1225 | dev_info(&dev->dev, | 1247 | dev_info(&dev->dev, |
| @@ -1299,6 +1321,15 @@ out_failed: · 73 unmodified lines |
| 1299 | | 1321 | |
| 1300 | out_unlock: | 1322 | out_unlock: |
| 1301 | mutex_unlock(&direct_window_init_mutex); | 1323 | mutex_unlock(&direct_window_init_mutex); |
| | 1324 | |
| | 1325 | /* |
| | 1326 | * If we have persistent memory and the window size is only as big |
| | 1327 | * as RAM, then we failed to create a window to cover persistent |
| | 1328 | * memory and need to set the DMA limit. |
| | 1329 | */ |
| | 1330 | if (pmem_present && dma_addr && (len == max_ram_len)) |
| | 1331 | dev->dev.bus_dma_limit = dma_addr + (1ULL << len); |
| | 1332 | |
| 1302 | return dma_addr; | 1333 | return dma_addr; |
| 1303 | } | 1334 | } |
| 1304 | | 1335 | |