1 /*
2  * PCI Backend - Handles the virtual fields in the configuration space headers.
3  *
4  * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
5  */
6 
7 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8 
9 #include <linux/kernel.h>
10 #include <linux/pci.h>
11 #include "pciback.h"
12 #include "conf_space.h"
13 
14 struct pci_cmd_info {
15 	u16 val;
16 };
17 
18 struct pci_bar_info {
19 	u32 val;
20 	u32 len_val;
21 	int which;
22 };
23 
24 #define is_enable_cmd(value) ((value)&(PCI_COMMAND_MEMORY|PCI_COMMAND_IO))
25 #define is_master_cmd(value) ((value)&PCI_COMMAND_MASTER)
26 
27 /* Bits guests are allowed to control in permissive mode. */
28 #define PCI_COMMAND_GUEST (PCI_COMMAND_MASTER|PCI_COMMAND_SPECIAL| \
29 			   PCI_COMMAND_INVALIDATE|PCI_COMMAND_VGA_PALETTE| \
30 			   PCI_COMMAND_WAIT|PCI_COMMAND_FAST_BACK)
31 
32 static void *command_init(struct pci_dev *dev, int offset)
33 {
34 	struct pci_cmd_info *cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
35 	int err;
36 
37 	if (!cmd)
38 		return ERR_PTR(-ENOMEM);
39 
40 	err = pci_read_config_word(dev, PCI_COMMAND, &cmd->val);
41 	if (err) {
42 		kfree(cmd);
43 		return ERR_PTR(err);
44 	}
45 
46 	return cmd;
47 }
48 
49 static int command_read(struct pci_dev *dev, int offset, u16 *value, void *data)
50 {
51 	int ret = pci_read_config_word(dev, offset, value);
52 	const struct pci_cmd_info *cmd = data;
53 
54 	*value &= PCI_COMMAND_GUEST;
55 	*value |= cmd->val & ~PCI_COMMAND_GUEST;
56 
57 	return ret;
58 }
59 
60 static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
61 {
62 	struct xen_pcibk_dev_data *dev_data;
63 	int err;
64 	u16 val;
65 	struct pci_cmd_info *cmd = data;
66 
67 	dev_data = pci_get_drvdata(dev);
68 	if (!pci_is_enabled(dev) && is_enable_cmd(value)) {
69 		if (unlikely(verbose_request))
70 			printk(KERN_DEBUG DRV_NAME ": %s: enable\n",
71 			       pci_name(dev));
72 		err = pci_enable_device(dev);
73 		if (err)
74 			return err;
75 		if (dev_data)
76 			dev_data->enable_intx = 1;
77 	} else if (pci_is_enabled(dev) && !is_enable_cmd(value)) {
78 		if (unlikely(verbose_request))
79 			printk(KERN_DEBUG DRV_NAME ": %s: disable\n",
80 			       pci_name(dev));
81 		pci_disable_device(dev);
82 		if (dev_data)
83 			dev_data->enable_intx = 0;
84 	}
85 
86 	if (!dev->is_busmaster && is_master_cmd(value)) {
87 		if (unlikely(verbose_request))
88 			printk(KERN_DEBUG DRV_NAME ": %s: set bus master\n",
89 			       pci_name(dev));
90 		pci_set_master(dev);
91 	} else if (dev->is_busmaster && !is_master_cmd(value)) {
92 		if (unlikely(verbose_request))
93 			printk(KERN_DEBUG DRV_NAME ": %s: clear bus master\n",
94 			       pci_name(dev));
95 		pci_clear_master(dev);
96 	}
97 
98 	if (!(cmd->val & PCI_COMMAND_INVALIDATE) &&
99 	    (value & PCI_COMMAND_INVALIDATE)) {
100 		if (unlikely(verbose_request))
101 			printk(KERN_DEBUG
102 			       DRV_NAME ": %s: enable memory-write-invalidate\n",
103 			       pci_name(dev));
104 		err = pci_set_mwi(dev);
105 		if (err) {
106 			pr_warn("%s: cannot enable memory-write-invalidate (%d)\n",
107 				pci_name(dev), err);
108 			value &= ~PCI_COMMAND_INVALIDATE;
109 		}
110 	} else if ((cmd->val & PCI_COMMAND_INVALIDATE) &&
111 		   !(value & PCI_COMMAND_INVALIDATE)) {
112 		if (unlikely(verbose_request))
113 			printk(KERN_DEBUG
114 			       DRV_NAME ": %s: disable memory-write-invalidate\n",
115 			       pci_name(dev));
116 		pci_clear_mwi(dev);
117 	}
118 
119 	cmd->val = value;
120 
121 	if (!xen_pcibk_permissive && (!dev_data || !dev_data->permissive))
122 		return 0;
123 
124 	/* Only allow the guest to control certain bits. */
125 	err = pci_read_config_word(dev, offset, &val);
126 	if (err || val == value)
127 		return err;
128 
129 	value &= PCI_COMMAND_GUEST;
130 	value |= val & ~PCI_COMMAND_GUEST;
131 
132 	return pci_write_config_word(dev, offset, value);
133 }
134 
135 static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data)
136 {
137 	struct pci_bar_info *bar = data;
138 
139 	if (unlikely(!bar)) {
140 		pr_warn(DRV_NAME ": driver data not found for %s\n",
141 		       pci_name(dev));
142 		return XEN_PCI_ERR_op_failed;
143 	}
144 
145 	/* A write to obtain the length must happen as a 32-bit write.
146 	 * This does not (yet) support writing individual bytes
147 	 */
148 	if ((value | ~PCI_ROM_ADDRESS_MASK) == ~0U)
149 		bar->which = 1;
150 	else {
151 		u32 tmpval;
152 		pci_read_config_dword(dev, offset, &tmpval);
153 		if (tmpval != bar->val && value == bar->val) {
154 			/* Allow restoration of bar value. */
155 			pci_write_config_dword(dev, offset, bar->val);
156 		}
157 		bar->which = 0;
158 	}
159 
160 	/* Do we need to support enabling/disabling the rom address here? */
161 
162 	return 0;
163 }
164 
165 /* For the BARs, only allow writes which write ~0 or
166  * the correct resource information
167  * (Needed for when the driver probes the resource usage)
168  */
169 static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
170 {
171 	struct pci_bar_info *bar = data;
172 
173 	if (unlikely(!bar)) {
174 		pr_warn(DRV_NAME ": driver data not found for %s\n",
175 		       pci_name(dev));
176 		return XEN_PCI_ERR_op_failed;
177 	}
178 
179 	/* A write to obtain the length must happen as a 32-bit write.
180 	 * This does not (yet) support writing individual bytes
181 	 */
182 	if (value == ~0)
183 		bar->which = 1;
184 	else {
185 		u32 tmpval;
186 		pci_read_config_dword(dev, offset, &tmpval);
187 		if (tmpval != bar->val && value == bar->val) {
188 			/* Allow restoration of bar value. */
189 			pci_write_config_dword(dev, offset, bar->val);
190 		}
191 		bar->which = 0;
192 	}
193 
194 	return 0;
195 }
196 
197 static int bar_read(struct pci_dev *dev, int offset, u32 * value, void *data)
198 {
199 	struct pci_bar_info *bar = data;
200 
201 	if (unlikely(!bar)) {
202 		pr_warn(DRV_NAME ": driver data not found for %s\n",
203 		       pci_name(dev));
204 		return XEN_PCI_ERR_op_failed;
205 	}
206 
207 	*value = bar->which ? bar->len_val : bar->val;
208 
209 	return 0;
210 }
211 
212 static inline void read_dev_bar(struct pci_dev *dev,
213 				struct pci_bar_info *bar_info, int offset,
214 				u32 len_mask)
215 {
216 	int	pos;
217 	struct resource	*res = dev->resource;
218 
219 	if (offset == PCI_ROM_ADDRESS || offset == PCI_ROM_ADDRESS1)
220 		pos = PCI_ROM_RESOURCE;
221 	else {
222 		pos = (offset - PCI_BASE_ADDRESS_0) / 4;
223 		if (pos && ((res[pos - 1].flags & (PCI_BASE_ADDRESS_SPACE |
224 				PCI_BASE_ADDRESS_MEM_TYPE_MASK)) ==
225 			   (PCI_BASE_ADDRESS_SPACE_MEMORY |
226 				PCI_BASE_ADDRESS_MEM_TYPE_64))) {
227 			bar_info->val = res[pos - 1].start >> 32;
228 			bar_info->len_val = -resource_size(&res[pos - 1]) >> 32;
229 			return;
230 		}
231 	}
232 
233 	if (!res[pos].flags ||
234 	    (res[pos].flags & (IORESOURCE_DISABLED | IORESOURCE_UNSET |
235 			       IORESOURCE_BUSY)))
236 		return;
237 
238 	bar_info->val = res[pos].start |
239 			(res[pos].flags & PCI_REGION_FLAG_MASK);
240 	bar_info->len_val = -resource_size(&res[pos]) |
241 			    (res[pos].flags & PCI_REGION_FLAG_MASK);
242 }
243 
244 static void *bar_init(struct pci_dev *dev, int offset)
245 {
246 	struct pci_bar_info *bar = kzalloc(sizeof(*bar), GFP_KERNEL);
247 
248 	if (!bar)
249 		return ERR_PTR(-ENOMEM);
250 
251 	read_dev_bar(dev, bar, offset, ~0);
252 
253 	return bar;
254 }
255 
256 static void *rom_init(struct pci_dev *dev, int offset)
257 {
258 	struct pci_bar_info *bar = kzalloc(sizeof(*bar), GFP_KERNEL);
259 
260 	if (!bar)
261 		return ERR_PTR(-ENOMEM);
262 
263 	read_dev_bar(dev, bar, offset, ~PCI_ROM_ADDRESS_ENABLE);
264 
265 	return bar;
266 }
267 
268 static void bar_reset(struct pci_dev *dev, int offset, void *data)
269 {
270 	struct pci_bar_info *bar = data;
271 
272 	bar->which = 0;
273 }
274 
275 static void bar_release(struct pci_dev *dev, int offset, void *data)
276 {
277 	kfree(data);
278 }
279 
280 static int xen_pcibk_read_vendor(struct pci_dev *dev, int offset,
281 			       u16 *value, void *data)
282 {
283 	*value = dev->vendor;
284 
285 	return 0;
286 }
287 
288 static int xen_pcibk_read_device(struct pci_dev *dev, int offset,
289 			       u16 *value, void *data)
290 {
291 	*value = dev->device;
292 
293 	return 0;
294 }
295 
296 static int interrupt_read(struct pci_dev *dev, int offset, u8 * value,
297 			  void *data)
298 {
299 	*value = (u8) dev->irq;
300 
301 	return 0;
302 }
303 
304 static int bist_write(struct pci_dev *dev, int offset, u8 value, void *data)
305 {
306 	u8 cur_value;
307 	int err;
308 
309 	err = pci_read_config_byte(dev, offset, &cur_value);
310 	if (err)
311 		goto out;
312 
313 	if ((cur_value & ~PCI_BIST_START) == (value & ~PCI_BIST_START)
314 	    || value == PCI_BIST_START)
315 		err = pci_write_config_byte(dev, offset, value);
316 
317 out:
318 	return err;
319 }
320 
321 static const struct config_field header_common[] = {
322 	{
323 	 .offset    = PCI_VENDOR_ID,
324 	 .size      = 2,
325 	 .u.w.read  = xen_pcibk_read_vendor,
326 	},
327 	{
328 	 .offset    = PCI_DEVICE_ID,
329 	 .size      = 2,
330 	 .u.w.read  = xen_pcibk_read_device,
331 	},
332 	{
333 	 .offset    = PCI_COMMAND,
334 	 .size      = 2,
335 	 .init      = command_init,
336 	 .release   = bar_release,
337 	 .u.w.read  = command_read,
338 	 .u.w.write = command_write,
339 	},
340 	{
341 	 .offset    = PCI_INTERRUPT_LINE,
342 	 .size      = 1,
343 	 .u.b.read  = interrupt_read,
344 	},
345 	{
346 	 .offset    = PCI_INTERRUPT_PIN,
347 	 .size      = 1,
348 	 .u.b.read  = xen_pcibk_read_config_byte,
349 	},
350 	{
351 	 /* Any side effects of letting driver domain control cache line? */
352 	 .offset    = PCI_CACHE_LINE_SIZE,
353 	 .size      = 1,
354 	 .u.b.read  = xen_pcibk_read_config_byte,
355 	 .u.b.write = xen_pcibk_write_config_byte,
356 	},
357 	{
358 	 .offset    = PCI_LATENCY_TIMER,
359 	 .size      = 1,
360 	 .u.b.read  = xen_pcibk_read_config_byte,
361 	},
362 	{
363 	 .offset    = PCI_BIST,
364 	 .size      = 1,
365 	 .u.b.read  = xen_pcibk_read_config_byte,
366 	 .u.b.write = bist_write,
367 	},
368 	{}
369 };
370 
371 #define CFG_FIELD_BAR(reg_offset)			\
372 	{						\
373 	.offset     = reg_offset,			\
374 	.size       = 4,				\
375 	.init       = bar_init,				\
376 	.reset      = bar_reset,			\
377 	.release    = bar_release,			\
378 	.u.dw.read  = bar_read,				\
379 	.u.dw.write = bar_write,			\
380 	}
381 
382 #define CFG_FIELD_ROM(reg_offset)			\
383 	{						\
384 	.offset     = reg_offset,			\
385 	.size       = 4,				\
386 	.init       = rom_init,				\
387 	.reset      = bar_reset,			\
388 	.release    = bar_release,			\
389 	.u.dw.read  = bar_read,				\
390 	.u.dw.write = rom_write,			\
391 	}
392 
393 static const struct config_field header_0[] = {
394 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_0),
395 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_1),
396 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_2),
397 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_3),
398 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_4),
399 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_5),
400 	CFG_FIELD_ROM(PCI_ROM_ADDRESS),
401 	{}
402 };
403 
404 static const struct config_field header_1[] = {
405 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_0),
406 	CFG_FIELD_BAR(PCI_BASE_ADDRESS_1),
407 	CFG_FIELD_ROM(PCI_ROM_ADDRESS1),
408 	{}
409 };
410 
411 int xen_pcibk_config_header_add_fields(struct pci_dev *dev)
412 {
413 	int err;
414 
415 	err = xen_pcibk_config_add_fields(dev, header_common);
416 	if (err)
417 		goto out;
418 
419 	switch (dev->hdr_type) {
420 	case PCI_HEADER_TYPE_NORMAL:
421 		err = xen_pcibk_config_add_fields(dev, header_0);
422 		break;
423 
424 	case PCI_HEADER_TYPE_BRIDGE:
425 		err = xen_pcibk_config_add_fields(dev, header_1);
426 		break;
427 
428 	default:
429 		err = -EINVAL;
430 		pr_err("%s: Unsupported header type %d!\n",
431 		       pci_name(dev), dev->hdr_type);
432 		break;
433 	}
434 
435 out:
436 	return err;
437 }
438