rsparser.c 29 KB

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