| .. | .. | 
|---|
| 44 | 44 |  struct irq_data; | 
|---|
| 45 | 45 |  struct cpumask; | 
|---|
| 46 | 46 |  struct seq_file; | 
|---|
 | 47 | +struct irq_affinity_desc;  | 
|---|
| 47 | 48 |   | 
|---|
| 48 | 49 |  /* Number of irqs reserved for a legacy isa controller */ | 
|---|
| 49 | 50 |  #define NUM_ISA_INTERRUPTS	16 | 
|---|
| .. | .. | 
|---|
| 76 | 77 |  enum irq_domain_bus_token { | 
|---|
| 77 | 78 |  	DOMAIN_BUS_ANY		= 0, | 
|---|
| 78 | 79 |  	DOMAIN_BUS_WIRED, | 
|---|
 | 80 | +	DOMAIN_BUS_GENERIC_MSI,  | 
|---|
| 79 | 81 |  	DOMAIN_BUS_PCI_MSI, | 
|---|
| 80 | 82 |  	DOMAIN_BUS_PLATFORM_MSI, | 
|---|
| 81 | 83 |  	DOMAIN_BUS_NEXUS, | 
|---|
| 82 | 84 |  	DOMAIN_BUS_IPI, | 
|---|
| 83 | 85 |  	DOMAIN_BUS_FSL_MC_MSI, | 
|---|
 | 86 | +	DOMAIN_BUS_TI_SCI_INTA_MSI,  | 
|---|
| 84 | 87 |  	DOMAIN_BUS_WAKEUP, | 
|---|
 | 88 | +	DOMAIN_BUS_VMD_MSI,  | 
|---|
| 85 | 89 |  }; | 
|---|
| 86 | 90 |   | 
|---|
| 87 | 91 |  /** | 
|---|
| .. | .. | 
|---|
| 231 | 235 |   | 
|---|
| 232 | 236 |  #ifdef CONFIG_IRQ_DOMAIN | 
|---|
| 233 | 237 |  struct fwnode_handle *__irq_domain_alloc_fwnode(unsigned int type, int id, | 
|---|
| 234 |  | -						const char *name, void *data);  | 
|---|
 | 238 | +						const char *name, phys_addr_t *pa);  | 
|---|
| 235 | 239 |   | 
|---|
| 236 | 240 |  enum { | 
|---|
| 237 | 241 |  	IRQCHIP_FWNODE_REAL, | 
|---|
| .. | .. | 
|---|
| 252 | 256 |  					 NULL); | 
|---|
| 253 | 257 |  } | 
|---|
| 254 | 258 |   | 
|---|
| 255 |  | -static inline struct fwnode_handle *irq_domain_alloc_fwnode(void *data)  | 
|---|
 | 259 | +static inline struct fwnode_handle *irq_domain_alloc_fwnode(phys_addr_t *pa)  | 
|---|
| 256 | 260 |  { | 
|---|
| 257 |  | -	return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_REAL, 0, NULL, data);  | 
|---|
 | 261 | +	return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_REAL, 0, NULL, pa);  | 
|---|
| 258 | 262 |  } | 
|---|
| 259 | 263 |   | 
|---|
| 260 | 264 |  void irq_domain_free_fwnode(struct fwnode_handle *fwnode); | 
|---|
 | 265 | +#ifdef __GENKSYMS__	/* Android KABI hack to preserve CRC checker */  | 
|---|
| 261 | 266 |  struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size, | 
|---|
 | 267 | +#else  | 
|---|
 | 268 | +struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, unsigned int size,  | 
|---|
 | 269 | +#endif  | 
|---|
| 262 | 270 |  				    irq_hw_number_t hwirq_max, int direct_max, | 
|---|
| 263 | 271 |  				    const struct irq_domain_ops *ops, | 
|---|
| 264 | 272 |  				    void *host_data); | 
|---|
| .. | .. | 
|---|
| 277 | 285 |  						   enum irq_domain_bus_token bus_token); | 
|---|
| 278 | 286 |  extern bool irq_domain_check_msi_remap(void); | 
|---|
| 279 | 287 |  extern void irq_set_default_host(struct irq_domain *host); | 
|---|
 | 288 | +extern struct irq_domain *irq_get_default_host(void);  | 
|---|
| 280 | 289 |  extern int irq_domain_alloc_descs(int virq, unsigned int nr_irqs, | 
|---|
| 281 | 290 |  				  irq_hw_number_t hwirq, int node, | 
|---|
| 282 |  | -				  const struct cpumask *affinity);  | 
|---|
 | 291 | +				  const struct irq_affinity_desc *affinity);  | 
|---|
| 283 | 292 |   | 
|---|
| 284 | 293 |  static inline struct fwnode_handle *of_node_to_fwnode(struct device_node *node) | 
|---|
| 285 | 294 |  { | 
|---|
| .. | .. | 
|---|
| 385 | 394 |  extern void irq_domain_disassociate(struct irq_domain *domain, | 
|---|
| 386 | 395 |  				    unsigned int irq); | 
|---|
| 387 | 396 |   | 
|---|
| 388 |  | -extern unsigned int irq_create_mapping(struct irq_domain *host,  | 
|---|
| 389 |  | -				       irq_hw_number_t hwirq);  | 
|---|
 | 397 | +extern unsigned int irq_create_mapping_affinity(struct irq_domain *host,  | 
|---|
 | 398 | +				      irq_hw_number_t hwirq,  | 
|---|
 | 399 | +				      const struct irq_affinity_desc *affinity);  | 
|---|
| 390 | 400 |  extern unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec); | 
|---|
| 391 | 401 |  extern void irq_dispose_mapping(unsigned int virq); | 
|---|
 | 402 | +  | 
