rsparser.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. /*
  2. * pnpacpi -- PnP ACPI driver
  3. *
  4. * Copyright (c) 2004 Matthieu Castet <castet.matthieu@free.fr>
  5. * Copyright (c) 2004 Li Shaohua <shaohua.li@intel.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the
  9. * Free Software Foundation; either version 2, or (at your option) any
  10. * later version.
  11. *
  12. * This program is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. */
  21. #include <linux/kernel.h>
  22. #include <linux/acpi.h>
  23. #include <linux/pci.h>
  24. #include <linux/pnp.h>
  25. #include "../base.h"
  26. #include "pnpacpi.h"
  27. #ifdef CONFIG_IA64
  28. #define valid_IRQ(i) (1)
  29. #else
  30. #define valid_IRQ(i) (((i) != 0) && ((i) != 2))
  31. #endif
  32. /*
  33. * Allocated Resources
  34. */
  35. static int irq_flags(int triggering, int polarity, int shareable)
  36. {
  37. int flags;
  38. if (triggering == ACPI_LEVEL_SENSITIVE) {
  39. if (polarity == ACPI_ACTIVE_LOW)
  40. flags = IORESOURCE_IRQ_LOWLEVEL;
  41. else
  42. flags = IORESOURCE_IRQ_HIGHLEVEL;
  43. } else {
  44. if (polarity == ACPI_ACTIVE_LOW)
  45. flags = IORESOURCE_IRQ_LOWEDGE;
  46. else
  47. flags = IORESOURCE_IRQ_HIGHEDGE;
  48. }
  49. if (shareable)
  50. flags |= IORESOURCE_IRQ_SHAREABLE;
  51. return flags;
  52. }
  53. static void decode_irq_flags(int flag, int *triggering, int *polarity)
  54. {
  55. switch (flag) {
  56. case IORESOURCE_IRQ_LOWLEVEL:
  57. *triggering = ACPI_LEVEL_SENSITIVE;
  58. *polarity = ACPI_ACTIVE_LOW;
  59. break;
  60. case IORESOURCE_IRQ_HIGHLEVEL:
  61. *triggering = ACPI_LEVEL_SENSITIVE;
  62. *polarity = ACPI_ACTIVE_HIGH;
  63. break;
  64. case IORESOURCE_IRQ_LOWEDGE:
  65. *triggering = ACPI_EDGE_SENSITIVE;
  66. *polarity = ACPI_ACTIVE_LOW;
  67. break;
  68. case IORESOURCE_IRQ_HIGHEDGE:
  69. *triggering = ACPI_EDGE_SENSITIVE;
  70. *polarity = ACPI_ACTIVE_HIGH;
  71. break;
  72. }
  73. }
  74. static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev,
  75. u32 gsi, int triggering,
  76. int polarity, int shareable)
  77. {
  78. int irq, flags;
  79. int p, t;
  80. if (!valid_IRQ(gsi))
  81. return;
  82. /*
  83. * in IO-APIC mode, use overrided attribute. Two reasons:
  84. * 1. BIOS bug in DSDT
  85. * 2. BIOS uses IO-APIC mode Interrupt Source Override
  86. */
  87. if (!acpi_get_override_irq(gsi, &t, &p)) {
  88. t = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE;
  89. p = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH;
  90. if (triggering != t || polarity != p) {
  91. dev_warn(&dev->dev, "IRQ %d override to %s, %s\n",
  92. gsi, t ? "edge":"level", p ? "low":"high");
  93. triggering = t;
  94. polarity = p;
  95. }
  96. }
  97. flags = irq_flags(triggering, polarity, shareable);
  98. irq = acpi_register_gsi(gsi, triggering, polarity);
  99. if (irq >= 0)
  100. pcibios_penalize_isa_irq(irq, 1);
  101. else
  102. flags |= IORESOURCE_DISABLED;
  103. pnp_add_irq_resource(dev, irq, flags);
  104. }
  105. static int dma_flags(int type, int bus_master, int transfer)
  106. {
  107. int flags = 0;
  108. if (bus_master)
  109. flags |= IORESOURCE_DMA_MASTER;
  110. switch (type) {
  111. case ACPI_COMPATIBILITY:
  112. flags |= IORESOURCE_DMA_COMPATIBLE;
  113. break;
  114. case ACPI_TYPE_A:
  115. flags |= IORESOURCE_DMA_TYPEA;
  116. break;
  117. case ACPI_TYPE_B:
  118. flags |= IORESOURCE_DMA_TYPEB;
  119. break;
  120. case ACPI_TYPE_F:
  121. flags |= IORESOURCE_DMA_TYPEF;
  122. break;
  123. default:
  124. /* Set a default value ? */
  125. flags |= IORESOURCE_DMA_COMPATIBLE;
  126. pnp_err("Invalid DMA type");
  127. }
  128. switch (transfer) {
  129. case ACPI_TRANSFER_8:
  130. flags |= IORESOURCE_DMA_8BIT;
  131. break;
  132. case ACPI_TRANSFER_8_16:
  133. flags |= IORESOURCE_DMA_8AND16BIT;
  134. break;
  135. case ACPI_TRANSFER_16:
  136. flags |= IORESOURCE_DMA_16BIT;
  137. break;
  138. default:
  139. /* Set a default value ? */
  140. flags |= IORESOURCE_DMA_8AND16BIT;
  141. pnp_err("Invalid DMA transfer type");
  142. }
  143. return flags;
  144. }
  145. static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start,
  146. u64 len, int io_decode)
  147. {
  148. int flags = 0;
  149. u64 end = start + len - 1;
  150. if (io_decode == ACPI_DECODE_16)
  151. flags |= PNP_PORT_FLAG_16BITADDR;
  152. if (len == 0 || end >= 0x10003)
  153. flags |= IORESOURCE_DISABLED;
  154. pnp_add_io_resource(dev, start, end, flags);
  155. }
  156. static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev,
  157. u64 start, u64 len,
  158. int write_protect)
  159. {
  160. int flags = 0;
  161. u64 end = start + len - 1;
  162. if (len == 0)
  163. flags |= IORESOURCE_DISABLED;
  164. if (write_protect == ACPI_READ_WRITE_MEMORY)
  165. flags |= IORESOURCE_MEM_WRITEABLE;
  166. pnp_add_mem_resource(dev, start, end, flags);
  167. }
  168. static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev,
  169. struct acpi_resource *res)
  170. {
  171. struct acpi_resource_address64 addr, *p = &addr;
  172. acpi_status status;
  173. status = acpi_resource_to_address64(res, p);
  174. if (!ACPI_SUCCESS(status)) {
  175. dev_warn(&dev->dev, "failed to convert resource type %d\n",
  176. res->type);
  177. return;
  178. }
  179. if (p->producer_consumer == ACPI_PRODUCER)
  180. return;
  181. if (p->resource_type == ACPI_MEMORY_RANGE)
  182. pnpacpi_parse_allocated_memresource(dev,
  183. p->minimum, p->address_length,
  184. p->info.mem.write_protect);
  185. else if (p->resource_type == ACPI_IO_RANGE)
  186. pnpacpi_parse_allocated_ioresource(dev,
  187. p->minimum, p->address_length,
  188. p->granularity == 0xfff ? ACPI_DECODE_10 :
  189. ACPI_DECODE_16);
  190. }
  191. static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
  192. void *data)
  193. {
  194. struct pnp_dev *dev = data;
  195. struct acpi_resource_irq *irq;
  196. struct acpi_resource_dma *dma;
  197. struct acpi_resource_io *io;
  198. struct acpi_resource_fixed_io *fixed_io;
  199. struct acpi_resource_memory24 *memory24;
  200. struct acpi_resource_memory32 *memory32;
  201. struct acpi_resource_fixed_memory32 *fixed_memory32;
  202. struct acpi_resource_extended_irq *extended_irq;
  203. int i, flags;
  204. switch (res->type) {
  205. case ACPI_RESOURCE_TYPE_IRQ:
  206. /*
  207. * Per spec, only one interrupt per descriptor is allowed in
  208. * _CRS, but some firmware violates this, so parse them all.
  209. */
  210. irq = &res->data.irq;
  211. for (i = 0; i < irq->interrupt_count; i++) {
  212. pnpacpi_parse_allocated_irqresource(dev,
  213. irq->interrupts[i],
  214. irq->triggering,
  215. irq->polarity,
  216. irq->sharable);
  217. }
  218. break;
  219. case ACPI_RESOURCE_TYPE_DMA:
  220. dma = &res->data.dma;
  221. if (dma->channel_count > 0) {
  222. flags = dma_flags(dma->type, dma->bus_master,
  223. dma->transfer);
  224. if (dma->channels[0] == (u8) -1)
  225. flags |= IORESOURCE_DISABLED;
  226. pnp_add_dma_resource(dev, dma->channels[0], flags);
  227. }
  228. break;
  229. case ACPI_RESOURCE_TYPE_IO:
  230. io = &res->data.io;
  231. pnpacpi_parse_allocated_ioresource(dev,
  232. io->minimum,
  233. io->address_length,
  234. io->io_decode);
  235. break;
  236. case ACPI_RESOURCE_TYPE_START_DEPENDENT:
  237. case ACPI_RESOURCE_TYPE_END_DEPENDENT:
  238. break;
  239. case ACPI_RESOURCE_TYPE_FIXED_IO:
  240. fixed_io = &res->data.fixed_io;
  241. pnpacpi_parse_allocated_ioresource(dev,
  242. fixed_io->address,
  243. fixed_io->address_length,
  244. ACPI_DECODE_10);
  245. break;
  246. case ACPI_RESOURCE_TYPE_VENDOR:
  247. break;
  248. case ACPI_RESOURCE_TYPE_END_TAG:
  249. break;
  250. case ACPI_RESOURCE_TYPE_MEMORY24:
  251. memory24 = &res->data.memory24;
  252. pnpacpi_parse_allocated_memresource(dev,
  253. memory24->minimum,
  254. memory24->address_length,
  255. memory24->write_protect);
  256. break;
  257. case ACPI_RESOURCE_TYPE_MEMORY32:
  258. memory32 = &res->data.memory32;
  259. pnpacpi_parse_allocated_memresource(dev,
  260. memory32->minimum,
  261. memory32->address_length,
  262. memory32->write_protect);
  263. break;
  264. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  265. fixed_memory32 = &res->data.fixed_memory32;
  266. pnpacpi_parse_allocated_memresource(dev,
  267. fixed_memory32->address,
  268. fixed_memory32->address_length,
  269. fixed_memory32->write_protect);
  270. break;
  271. case ACPI_RESOURCE_TYPE_ADDRESS16:
  272. case ACPI_RESOURCE_TYPE_ADDRESS32:
  273. case ACPI_RESOURCE_TYPE_ADDRESS64:
  274. pnpacpi_parse_allocated_address_space(dev, res);
  275. break;
  276. case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
  277. if (res->data.ext_address64.producer_consumer == ACPI_PRODUCER)
  278. return AE_OK;
  279. break;
  280. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  281. extended_irq = &res->data.extended_irq;
  282. if (extended_irq->producer_consumer == ACPI_PRODUCER)
  283. return AE_OK;
  284. for (i = 0; i < extended_irq->interrupt_count; i++) {
  285. pnpacpi_parse_allocated_irqresource(dev,
  286. extended_irq->interrupts[i],
  287. extended_irq->triggering,
  288. extended_irq->polarity,
  289. extended_irq->sharable);
  290. }
  291. break;
  292. case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
  293. break;
  294. default:
  295. dev_warn(&dev->dev, "unknown resource type %d in _CRS\n",
  296. res->type);
  297. return AE_ERROR;
  298. }
  299. return AE_OK;
  300. }
  301. int pnpacpi_parse_allocated_resource(struct pnp_dev *dev)
  302. {
  303. acpi_handle handle = dev->data;
  304. acpi_status status;
  305. dev_dbg(&dev->dev, "parse allocated resources\n");
  306. pnp_init_resources(dev);
  307. status = acpi_walk_resources(handle, METHOD_NAME__CRS,
  308. pnpacpi_allocated_resource, dev);
  309. if (ACPI_FAILURE(status)) {
  310. if (status != AE_NOT_FOUND)
  311. dev_err(&dev->dev, "can't evaluate _CRS: %d", status);
  312. return -EPERM;
  313. }
  314. return 0;
  315. }
  316. static __init void pnpacpi_parse_dma_option(struct pnp_dev *dev,
  317. struct pnp_option *option,
  318. struct acpi_resource_dma *p)
  319. {
  320. int i;
  321. struct pnp_dma *dma;
  322. if (p->channel_count == 0)
  323. return;
  324. dma = kzalloc(sizeof(struct pnp_dma), GFP_KERNEL);
  325. if (!dma)
  326. return;
  327. for (i = 0; i < p->channel_count; i++)
  328. dma->map |= 1 << p->channels[i];
  329. dma->flags = dma_flags(p->type, p->bus_master, p->transfer);
  330. pnp_register_dma_resource(dev, option, dma);
  331. }
  332. static __init void pnpacpi_parse_irq_option(struct pnp_dev *dev,
  333. struct pnp_option *option,
  334. struct acpi_resource_irq *p)
  335. {
  336. int i;
  337. struct pnp_irq *irq;
  338. if (p->interrupt_count == 0)
  339. return;
  340. irq = kzalloc(sizeof(struct pnp_irq), GFP_KERNEL);
  341. if (!irq)
  342. return;
  343. for (i = 0; i < p->interrupt_count; i++)
  344. if (p->interrupts[i])
  345. __set_bit(p->interrupts[i], irq->map);
  346. irq->flags = irq_flags(p->triggering, p->polarity, p->sharable);
  347. pnp_register_irq_resource(dev, option, irq);
  348. }
  349. static __init void pnpacpi_parse_ext_irq_option(struct pnp_dev *dev,
  350. struct pnp_option *option,
  351. struct acpi_resource_extended_irq *p)
  352. {
  353. int i;
  354. struct pnp_irq *irq;
  355. if (p->interrupt_count == 0)
  356. return;
  357. irq = kzalloc(sizeof(struct pnp_irq), GFP_KERNEL);
  358. if (!irq)
  359. return;
  360. for (i = 0; i < p->interrupt_count; i++)
  361. if (p->interrupts[i])
  362. __set_bit(p->interrupts[i], irq->map);
  363. irq->flags = irq_flags(p->triggering, p->polarity, p->sharable);
  364. pnp_register_irq_resource(dev, option, irq);
  365. }
  366. static __init void pnpacpi_parse_port_option(struct pnp_dev *dev,
  367. struct pnp_option *option,
  368. struct acpi_resource_io *io)
  369. {
  370. struct pnp_port *port;
  371. if (io->address_length == 0)
  372. return;
  373. port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
  374. if (!port)
  375. return;
  376. port->min = io->minimum;
  377. port->max = io->maximum;
  378. port->align = io->alignment;
  379. port->size = io->address_length;
  380. port->flags = ACPI_DECODE_16 == io->io_decode ?
  381. PNP_PORT_FLAG_16BITADDR : 0;
  382. pnp_register_port_resource(dev, option, port);
  383. }
  384. static __init void pnpacpi_parse_fixed_port_option(struct pnp_dev *dev,
  385. struct pnp_option *option,
  386. struct acpi_resource_fixed_io *io)
  387. {
  388. struct pnp_port *port;
  389. if (io->address_length == 0)
  390. return;
  391. port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
  392. if (!port)
  393. return;
  394. port->min = port->max = io->address;
  395. port->size = io->address_length;
  396. port->align = 0;
  397. port->flags = PNP_PORT_FLAG_FIXED;
  398. pnp_register_port_resource(dev, option, port);
  399. }
  400. static __init void pnpacpi_parse_mem24_option(struct pnp_dev *dev,
  401. struct pnp_option *option,
  402. struct acpi_resource_memory24 *p)
  403. {
  404. struct pnp_mem *mem;
  405. if (p->address_length == 0)
  406. return;
  407. mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
  408. if (!mem)
  409. return;
  410. mem->min = p->minimum;
  411. mem->max = p->maximum;
  412. mem->align = p->alignment;
  413. mem->size = p->address_length;
  414. mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
  415. IORESOURCE_MEM_WRITEABLE : 0;
  416. pnp_register_mem_resource(dev, option, mem);
  417. }
  418. static __init void pnpacpi_parse_mem32_option(struct pnp_dev *dev,
  419. struct pnp_option *option,
  420. struct acpi_resource_memory32 *p)
  421. {
  422. struct pnp_mem *mem;
  423. if (p->address_length == 0)
  424. return;
  425. mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
  426. if (!mem)
  427. return;
  428. mem->min = p->minimum;
  429. mem->max = p->maximum;
  430. mem->align = p->alignment;
  431. mem->size = p->address_length;
  432. mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
  433. IORESOURCE_MEM_WRITEABLE : 0;
  434. pnp_register_mem_resource(dev, option, mem);
  435. }
  436. static __init void pnpacpi_parse_fixed_mem32_option(struct pnp_dev *dev,
  437. struct pnp_option *option,
  438. struct acpi_resource_fixed_memory32 *p)
  439. {
  440. struct pnp_mem *mem;
  441. if (p->address_length == 0)
  442. return;
  443. mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
  444. if (!mem)
  445. return;
  446. mem->min = mem->max = p->address;
  447. mem->size = p->address_length;
  448. mem->align = 0;
  449. mem->flags = (ACPI_READ_WRITE_MEMORY == p->write_protect) ?
  450. IORESOURCE_MEM_WRITEABLE : 0;
  451. pnp_register_mem_resource(dev, option, mem);
  452. }
  453. static __init void pnpacpi_parse_address_option(struct pnp_dev *dev,
  454. struct pnp_option *option,
  455. struct acpi_resource *r)
  456. {
  457. struct acpi_resource_address64 addr, *p = &addr;
  458. acpi_status status;
  459. struct pnp_mem *mem;
  460. struct pnp_port *port;
  461. status = acpi_resource_to_address64(r, p);
  462. if (!ACPI_SUCCESS(status)) {
  463. pnp_warn("PnPACPI: failed to convert resource type %d",
  464. r->type);
  465. return;
  466. }
  467. if (p->address_length == 0)
  468. return;
  469. if (p->resource_type == ACPI_MEMORY_RANGE) {
  470. mem = kzalloc(sizeof(struct pnp_mem), GFP_KERNEL);
  471. if (!mem)
  472. return;
  473. mem->min = mem->max = p->minimum;
  474. mem->size = p->address_length;
  475. mem->align = 0;
  476. mem->flags = (p->info.mem.write_protect ==
  477. ACPI_READ_WRITE_MEMORY) ? IORESOURCE_MEM_WRITEABLE
  478. : 0;
  479. pnp_register_mem_resource(dev, option, mem);
  480. } else if (p->resource_type == ACPI_IO_RANGE) {
  481. port = kzalloc(sizeof(struct pnp_port), GFP_KERNEL);
  482. if (!port)
  483. return;
  484. port->min = port->max = p->minimum;
  485. port->size = p->address_length;
  486. port->align = 0;
  487. port->flags = PNP_PORT_FLAG_FIXED;
  488. pnp_register_port_resource(dev, option, port);
  489. }
  490. }
  491. struct acpipnp_parse_option_s {
  492. struct pnp_option *option;
  493. struct pnp_option *option_independent;
  494. struct pnp_dev *dev;
  495. };
  496. static __init acpi_status pnpacpi_option_resource(struct acpi_resource *res,
  497. void *data)
  498. {
  499. int priority = 0;
  500. struct acpipnp_parse_option_s *parse_data = data;
  501. struct pnp_dev *dev = parse_data->dev;
  502. struct pnp_option *option = parse_data->option;
  503. switch (res->type) {
  504. case ACPI_RESOURCE_TYPE_IRQ:
  505. pnpacpi_parse_irq_option(dev, option, &res->data.irq);
  506. break;
  507. case ACPI_RESOURCE_TYPE_DMA:
  508. pnpacpi_parse_dma_option(dev, option, &res->data.dma);
  509. break;
  510. case ACPI_RESOURCE_TYPE_START_DEPENDENT:
  511. switch (res->data.start_dpf.compatibility_priority) {
  512. case ACPI_GOOD_CONFIGURATION:
  513. priority = PNP_RES_PRIORITY_PREFERRED;
  514. break;
  515. case ACPI_ACCEPTABLE_CONFIGURATION:
  516. priority = PNP_RES_PRIORITY_ACCEPTABLE;
  517. break;
  518. case ACPI_SUB_OPTIMAL_CONFIGURATION:
  519. priority = PNP_RES_PRIORITY_FUNCTIONAL;
  520. break;
  521. default:
  522. priority = PNP_RES_PRIORITY_INVALID;
  523. break;
  524. }
  525. /* TBD: Consider performance/robustness bits */
  526. option = pnp_register_dependent_option(dev, priority);
  527. if (!option)
  528. return AE_ERROR;
  529. parse_data->option = option;
  530. break;
  531. case ACPI_RESOURCE_TYPE_END_DEPENDENT:
  532. /*only one EndDependentFn is allowed */
  533. if (!parse_data->option_independent) {
  534. dev_warn(&dev->dev, "more than one EndDependentFn "
  535. "in _PRS\n");
  536. return AE_ERROR;
  537. }
  538. parse_data->option = parse_data->option_independent;
  539. parse_data->option_independent = NULL;
  540. dev_dbg(&dev->dev, "end dependent options\n");
  541. break;
  542. case ACPI_RESOURCE_TYPE_IO:
  543. pnpacpi_parse_port_option(dev, option, &res->data.io);
  544. break;
  545. case ACPI_RESOURCE_TYPE_FIXED_IO:
  546. pnpacpi_parse_fixed_port_option(dev, option,
  547. &res->data.fixed_io);
  548. break;
  549. case ACPI_RESOURCE_TYPE_VENDOR:
  550. case ACPI_RESOURCE_TYPE_END_TAG:
  551. break;
  552. case ACPI_RESOURCE_TYPE_MEMORY24:
  553. pnpacpi_parse_mem24_option(dev, option, &res->data.memory24);
  554. break;
  555. case ACPI_RESOURCE_TYPE_MEMORY32:
  556. pnpacpi_parse_mem32_option(dev, option, &res->data.memory32);
  557. break;
  558. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  559. pnpacpi_parse_fixed_mem32_option(dev, option,
  560. &res->data.fixed_memory32);
  561. break;
  562. case ACPI_RESOURCE_TYPE_ADDRESS16:
  563. case ACPI_RESOURCE_TYPE_ADDRESS32:
  564. case ACPI_RESOURCE_TYPE_ADDRESS64:
  565. pnpacpi_parse_address_option(dev, option, res);
  566. break;
  567. case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
  568. break;
  569. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  570. pnpacpi_parse_ext_irq_option(dev, option,
  571. &res->data.extended_irq);
  572. break;
  573. case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
  574. break;
  575. default:
  576. dev_warn(&dev->dev, "unknown resource type %d in _PRS\n",
  577. res->type);
  578. return AE_ERROR;
  579. }
  580. return AE_OK;
  581. }
  582. int __init pnpacpi_parse_resource_option_data(struct pnp_dev *dev)
  583. {
  584. acpi_handle handle = dev->data;
  585. acpi_status status;
  586. struct acpipnp_parse_option_s parse_data;
  587. dev_dbg(&dev->dev, "parse resource options\n");
  588. parse_data.option = pnp_register_independent_option(dev);
  589. if (!parse_data.option)
  590. return -ENOMEM;
  591. parse_data.option_independent = parse_data.option;
  592. parse_data.dev = dev;
  593. status = acpi_walk_resources(handle, METHOD_NAME__PRS,
  594. pnpacpi_option_resource, &parse_data);
  595. if (ACPI_FAILURE(status)) {
  596. if (status != AE_NOT_FOUND)
  597. dev_err(&dev->dev, "can't evaluate _PRS: %d", status);
  598. return -EPERM;
  599. }
  600. return 0;
  601. }
  602. static int pnpacpi_supported_resource(struct acpi_resource *res)
  603. {
  604. switch (res->type) {
  605. case ACPI_RESOURCE_TYPE_IRQ:
  606. case ACPI_RESOURCE_TYPE_DMA:
  607. case ACPI_RESOURCE_TYPE_IO:
  608. case ACPI_RESOURCE_TYPE_FIXED_IO:
  609. case ACPI_RESOURCE_TYPE_MEMORY24:
  610. case ACPI_RESOURCE_TYPE_MEMORY32:
  611. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  612. case ACPI_RESOURCE_TYPE_ADDRESS16:
  613. case ACPI_RESOURCE_TYPE_ADDRESS32:
  614. case ACPI_RESOURCE_TYPE_ADDRESS64:
  615. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  616. return 1;
  617. }
  618. return 0;
  619. }
  620. /*
  621. * Set resource
  622. */
  623. static acpi_status pnpacpi_count_resources(struct acpi_resource *res,
  624. void *data)
  625. {
  626. int *res_cnt = data;
  627. if (pnpacpi_supported_resource(res))
  628. (*res_cnt)++;
  629. return AE_OK;
  630. }
  631. static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data)
  632. {
  633. struct acpi_resource **resource = data;
  634. if (pnpacpi_supported_resource(res)) {
  635. (*resource)->type = res->type;
  636. (*resource)->length = sizeof(struct acpi_resource);
  637. (*resource)++;
  638. }
  639. return AE_OK;
  640. }
  641. int pnpacpi_build_resource_template(struct pnp_dev *dev,
  642. struct acpi_buffer *buffer)
  643. {
  644. acpi_handle handle = dev->data;
  645. struct acpi_resource *resource;
  646. int res_cnt = 0;
  647. acpi_status status;
  648. status = acpi_walk_resources(handle, METHOD_NAME__CRS,
  649. pnpacpi_count_resources, &res_cnt);
  650. if (ACPI_FAILURE(status)) {
  651. dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
  652. return -EINVAL;
  653. }
  654. if (!res_cnt)
  655. return -EINVAL;
  656. buffer->length = sizeof(struct acpi_resource) * (res_cnt + 1) + 1;
  657. buffer->pointer = kzalloc(buffer->length - 1, GFP_KERNEL);
  658. if (!buffer->pointer)
  659. return -ENOMEM;
  660. resource = (struct acpi_resource *)buffer->pointer;
  661. status = acpi_walk_resources(handle, METHOD_NAME__CRS,
  662. pnpacpi_type_resources, &resource);
  663. if (ACPI_FAILURE(status)) {
  664. kfree(buffer->pointer);
  665. dev_err(&dev->dev, "can't evaluate _CRS: %d\n", status);
  666. return -EINVAL;
  667. }
  668. /* resource will pointer the end resource now */
  669. resource->type = ACPI_RESOURCE_TYPE_END_TAG;
  670. return 0;
  671. }
  672. static void pnpacpi_encode_irq(struct pnp_dev *dev,
  673. struct acpi_resource *resource,
  674. struct resource *p)
  675. {
  676. struct acpi_resource_irq *irq = &resource->data.irq;
  677. int triggering, polarity;
  678. decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity);
  679. irq->triggering = triggering;
  680. irq->polarity = polarity;
  681. if (triggering == ACPI_EDGE_SENSITIVE)
  682. irq->sharable = ACPI_EXCLUSIVE;
  683. else
  684. irq->sharable = ACPI_SHARED;
  685. irq->interrupt_count = 1;
  686. irq->interrupts[0] = p->start;
  687. dev_dbg(&dev->dev, " encode irq %d %s %s %s\n", (int) p->start,
  688. triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
  689. polarity == ACPI_ACTIVE_LOW ? "low" : "high",
  690. irq->sharable == ACPI_SHARED ? "shared" : "exclusive");
  691. }
  692. static void pnpacpi_encode_ext_irq(struct pnp_dev *dev,
  693. struct acpi_resource *resource,
  694. struct resource *p)
  695. {
  696. struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq;
  697. int triggering, polarity;
  698. decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity);
  699. extended_irq->producer_consumer = ACPI_CONSUMER;
  700. extended_irq->triggering = triggering;
  701. extended_irq->polarity = polarity;
  702. if (triggering == ACPI_EDGE_SENSITIVE)
  703. extended_irq->sharable = ACPI_EXCLUSIVE;
  704. else
  705. extended_irq->sharable = ACPI_SHARED;
  706. extended_irq->interrupt_count = 1;
  707. extended_irq->interrupts[0] = p->start;
  708. dev_dbg(&dev->dev, " encode irq %d %s %s %s\n", (int) p->start,
  709. triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge",
  710. polarity == ACPI_ACTIVE_LOW ? "low" : "high",
  711. extended_irq->sharable == ACPI_SHARED ? "shared" : "exclusive");
  712. }
  713. static void pnpacpi_encode_dma(struct pnp_dev *dev,
  714. struct acpi_resource *resource,
  715. struct resource *p)
  716. {
  717. struct acpi_resource_dma *dma = &resource->data.dma;
  718. /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
  719. switch (p->flags & IORESOURCE_DMA_SPEED_MASK) {
  720. case IORESOURCE_DMA_TYPEA:
  721. dma->type = ACPI_TYPE_A;
  722. break;
  723. case IORESOURCE_DMA_TYPEB:
  724. dma->type = ACPI_TYPE_B;
  725. break;
  726. case IORESOURCE_DMA_TYPEF:
  727. dma->type = ACPI_TYPE_F;
  728. break;
  729. default:
  730. dma->type = ACPI_COMPATIBILITY;
  731. }
  732. switch (p->flags & IORESOURCE_DMA_TYPE_MASK) {
  733. case IORESOURCE_DMA_8BIT:
  734. dma->transfer = ACPI_TRANSFER_8;
  735. break;
  736. case IORESOURCE_DMA_8AND16BIT:
  737. dma->transfer = ACPI_TRANSFER_8_16;
  738. break;
  739. default:
  740. dma->transfer = ACPI_TRANSFER_16;
  741. }
  742. dma->bus_master = !!(p->flags & IORESOURCE_DMA_MASTER);
  743. dma->channel_count = 1;
  744. dma->channels[0] = p->start;
  745. dev_dbg(&dev->dev, " encode dma %d "
  746. "type %#x transfer %#x master %d\n",
  747. (int) p->start, dma->type, dma->transfer, dma->bus_master);
  748. }
  749. static void pnpacpi_encode_io(struct pnp_dev *dev,
  750. struct acpi_resource *resource,
  751. struct resource *p)
  752. {
  753. struct acpi_resource_io *io = &resource->data.io;
  754. /* Note: pnp_assign_port will copy pnp_port->flags into p->flags */
  755. io->io_decode = (p->flags & PNP_PORT_FLAG_16BITADDR) ?
  756. ACPI_DECODE_16 : ACPI_DECODE_10;
  757. io->minimum = p->start;
  758. io->maximum = p->end;
  759. io->alignment = 0; /* Correct? */
  760. io->address_length = p->end - p->start + 1;
  761. dev_dbg(&dev->dev, " encode io %#llx-%#llx decode %#x\n",
  762. (unsigned long long) p->start, (unsigned long long) p->end,
  763. io->io_decode);
  764. }
  765. static void pnpacpi_encode_fixed_io(struct pnp_dev *dev,
  766. struct acpi_resource *resource,
  767. struct resource *p)
  768. {
  769. struct acpi_resource_fixed_io *fixed_io = &resource->data.fixed_io;
  770. fixed_io->address = p->start;
  771. fixed_io->address_length = p->end - p->start + 1;
  772. dev_dbg(&dev->dev, " encode fixed_io %#llx-%#llx\n",
  773. (unsigned long long) p->start, (unsigned long long) p->end);
  774. }
  775. static void pnpacpi_encode_mem24(struct pnp_dev *dev,
  776. struct acpi_resource *resource,
  777. struct resource *p)
  778. {
  779. struct acpi_resource_memory24 *memory24 = &resource->data.memory24;
  780. /* Note: pnp_assign_mem will copy pnp_mem->flags into p->flags */
  781. memory24->write_protect =
  782. (p->flags & IORESOURCE_MEM_WRITEABLE) ?
  783. ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
  784. memory24->minimum = p->start;
  785. memory24->maximum = p->end;
  786. memory24->alignment = 0;
  787. memory24->address_length = p->end - p->start + 1;
  788. dev_dbg(&dev->dev, " encode mem24 %#llx-%#llx write_protect %#x\n",
  789. (unsigned long long) p->start, (unsigned long long) p->end,
  790. memory24->write_protect);
  791. }
  792. static void pnpacpi_encode_mem32(struct pnp_dev *dev,
  793. struct acpi_resource *resource,
  794. struct resource *p)
  795. {
  796. struct acpi_resource_memory32 *memory32 = &resource->data.memory32;
  797. memory32->write_protect =
  798. (p->flags & IORESOURCE_MEM_WRITEABLE) ?
  799. ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
  800. memory32->minimum = p->start;
  801. memory32->maximum = p->end;
  802. memory32->alignment = 0;
  803. memory32->address_length = p->end - p->start + 1;
  804. dev_dbg(&dev->dev, " encode mem32 %#llx-%#llx write_protect %#x\n",
  805. (unsigned long long) p->start, (unsigned long long) p->end,
  806. memory32->write_protect);
  807. }
  808. static void pnpacpi_encode_fixed_mem32(struct pnp_dev *dev,
  809. struct acpi_resource *resource,
  810. struct resource *p)
  811. {
  812. struct acpi_resource_fixed_memory32 *fixed_memory32 = &resource->data.fixed_memory32;
  813. fixed_memory32->write_protect =
  814. (p->flags & IORESOURCE_MEM_WRITEABLE) ?
  815. ACPI_READ_WRITE_MEMORY : ACPI_READ_ONLY_MEMORY;
  816. fixed_memory32->address = p->start;
  817. fixed_memory32->address_length = p->end - p->start + 1;
  818. dev_dbg(&dev->dev, " encode fixed_mem32 %#llx-%#llx "
  819. "write_protect %#x\n",
  820. (unsigned long long) p->start, (unsigned long long) p->end,
  821. fixed_memory32->write_protect);
  822. }
  823. int pnpacpi_encode_resources(struct pnp_dev *dev, struct acpi_buffer *buffer)
  824. {
  825. int i = 0;
  826. /* pnpacpi_build_resource_template allocates extra mem */
  827. int res_cnt = (buffer->length - 1) / sizeof(struct acpi_resource) - 1;
  828. struct acpi_resource *resource = buffer->pointer;
  829. int port = 0, irq = 0, dma = 0, mem = 0;
  830. dev_dbg(&dev->dev, "encode %d resources\n", res_cnt);
  831. while (i < res_cnt) {
  832. switch (resource->type) {
  833. case ACPI_RESOURCE_TYPE_IRQ:
  834. pnpacpi_encode_irq(dev, resource,
  835. pnp_get_resource(dev, IORESOURCE_IRQ, irq));
  836. irq++;
  837. break;
  838. case ACPI_RESOURCE_TYPE_DMA:
  839. pnpacpi_encode_dma(dev, resource,
  840. pnp_get_resource(dev, IORESOURCE_DMA, dma));
  841. dma++;
  842. break;
  843. case ACPI_RESOURCE_TYPE_IO:
  844. pnpacpi_encode_io(dev, resource,
  845. pnp_get_resource(dev, IORESOURCE_IO, port));
  846. port++;
  847. break;
  848. case ACPI_RESOURCE_TYPE_FIXED_IO:
  849. pnpacpi_encode_fixed_io(dev, resource,
  850. pnp_get_resource(dev, IORESOURCE_IO, port));
  851. port++;
  852. break;
  853. case ACPI_RESOURCE_TYPE_MEMORY24:
  854. pnpacpi_encode_mem24(dev, resource,
  855. pnp_get_resource(dev, IORESOURCE_MEM, mem));
  856. mem++;
  857. break;
  858. case ACPI_RESOURCE_TYPE_MEMORY32:
  859. pnpacpi_encode_mem32(dev, resource,
  860. pnp_get_resource(dev, IORESOURCE_MEM, mem));
  861. mem++;
  862. break;
  863. case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
  864. pnpacpi_encode_fixed_mem32(dev, resource,
  865. pnp_get_resource(dev, IORESOURCE_MEM, mem));
  866. mem++;
  867. break;
  868. case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
  869. pnpacpi_encode_ext_irq(dev, resource,
  870. pnp_get_resource(dev, IORESOURCE_IRQ, irq));
  871. irq++;
  872. break;
  873. case ACPI_RESOURCE_TYPE_START_DEPENDENT:
  874. case ACPI_RESOURCE_TYPE_END_DEPENDENT:
  875. case ACPI_RESOURCE_TYPE_VENDOR:
  876. case ACPI_RESOURCE_TYPE_END_TAG:
  877. case ACPI_RESOURCE_TYPE_ADDRESS16:
  878. case ACPI_RESOURCE_TYPE_ADDRESS32:
  879. case ACPI_RESOURCE_TYPE_ADDRESS64:
  880. case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
  881. case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
  882. default: /* other type */
  883. dev_warn(&dev->dev, "can't encode unknown resource "
  884. "type %d\n", resource->type);
  885. return -EINVAL;
  886. }
  887. resource++;
  888. i++;
  889. }
  890. return 0;
  891. }