|---|
 | 403 | +static inline unsigned int irq_create_mapping(struct irq_domain *host,  | 
|---|
 | 404 | +					      irq_hw_number_t hwirq)  | 
|---|
 | 405 | +{  | 
|---|
 | 406 | +	return irq_create_mapping_affinity(host, hwirq, NULL);  | 
|---|
 | 407 | +}  | 
|---|
 | 408 | +  | 
|---|
| 392 | 409 |   | 
|---|
| 393 | 410 |  /** | 
|---|
| 394 | 411 |   * irq_linear_revmap() - Find a linux irq from a hw irq number. | 
|---|
| .. | .. | 
|---|
| 431 | 448 |  			const u32 *intspec, unsigned int intsize, | 
|---|
| 432 | 449 |  			irq_hw_number_t *out_hwirq, unsigned int *out_type); | 
|---|
| 433 | 450 |   | 
|---|
 | 451 | +int irq_domain_translate_twocell(struct irq_domain *d,  | 
|---|
 | 452 | +				 struct irq_fwspec *fwspec,  | 
|---|
 | 453 | +				 unsigned long *out_hwirq,  | 
|---|
 | 454 | +				 unsigned int *out_type);  | 
|---|
 | 455 | +  | 
|---|
 | 456 | +int irq_domain_translate_onecell(struct irq_domain *d,  | 
|---|
 | 457 | +				 struct irq_fwspec *fwspec,  | 
|---|
 | 458 | +				 unsigned long *out_hwirq,  | 
|---|
 | 459 | +				 unsigned int *out_type);  | 
|---|
 | 460 | +  | 
|---|
| 434 | 461 |  /* IPI functions */ | 
|---|
| 435 | 462 |  int irq_reserve_ipi(struct irq_domain *domain, const struct cpumask *dest); | 
|---|
| 436 | 463 |  int irq_destroy_ipi(unsigned int irq, const struct cpumask *dest); | 
|---|
| .. | .. | 
|---|
| 442 | 469 |  				irq_hw_number_t hwirq, struct irq_chip *chip, | 
|---|
| 443 | 470 |  				void *chip_data, irq_flow_handler_t handler, | 
|---|
| 444 | 471 |  				void *handler_data, const char *handler_name); | 
|---|
 | 472 | +extern void irq_domain_reset_irq_data(struct irq_data *irq_data);  | 
|---|
| 445 | 473 |  #ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY | 
|---|
| 446 | 474 |  extern struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent, | 
|---|
| 447 | 475 |  			unsigned int flags, unsigned int size, | 
|---|
| .. | .. | 
|---|
| 462 | 490 |   | 
|---|
| 463 | 491 |  extern int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, | 
|---|
| 464 | 492 |  				   unsigned int nr_irqs, int node, void *arg, | 
|---|
| 465 |  | -				   bool realloc, const struct cpumask *affinity);  | 
|---|
 | 493 | +				   bool realloc,  | 
|---|
 | 494 | +				   const struct irq_affinity_desc *affinity);  | 
|---|
| 466 | 495 |  extern void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs); | 
|---|
| 467 | 496 |  extern int irq_domain_activate_irq(struct irq_data *irq_data, bool early); | 
|---|
| 468 | 497 |  extern void irq_domain_deactivate_irq(struct irq_data *irq_data); | 
|---|
| .. | .. | 
|---|
| 482 | 511 |  					 irq_hw_number_t hwirq, | 
|---|
| 483 | 512 |  					 struct irq_chip *chip, | 
|---|
| 484 | 513 |  					 void *chip_data); | 
|---|
| 485 |  | -extern void irq_domain_reset_irq_data(struct irq_data *irq_data);  | 
|---|
| 486 | 514 |  extern void irq_domain_free_irqs_common(struct irq_domain *domain, | 
|---|
| 487 | 515 |  					unsigned int virq, | 
|---|
| 488 | 516 |  					unsigned int nr_irqs); | 
|---|
| .. | .. | 
|---|
| 500 | 528 |  					unsigned int irq_base, | 
|---|
| 501 | 529 |  					unsigned int nr_irqs); | 
|---|
| 502 | 530 |   | 
|---|
 | 531 | +extern int irq_domain_disconnect_hierarchy(struct irq_domain *domain,  | 
|---|
 | 532 | +					   unsigned int virq);  | 
|---|
 | 533 | +  | 
|---|
| 503 | 534 |  static inline bool irq_domain_is_hierarchy(struct irq_domain *domain) | 
|---|
| 504 | 535 |  { | 
|---|
| 505 | 536 |  	return domain->flags & IRQ_DOMAIN_FLAG_HIERARCHY; | 
|---|